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 |