project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/Downloader/DownloadListFragment.java
changeset 10017 de822cd3df3a
parent 7584 7831c84cc644
equal deleted inserted replaced
10015:4feced261c68 10017:de822cd3df3a
    41 import android.widget.AdapterView.OnItemClickListener;
    41 import android.widget.AdapterView.OnItemClickListener;
    42 import android.widget.ArrayAdapter;
    42 import android.widget.ArrayAdapter;
    43 
    43 
    44 public class DownloadListFragment extends ListFragment implements OnItemClickListener, OnScrollListener, Runnable{
    44 public class DownloadListFragment extends ListFragment implements OnItemClickListener, OnScrollListener, Runnable{
    45 
    45 
    46 	private View targetView = null;
    46     private View targetView = null;
    47 	private ArrayList<OnItemMovementListener> listeners = new ArrayList<OnItemMovementListener>(); 
    47     private ArrayList<OnItemMovementListener> listeners = new ArrayList<OnItemMovementListener>();
    48 
    48 
    49 	public void onActivityCreated(Bundle savedInstanceState){
    49     public void onActivityCreated(Bundle savedInstanceState){
    50 		super.onActivityCreated(savedInstanceState);
    50         super.onActivityCreated(savedInstanceState);
    51 
    51 
    52 		ArrayList<DownloadPackage> tasks = new ArrayList<DownloadPackage>();
    52         ArrayList<DownloadPackage> tasks = new ArrayList<DownloadPackage>();
    53 
    53 
    54 		ArrayAdapter<DownloadPackage> adapter = new ArrayAdapter<DownloadPackage>(getActivity().getApplicationContext(), android.R.layout.simple_list_item_1, tasks);
    54         ArrayAdapter<DownloadPackage> adapter = new ArrayAdapter<DownloadPackage>(getActivity().getApplicationContext(), android.R.layout.simple_list_item_1, tasks);
    55 		setListAdapter(adapter);
    55         setListAdapter(adapter);
    56 		getListView().setOnItemClickListener(this);
    56         getListView().setOnItemClickListener(this);
    57 		getListView().setOnScrollListener(this);
    57         getListView().setOnScrollListener(this);
    58 
    58 
    59 		if(getActivity() instanceof OnItemMovementListener){
    59         if(getActivity() instanceof OnItemMovementListener){
    60 			listeners.add((OnItemMovementListener)getActivity());
    60             listeners.add((OnItemMovementListener)getActivity());
    61 		}
    61         }
    62 
    62 
    63 		getListView().setCacheColorHint(Color.TRANSPARENT);//To prevent a blackish background while scrolling
    63         getListView().setCacheColorHint(Color.TRANSPARENT);//To prevent a blackish background while scrolling
    64 		
    64 
    65 		
    65 
    66 		Thread t = new Thread(this, "DownloadListParser");
    66         Thread t = new Thread(this, "DownloadListParser");
    67 		t.start();
    67         t.start();
    68 	}
    68     }
    69 
    69 
    70 	public void run(){
    70     public void run(){
    71 		XmlPullParserFactory xmlPullFactory;
    71         XmlPullParserFactory xmlPullFactory;
    72 		try {
    72         try {
    73 			xmlPullFactory = XmlPullParserFactory.newInstance();
    73             xmlPullFactory = XmlPullParserFactory.newInstance();
    74 			XmlPullParser xmlPuller = xmlPullFactory.newPullParser();
    74             XmlPullParser xmlPuller = xmlPullFactory.newPullParser();
    75 
    75 
    76 			URL url = new URL("http://www.xelification.com/tmp/downloads.xml");
    76             URL url = new URL("http://www.xelification.com/tmp/downloads.xml");
    77 			HttpURLConnection conn = (HttpURLConnection)url.openConnection();
    77             HttpURLConnection conn = (HttpURLConnection)url.openConnection();
    78 
    78 
    79 			BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()), 1024);
    79             BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()), 1024);
    80 			xmlPuller.setInput(br);
    80             xmlPuller.setInput(br);
    81 
    81 
    82 			final ArrayAdapter<DownloadPackage> adapter = (ArrayAdapter<DownloadPackage>) getListAdapter();
    82             final ArrayAdapter<DownloadPackage> adapter = (ArrayAdapter<DownloadPackage>) getListAdapter();
    83 			
    83 
    84 			int eventType = xmlPuller.getEventType();
    84             int eventType = xmlPuller.getEventType();
    85 			while(eventType != XmlPullParser.END_DOCUMENT){
    85             while(eventType != XmlPullParser.END_DOCUMENT){
    86 			
    86 
    87 				if(eventType == XmlPullParser.START_TAG){
    87                 if(eventType == XmlPullParser.START_TAG){
    88 					if(xmlPuller.getName().toLowerCase().equals("task")){
    88                     if(xmlPuller.getName().toLowerCase().equals("task")){
    89 						final DownloadPackage task = DownloadPackage.getTaskFromXML(getActivity(), xmlPuller);
    89                         final DownloadPackage task = DownloadPackage.getTaskFromXML(getActivity(), xmlPuller);
    90 						
    90 
    91 						getActivity().runOnUiThread(new Runnable(){
    91                         getActivity().runOnUiThread(new Runnable(){
    92 							public void run() {
    92                             public void run() {
    93 								adapter.add(task);								
    93                                 adapter.add(task);
    94 							}
    94                             }
    95 						});
    95                         });
    96 					}
    96                     }
    97 				}
    97                 }
    98 				eventType = getEventType(xmlPuller);
    98                 eventType = getEventType(xmlPuller);
    99 			}
    99             }
   100 			
   100 
   101 			
   101 
   102 		} catch (XmlPullParserException e) {
   102         } catch (XmlPullParserException e) {
   103 			e.printStackTrace();
   103             e.printStackTrace();
   104 		} catch (IOException e) {
   104         } catch (IOException e) {
   105 			e.printStackTrace();
   105             e.printStackTrace();
   106 		}
   106         }
   107 	}
   107     }
   108 	
   108 
   109 
   109 
   110 	/**
   110     /**
   111 	 * Skips whitespaces..
   111      * Skips whitespaces..
   112 	 */
   112      */
   113 	private static int getEventType(XmlPullParser xmlPuller)throws XmlPullParserException, IOException{
   113     private static int getEventType(XmlPullParser xmlPuller)throws XmlPullParserException, IOException{
   114 		int eventType = xmlPuller.next();
   114         int eventType = xmlPuller.next();
   115 		while(eventType == XmlPullParser.TEXT && xmlPuller.isWhitespace()){
   115         while(eventType == XmlPullParser.TEXT && xmlPuller.isWhitespace()){
   116 			eventType = xmlPuller.next();
   116             eventType = xmlPuller.next();
   117 		}
   117         }
   118 		return eventType;
   118         return eventType;
   119 	}
   119     }
   120 
   120 
   121 	public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
   121     public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
   122 		DownloadPackage task = (DownloadPackage)arg0.getAdapter().getItem(position);
   122         DownloadPackage task = (DownloadPackage)arg0.getAdapter().getItem(position);
   123 		/*
   123         /*
   124 		FragmentTransaction ft = getFragmentManager().beginTransaction();
   124         FragmentTransaction ft = getFragmentManager().beginTransaction();
   125 		Fragment prev = getFragmentManager().findFragmentByTag("dialog");
   125         Fragment prev = getFragmentManager().findFragmentByTag("dialog");
   126 
   126 
   127 		//remove any old dialogs
   127         //remove any old dialogs
   128 		if(prev != null) ft.remove(prev);
   128         if(prev != null) ft.remove(prev);
   129 		ft.addToBackStack(null);
   129         ft.addToBackStack(null);
   130 
   130 
   131 		//create a new dialog based on this task
   131         //create a new dialog based on this task
   132 		
   132 
   133 		DialogFragment newFragment = DownloadDialogFragment.newInstance(task);
   133         DialogFragment newFragment = DownloadDialogFragment.newInstance(task);
   134 
   134 
   135 		//show it
   135         //show it
   136 		newFragment.show(ft, "dialog");
   136         newFragment.show(ft, "dialog");
   137 		 */
   137          */
   138 		targetView = arg1;
   138         targetView = arg1;
   139 
   139 
   140 		//determine state
   140         //determine state
   141 		int min = arg0.getTop();
   141         int min = arg0.getTop();
   142 		int max = arg0.getBottom();
   142         int max = arg0.getBottom();
   143 		int top = targetView.getTop();
   143         int top = targetView.getTop();
   144 
   144 
   145 		previousXCoord = top;
   145         previousXCoord = top;
   146 		for(OnItemMovementListener listener : listeners){
   146         for(OnItemMovementListener listener : listeners){
   147 			listener.onNewItemSelected(task, top, min, max, targetView.getHeight()*2);
   147             listener.onNewItemSelected(task, top, min, max, targetView.getHeight()*2);
   148 		}
   148         }
   149 	}
   149     }
   150 
   150 
   151 	private int previousXCoord = 0;
   151     private int previousXCoord = 0;
   152 
   152 
   153 	/*
   153     /*
   154 	 * (non-Javadoc)
   154      * (non-Javadoc)
   155 	 * @see android.widget.AbsListView.OnScrollListener#onScroll(android.widget.AbsListView, int, int, int)
   155      * @see android.widget.AbsListView.OnScrollListener#onScroll(android.widget.AbsListView, int, int, int)
   156 	 * 
   156      *
   157 	 * Android renews the Items used in the view, so when a user scroll down the list, 
   157      * Android renews the Items used in the view, so when a user scroll down the list,
   158 	 * as soon as the item has dissapeard from the list it gets reused at the bottom.
   158      * as soon as the item has dissapeard from the list it gets reused at the bottom.
   159 	 * 
   159      *
   160 	 * For this reason we cannot just keep sending the targetView.getTop() but we must
   160      * For this reason we cannot just keep sending the targetView.getTop() but we must
   161 	 *  remember if the view is supposed to be at the top or bottom of the list. We 
   161      *  remember if the view is supposed to be at the top or bottom of the list. We
   162 	 *  remember this with int state, 
   162      *  remember this with int state,
   163 	 *     - 0 means we've got accurate reading from getTop()
   163      *     - 0 means we've got accurate reading from getTop()
   164 	 *     - -1 means it's somewhere at the top of the list
   164      *     - -1 means it's somewhere at the top of the list
   165 	 *     - 1 means it's at the bottom somewhere
   165      *     - 1 means it's at the bottom somewhere
   166 	 */
   166      */
   167 	public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
   167     public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
   168 		if(targetView != null){
   168         if(targetView != null){
   169 			int top = targetView.getTop() + (targetView.getHeight()/2);
   169             int top = targetView.getTop() + (targetView.getHeight()/2);
   170 			int min = view.getTop();
   170             int min = view.getTop();
   171 			int max = view.getBottom();
   171             int max = view.getBottom();
   172 
   172 
   173 			if(Math.abs(previousXCoord - top) > targetView.getHeight()*2 ){
   173             if(Math.abs(previousXCoord - top) > targetView.getHeight()*2 ){
   174 				top = previousXCoord;
   174                 top = previousXCoord;
   175 			}
   175             }
   176 
   176 
   177 			for(OnItemMovementListener listener : listeners){
   177             for(OnItemMovementListener listener : listeners){
   178 				listener.onViewMoved(top, min, max);
   178                 listener.onViewMoved(top, min, max);
   179 			}
   179             }
   180 
   180 
   181 			previousXCoord = top;
   181             previousXCoord = top;
   182 		}
   182         }
   183 	}
   183     }
   184 
   184 
   185 	public void onScrollStateChanged(AbsListView view, int scrollState) {
   185     public void onScrollStateChanged(AbsListView view, int scrollState) {
   186 		switch(scrollState){
   186         switch(scrollState){
   187 		case OnScrollListener.SCROLL_STATE_FLING: Log.d("tag", "fling"); break;
   187         case OnScrollListener.SCROLL_STATE_FLING: Log.d("tag", "fling"); break;
   188 		case OnScrollListener.SCROLL_STATE_IDLE:Log.d("tag", "idle"); break;
   188         case OnScrollListener.SCROLL_STATE_IDLE:Log.d("tag", "idle"); break;
   189 		case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:Log.d("tag", "scroll"); break;
   189         case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:Log.d("tag", "scroll"); break;
   190 
   190 
   191 		}
   191         }
   192 
   192 
   193 	}
   193     }
   194 }
   194 }
   195 
   195 
   196 interface OnItemMovementListener{
   196 interface OnItemMovementListener{
   197 	/**
   197     /**
   198 	 * When I new item has been selected this method will be called
   198      * When I new item has been selected this method will be called
   199 	 * @param task The task which goes with this item
   199      * @param task The task which goes with this item
   200 	 * @param x The middle of this item
   200      * @param x The middle of this item
   201 	 * @param minX The top of the parent of this item
   201      * @param minX The top of the parent of this item
   202 	 * @param maxX The bottom of the parent of this item
   202      * @param maxX The bottom of the parent of this item
   203 	 */
   203      */
   204 	void onNewItemSelected(DownloadPackage task, int x, int minX, int maxX, int size);
   204     void onNewItemSelected(DownloadPackage task, int x, int minX, int maxX, int size);
   205 
   205 
   206 	/**
   206     /**
   207 	 * When the item has been moved this method is called
   207      * When the item has been moved this method is called
   208 	 * @param x The middle of this item
   208      * @param x The middle of this item
   209 	 * @param minX The top of the parent of this item
   209      * @param minX The top of the parent of this item
   210 	 * @param maxX The bottom of the parent of this item
   210      * @param maxX The bottom of the parent of this item
   211 	 */
   211      */
   212 	void onViewMoved(int x, int minX, int maxX);
   212     void onViewMoved(int x, int minX, int maxX);
   213 }
   213 }
   214 
   214