author | Xeli |
Sat, 03 Dec 2011 18:50:29 +0100 | |
changeset 6486 | 2a3ee24764bb |
parent 6485 | 7586c266b52e |
child 7584 | 7831c84cc644 |
permissions | -rw-r--r-- |
6350 | 1 |
package org.hedgewars.hedgeroid.Downloader; |
2 |
||
3 |
import java.io.BufferedReader; |
|
4 |
import java.io.IOException; |
|
5 |
import java.io.InputStreamReader; |
|
6 |
import java.net.HttpURLConnection; |
|
7 |
import java.net.URL; |
|
8 |
import java.util.ArrayList; |
|
9 |
||
10 |
import org.xmlpull.v1.XmlPullParser; |
|
11 |
import org.xmlpull.v1.XmlPullParserException; |
|
12 |
import org.xmlpull.v1.XmlPullParserFactory; |
|
13 |
||
14 |
import android.graphics.Color; |
|
15 |
import android.os.Bundle; |
|
16 |
import android.support.v4.app.ListFragment; |
|
17 |
import android.util.Log; |
|
18 |
import android.view.View; |
|
19 |
import android.widget.AbsListView; |
|
20 |
import android.widget.AbsListView.OnScrollListener; |
|
21 |
import android.widget.AdapterView; |
|
22 |
import android.widget.AdapterView.OnItemClickListener; |
|
23 |
import android.widget.ArrayAdapter; |
|
24 |
||
25 |
public class DownloadListFragment extends ListFragment implements OnItemClickListener, OnScrollListener, Runnable{ |
|
26 |
||
27 |
private View targetView = null; |
|
28 |
private ArrayList<OnItemMovementListener> listeners = new ArrayList<OnItemMovementListener>(); |
|
29 |
||
30 |
public void onActivityCreated(Bundle savedInstanceState){ |
|
31 |
super.onActivityCreated(savedInstanceState); |
|
32 |
||
33 |
ArrayList<DownloadPackage> tasks = new ArrayList<DownloadPackage>(); |
|
34 |
||
35 |
ArrayAdapter<DownloadPackage> adapter = new ArrayAdapter<DownloadPackage>(getActivity().getApplicationContext(), android.R.layout.simple_list_item_1, tasks); |
|
36 |
setListAdapter(adapter); |
|
37 |
getListView().setOnItemClickListener(this); |
|
38 |
getListView().setOnScrollListener(this); |
|
39 |
||
40 |
if(getActivity() instanceof OnItemMovementListener){ |
|
41 |
listeners.add((OnItemMovementListener)getActivity()); |
|
42 |
} |
|
43 |
||
44 |
getListView().setCacheColorHint(Color.TRANSPARENT);//To prevent a blackish background while scrolling |
|
45 |
||
46 |
||
47 |
Thread t = new Thread(this, "DownloadListParser"); |
|
48 |
t.start(); |
|
49 |
} |
|
50 |
||
51 |
public void run(){ |
|
52 |
XmlPullParserFactory xmlPullFactory; |
|
53 |
try { |
|
54 |
xmlPullFactory = XmlPullParserFactory.newInstance(); |
|
55 |
XmlPullParser xmlPuller = xmlPullFactory.newPullParser(); |
|
56 |
||
57 |
URL url = new URL("http://www.xelification.com/tmp/downloads.xml"); |
|
58 |
HttpURLConnection conn = (HttpURLConnection)url.openConnection(); |
|
59 |
||
60 |
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()), 1024); |
|
61 |
xmlPuller.setInput(br); |
|
62 |
||
63 |
final ArrayAdapter<DownloadPackage> adapter = (ArrayAdapter<DownloadPackage>) getListAdapter(); |
|
64 |
||
65 |
int eventType = xmlPuller.getEventType(); |
|
66 |
while(eventType != XmlPullParser.END_DOCUMENT){ |
|
67 |
||
68 |
if(eventType == XmlPullParser.START_TAG){ |
|
69 |
if(xmlPuller.getName().toLowerCase().equals("task")){ |
|
70 |
final DownloadPackage task = DownloadPackage.getTaskFromXML(getActivity(), xmlPuller); |
|
71 |
||
72 |
getActivity().runOnUiThread(new Runnable(){ |
|
73 |
public void run() { |
|
74 |
adapter.add(task); |
|
75 |
} |
|
76 |
}); |
|
77 |
} |
|
78 |
} |
|
6446
a49d01b96185
android: cleaned up the code a bit and removed a bug with the parsing of the xml
Xeli
parents:
6350
diff
changeset
|
79 |
eventType = getEventType(xmlPuller); |
6350 | 80 |
} |
81 |
||
82 |
||
83 |
} catch (XmlPullParserException e) { |
|
84 |
e.printStackTrace(); |
|
85 |
} catch (IOException e) { |
|
86 |
e.printStackTrace(); |
|
87 |
} |
|
6446
a49d01b96185
android: cleaned up the code a bit and removed a bug with the parsing of the xml
Xeli
parents:
6350
diff
changeset
|
88 |
} |
a49d01b96185
android: cleaned up the code a bit and removed a bug with the parsing of the xml
Xeli
parents:
6350
diff
changeset
|
89 |
|
6350 | 90 |
|
6446
a49d01b96185
android: cleaned up the code a bit and removed a bug with the parsing of the xml
Xeli
parents:
6350
diff
changeset
|
91 |
/** |
a49d01b96185
android: cleaned up the code a bit and removed a bug with the parsing of the xml
Xeli
parents:
6350
diff
changeset
|
92 |
* Skips whitespaces.. |
a49d01b96185
android: cleaned up the code a bit and removed a bug with the parsing of the xml
Xeli
parents:
6350
diff
changeset
|
93 |
*/ |
a49d01b96185
android: cleaned up the code a bit and removed a bug with the parsing of the xml
Xeli
parents:
6350
diff
changeset
|
94 |
private static int getEventType(XmlPullParser xmlPuller)throws XmlPullParserException, IOException{ |
a49d01b96185
android: cleaned up the code a bit and removed a bug with the parsing of the xml
Xeli
parents:
6350
diff
changeset
|
95 |
int eventType = xmlPuller.next(); |
a49d01b96185
android: cleaned up the code a bit and removed a bug with the parsing of the xml
Xeli
parents:
6350
diff
changeset
|
96 |
while(eventType == XmlPullParser.TEXT && xmlPuller.isWhitespace()){ |
a49d01b96185
android: cleaned up the code a bit and removed a bug with the parsing of the xml
Xeli
parents:
6350
diff
changeset
|
97 |
eventType = xmlPuller.next(); |
a49d01b96185
android: cleaned up the code a bit and removed a bug with the parsing of the xml
Xeli
parents:
6350
diff
changeset
|
98 |
} |
a49d01b96185
android: cleaned up the code a bit and removed a bug with the parsing of the xml
Xeli
parents:
6350
diff
changeset
|
99 |
return eventType; |
6350 | 100 |
} |
101 |
||
102 |
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) { |
|
6485
7586c266b52e
android: hopefully prevents a FC, I can't reproduce it though..
Xeli
parents:
6446
diff
changeset
|
103 |
DownloadPackage task = (DownloadPackage)arg0.getAdapter().getItem(position); |
7586c266b52e
android: hopefully prevents a FC, I can't reproduce it though..
Xeli
parents:
6446
diff
changeset
|
104 |
/* |
6350 | 105 |
FragmentTransaction ft = getFragmentManager().beginTransaction(); |
106 |
Fragment prev = getFragmentManager().findFragmentByTag("dialog"); |
|
107 |
||
108 |
//remove any old dialogs |
|
109 |
if(prev != null) ft.remove(prev); |
|
110 |
ft.addToBackStack(null); |
|
111 |
||
112 |
//create a new dialog based on this task |
|
6485
7586c266b52e
android: hopefully prevents a FC, I can't reproduce it though..
Xeli
parents:
6446
diff
changeset
|
113 |
|
6350 | 114 |
DialogFragment newFragment = DownloadDialogFragment.newInstance(task); |
115 |
||
116 |
//show it |
|
6485
7586c266b52e
android: hopefully prevents a FC, I can't reproduce it though..
Xeli
parents:
6446
diff
changeset
|
117 |
newFragment.show(ft, "dialog"); |
7586c266b52e
android: hopefully prevents a FC, I can't reproduce it though..
Xeli
parents:
6446
diff
changeset
|
118 |
*/ |
6350 | 119 |
targetView = arg1; |
120 |
||
121 |
//determine state |
|
122 |
int min = arg0.getTop(); |
|
123 |
int max = arg0.getBottom(); |
|
124 |
int top = targetView.getTop(); |
|
125 |
||
126 |
previousXCoord = top; |
|
127 |
for(OnItemMovementListener listener : listeners){ |
|
128 |
listener.onNewItemSelected(task, top, min, max, targetView.getHeight()*2); |
|
129 |
} |
|
130 |
} |
|
131 |
||
132 |
private int previousXCoord = 0; |
|
133 |
||
134 |
/* |
|
135 |
* (non-Javadoc) |
|
136 |
* @see android.widget.AbsListView.OnScrollListener#onScroll(android.widget.AbsListView, int, int, int) |
|
137 |
* |
|
138 |
* Android renews the Items used in the view, so when a user scroll down the list, |
|
139 |
* as soon as the item has dissapeard from the list it gets reused at the bottom. |
|
140 |
* |
|
141 |
* For this reason we cannot just keep sending the targetView.getTop() but we must |
|
142 |
* remember if the view is supposed to be at the top or bottom of the list. We |
|
143 |
* remember this with int state, |
|
144 |
* - 0 means we've got accurate reading from getTop() |
|
145 |
* - -1 means it's somewhere at the top of the list |
|
146 |
* - 1 means it's at the bottom somewhere |
|
147 |
*/ |
|
148 |
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { |
|
149 |
if(targetView != null){ |
|
150 |
int top = targetView.getTop() + (targetView.getHeight()/2); |
|
151 |
int min = view.getTop(); |
|
152 |
int max = view.getBottom(); |
|
153 |
||
154 |
if(Math.abs(previousXCoord - top) > targetView.getHeight()*2 ){ |
|
155 |
top = previousXCoord; |
|
156 |
} |
|
157 |
||
158 |
for(OnItemMovementListener listener : listeners){ |
|
159 |
listener.onViewMoved(top, min, max); |
|
160 |
} |
|
161 |
||
162 |
previousXCoord = top; |
|
163 |
} |
|
164 |
} |
|
165 |
||
166 |
public void onScrollStateChanged(AbsListView view, int scrollState) { |
|
167 |
switch(scrollState){ |
|
168 |
case OnScrollListener.SCROLL_STATE_FLING: Log.d("tag", "fling"); break; |
|
169 |
case OnScrollListener.SCROLL_STATE_IDLE:Log.d("tag", "idle"); break; |
|
170 |
case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:Log.d("tag", "scroll"); break; |
|
171 |
||
172 |
} |
|
173 |
||
174 |
} |
|
175 |
} |
|
176 |
||
177 |
interface OnItemMovementListener{ |
|
178 |
/** |
|
179 |
* When I new item has been selected this method will be called |
|
180 |
* @param task The task which goes with this item |
|
181 |
* @param x The middle of this item |
|
182 |
* @param minX The top of the parent of this item |
|
183 |
* @param maxX The bottom of the parent of this item |
|
184 |
*/ |
|
185 |
void onNewItemSelected(DownloadPackage task, int x, int minX, int maxX, int size); |
|
186 |
||
187 |
/** |
|
188 |
* When the item has been moved this method is called |
|
189 |
* @param x The middle of this item |
|
190 |
* @param minX The top of the parent of this item |
|
191 |
* @param maxX The bottom of the parent of this item |
|
192 |
*/ |
|
193 |
void onViewMoved(int x, int minX, int maxX); |
|
194 |
} |
|
195 |