Left: | ||
Right: |
LEFT | RIGHT |
---|---|
1 package org.adblockplus.android; | 1 package org.adblockplus.android; |
2 | 2 |
3 import java.io.BufferedReader; | 3 import java.io.BufferedReader; |
4 import java.io.File; | 4 import java.io.File; |
5 import java.io.FileInputStream; | 5 import java.io.FileInputStream; |
6 import java.io.FileNotFoundException; | 6 import java.io.FileNotFoundException; |
7 import java.io.FileOutputStream; | 7 import java.io.FileOutputStream; |
8 import java.io.IOException; | 8 import java.io.IOException; |
9 import java.io.InputStreamReader; | 9 import java.io.InputStreamReader; |
10 import java.net.HttpURLConnection; | 10 import java.net.HttpURLConnection; |
(...skipping 20 matching lines...) Expand all Loading... | |
31 import org.json.JSONException; | 31 import org.json.JSONException; |
32 import org.json.JSONObject; | 32 import org.json.JSONObject; |
33 import org.xml.sax.SAXException; | 33 import org.xml.sax.SAXException; |
34 | 34 |
35 import android.app.AlarmManager; | 35 import android.app.AlarmManager; |
36 import android.app.Application; | 36 import android.app.Application; |
37 import android.app.PendingIntent; | 37 import android.app.PendingIntent; |
38 import android.content.Context; | 38 import android.content.Context; |
39 import android.content.Intent; | 39 import android.content.Intent; |
40 import android.content.SharedPreferences; | 40 import android.content.SharedPreferences; |
41 import android.content.pm.PackageInfo; | |
41 import android.content.pm.PackageManager; | 42 import android.content.pm.PackageManager; |
42 import android.content.pm.PackageManager.NameNotFoundException; | 43 import android.content.pm.PackageManager.NameNotFoundException; |
43 import android.content.res.AssetManager; | 44 import android.content.res.AssetManager; |
44 import android.net.ConnectivityManager; | 45 import android.net.ConnectivityManager; |
45 import android.net.NetworkInfo; | 46 import android.net.NetworkInfo; |
46 import android.os.AsyncTask; | 47 import android.os.AsyncTask; |
48 import android.os.Build; | |
47 import android.os.Bundle; | 49 import android.os.Bundle; |
48 import android.os.Handler; | 50 import android.os.Handler; |
49 import android.os.Message; | 51 import android.os.Message; |
50 import android.os.SystemClock; | 52 import android.os.SystemClock; |
51 import android.preference.PreferenceManager; | 53 import android.preference.PreferenceManager; |
52 import android.util.Log; | 54 import android.util.Log; |
53 import android.widget.Toast; | 55 import android.widget.Toast; |
54 | 56 |
55 public class AdblockPlus extends Application | 57 public class AdblockPlus extends Application |
56 { | 58 { |
(...skipping 15 matching lines...) Expand all Loading... | |
72 private JSThread js; | 74 private JSThread js; |
73 | 75 |
74 /** | 76 /** |
75 * Indicates interactive mode (used to listen for subscription status | 77 * Indicates interactive mode (used to listen for subscription status |
76 * changes). | 78 * changes). |
77 */ | 79 */ |
78 private boolean interactive = false; | 80 private boolean interactive = false; |
79 | 81 |
80 private boolean generateCrashReport = false; | 82 private boolean generateCrashReport = false; |
81 | 83 |
82 private static AdblockPlus myself; | 84 private static AdblockPlus instance; |
Felix Dahlke
2012/10/29 15:06:36
Nit: Isn't "instance" a more typical name for a si
Andrey Novikov
2012/10/30 07:53:22
Done.
| |
83 | 85 |
84 /** | 86 /** |
85 * Returns pointer to itself (singleton pattern). | 87 * Returns pointer to itself (singleton pattern). |
86 */ | 88 */ |
87 public static AdblockPlus getApplication() | 89 public static AdblockPlus getApplication() |
88 { | 90 { |
89 return myself; | 91 return instance; |
92 } | |
93 | |
94 public int getBuildNumber() | |
95 { | |
96 int buildNumber = -1; | |
97 try | |
98 { | |
99 PackageInfo pi = getPackageManager().getPackageInfo(getPackageName(), 0); | |
100 buildNumber = pi.versionCode; | |
101 } | |
102 catch (NameNotFoundException e) | |
103 { | |
104 // ignore - this shouldn't happen | |
105 Log.e(TAG, e.getMessage(), e); | |
106 } | |
107 return buildNumber; | |
108 } | |
109 | |
110 /** | |
111 * Returns device name in user-friendly format | |
112 */ | |
113 public static String getDeviceName() | |
114 { | |
115 String manufacturer = Build.MANUFACTURER; | |
116 String model = Build.MODEL; | |
117 if (model.startsWith(manufacturer)) | |
118 return capitalize(model); | |
119 else | |
120 return capitalize(manufacturer) + " " + model; | |
121 } | |
122 | |
123 private static String capitalize(String s) | |
124 { | |
125 if (s == null || s.length() == 0) | |
126 return ""; | |
127 char first = s.charAt(0); | |
128 if (Character.isUpperCase(first)) | |
129 return s; | |
130 else | |
131 return Character.toUpperCase(first) + s.substring(1); | |
90 } | 132 } |
91 | 133 |
92 /** | 134 /** |
93 * Checks if device has a WiFi connection available. | 135 * Checks if device has a WiFi connection available. |
94 */ | 136 */ |
95 public static boolean isWiFiConnected(Context context) | 137 public static boolean isWiFiConnected(Context context) |
96 { | 138 { |
97 ConnectivityManager connectivityManager = (ConnectivityManager) context.getS ystemService(Context.CONNECTIVITY_SERVICE); | 139 ConnectivityManager connectivityManager = (ConnectivityManager) context.getS ystemService(Context.CONNECTIVITY_SERVICE); |
98 NetworkInfo networkInfo = null; | 140 NetworkInfo networkInfo = null; |
99 if (connectivityManager != null) | 141 if (connectivityManager != null) |
(...skipping 23 matching lines...) Expand all Loading... | |
123 { | 165 { |
124 subscriptions = new ArrayList<Subscription>(); | 166 subscriptions = new ArrayList<Subscription>(); |
125 | 167 |
126 SAXParserFactory factory = SAXParserFactory.newInstance(); | 168 SAXParserFactory factory = SAXParserFactory.newInstance(); |
127 SAXParser parser; | 169 SAXParser parser; |
128 try | 170 try |
129 { | 171 { |
130 parser = factory.newSAXParser(); | 172 parser = factory.newSAXParser(); |
131 parser.parse(getAssets().open("subscriptions.xml"), new SubscriptionPars er(subscriptions)); | 173 parser.parse(getAssets().open("subscriptions.xml"), new SubscriptionPars er(subscriptions)); |
132 } | 174 } |
133 catch (ParserConfigurationException e) | 175 catch (ParserConfigurationException e) |
Felix Dahlke
2012/10/29 15:06:36
Can we log the following exceptions as an error in
Andrey Novikov
2012/10/30 07:53:22
printStackTrace does pretty much the same, I use i
Felix Dahlke
2012/10/30 08:08:42
I think Log.e() is the canonical way to log except
| |
134 { | 176 { |
135 // TODO Auto-generated catch block | 177 // TODO Auto-generated catch block |
136 e.printStackTrace(); | 178 Log.e(TAG, e.getMessage(), e); |
137 } | 179 } |
138 catch (SAXException e) | 180 catch (SAXException e) |
139 { | 181 { |
140 // TODO Auto-generated catch block | 182 // TODO Auto-generated catch block |
141 e.printStackTrace(); | 183 Log.e(TAG, e.getMessage(), e); |
142 } | 184 } |
143 catch (IOException e) | 185 catch (IOException e) |
144 { | 186 { |
145 // TODO Auto-generated catch block | 187 // TODO Auto-generated catch block |
146 e.printStackTrace(); | 188 Log.e(TAG, e.getMessage(), e); |
147 } | 189 } |
148 } | 190 } |
149 return subscriptions; | 191 return subscriptions; |
150 } | 192 } |
151 | 193 |
152 /** | 194 /** |
153 * Returns subscription information. | 195 * Returns subscription information. |
154 * | 196 * |
155 * @param url | 197 * @param url |
156 * subscription url | 198 * subscription url |
(...skipping 11 matching lines...) Expand all Loading... | |
168 } | 210 } |
169 | 211 |
170 /** | 212 /** |
171 * Adds provided subscription and removes previous subscriptions if any. | 213 * Adds provided subscription and removes previous subscriptions if any. |
172 * | 214 * |
173 * @param subscription | 215 * @param subscription |
174 * Subscription to add | 216 * Subscription to add |
175 */ | 217 */ |
176 public void setSubscription(Subscription subscription) | 218 public void setSubscription(Subscription subscription) |
177 { | 219 { |
178 /* | |
179 * Subscription test = new Subscription(); | |
Felix Dahlke
2012/10/29 15:06:36
Can we remove this commented code? It's in source
Andrey Novikov
2012/10/30 07:53:22
Done.
| |
180 * test.url = | |
181 * "https://easylist-downloads.adblockplus.org/exceptionrules.txt"; | |
182 * test.title = "Test"; | |
183 * test.homepage = "https://easylist-downloads.adblockplus.org/"; | |
184 * selectedItem = test; | |
185 */ | |
186 | |
187 if (subscription != null) | 220 if (subscription != null) |
188 { | 221 { |
189 final JSONObject jsonSub = new JSONObject(); | 222 final JSONObject jsonSub = new JSONObject(); |
190 try | 223 try |
191 { | 224 { |
192 jsonSub.put("url", subscription.url); | 225 jsonSub.put("url", subscription.url); |
193 jsonSub.put("title", subscription.title); | 226 jsonSub.put("title", subscription.title); |
194 jsonSub.put("homepage", subscription.homepage); | 227 jsonSub.put("homepage", subscription.homepage); |
195 js.execute(new Runnable() { | 228 js.execute(new Runnable() |
229 { | |
196 @Override | 230 @Override |
197 public void run() | 231 public void run() |
198 { | 232 { |
199 js.evaluate("clearSubscriptions()"); | 233 js.evaluate("clearSubscriptions()"); |
200 js.evaluate("addSubscription(\"" + StringEscapeUtils.escapeJavaScrip t(jsonSub.toString()) + "\")"); | 234 js.evaluate("addSubscription(\"" + StringEscapeUtils.escapeJavaScrip t(jsonSub.toString()) + "\")"); |
201 } | 235 } |
202 }); | 236 }); |
203 } | 237 } |
204 catch (JSONException e) | 238 catch (JSONException e) |
205 { | 239 { |
206 // TODO Auto-generated catch block | 240 // TODO Auto-generated catch block |
Felix Dahlke
2012/10/29 15:06:36
Can we log this exception as an error instead of u
Andrey Novikov
2012/10/30 09:24:17
Done.
| |
207 e.printStackTrace(); | 241 Log.e(TAG, e.getMessage(), e); |
208 } | 242 } |
209 } | 243 } |
210 } | 244 } |
211 | 245 |
212 /** | 246 /** |
213 * Forces subscriptions refresh. | 247 * Forces subscriptions refresh. |
214 */ | 248 */ |
215 public void refreshSubscription() | 249 public void refreshSubscription() |
216 { | 250 { |
217 js.execute(new Runnable() { | 251 js.execute(new Runnable() |
252 { | |
218 @Override | 253 @Override |
219 public void run() | 254 public void run() |
220 { | 255 { |
221 js.evaluate("refreshSubscriptions()"); | 256 js.evaluate("refreshSubscriptions()"); |
222 } | 257 } |
223 }); | 258 }); |
224 } | 259 } |
225 | 260 |
226 /** | 261 /** |
227 * Selects which subscription to offer for the first time. | 262 * Selects which subscription to offer for the first time. |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
268 } | 303 } |
269 | 304 |
270 /** | 305 /** |
271 * Verifies that subscriptions are loaded and returns flag of subscription | 306 * Verifies that subscriptions are loaded and returns flag of subscription |
272 * presence. | 307 * presence. |
273 * | 308 * |
274 * @return true if at least one subscription is present and downloaded | 309 * @return true if at least one subscription is present and downloaded |
275 */ | 310 */ |
276 public boolean verifySubscriptions() | 311 public boolean verifySubscriptions() |
277 { | 312 { |
278 Future<Boolean> future = js.submit(new Callable<Boolean>() { | 313 Future<Boolean> future = js.submit(new Callable<Boolean>() |
314 { | |
279 @Override | 315 @Override |
280 public Boolean call() throws Exception | 316 public Boolean call() throws Exception |
281 { | 317 { |
282 Boolean result = (Boolean) js.evaluate("verifySubscriptions()"); | 318 Boolean result = (Boolean) js.evaluate("verifySubscriptions()"); |
283 return result; | 319 return result; |
284 } | 320 } |
285 }); | 321 }); |
286 try | 322 try |
287 { | 323 { |
288 return future.get().booleanValue(); | 324 return future.get().booleanValue(); |
289 } | 325 } |
290 catch (InterruptedException e) | 326 catch (InterruptedException e) |
291 { | 327 { |
292 // TODO Auto-generated catch block | 328 // TODO Auto-generated catch block |
Felix Dahlke
2012/10/29 15:06:36
Like above, log an error instead?
Andrey Novikov
2012/10/30 09:24:17
Done.
| |
293 e.printStackTrace(); | 329 Log.e(TAG, e.getMessage(), e); |
294 } | 330 } |
295 catch (ExecutionException e) | 331 catch (ExecutionException e) |
296 { | 332 { |
297 // TODO Auto-generated catch block | 333 // TODO Auto-generated catch block |
298 e.printStackTrace(); | 334 Log.e(TAG, e.getMessage(), e); |
299 } | 335 } |
300 return false; | 336 return false; |
301 } | 337 } |
302 | 338 |
303 /** | 339 /** |
304 * Returns ElemHide selectors for domain. | 340 * Returns ElemHide selectors for domain. |
305 * | 341 * |
306 * @return ready to use HTML element with CSS selectors | 342 * @return ready to use HTML element with CSS selectors |
307 */ | 343 */ |
308 public String getSelectorsForDomain(final String domain) | 344 public String getSelectorsForDomain(final String domain) |
309 { | 345 { |
310 Future<String> future = js.submit(new Callable<String>() { | 346 Future<String> future = js.submit(new Callable<String>() |
Felix Dahlke
2012/10/29 15:06:36
Is the future really necessary here? It seems you
Andrey Novikov
2012/10/30 07:53:22
No, I can't. JS runs in separate asynchronous thre
Felix Dahlke
2012/10/30 08:08:42
Oh, I see.
| |
347 { | |
311 @Override | 348 @Override |
312 public String call() throws Exception | 349 public String call() throws Exception |
313 { | 350 { |
314 String result = (String) js.evaluate("ElemHide.getSelectorsForDomain('" + domain + "')"); | 351 String result = (String) js.evaluate("ElemHide.getSelectorsForDomain('" + domain + "')"); |
315 return result; | 352 return result; |
316 } | 353 } |
317 }); | 354 }); |
318 try | 355 try |
319 { | 356 { |
320 return future.get(); | 357 return future.get(); |
321 } | 358 } |
322 catch (InterruptedException e) | 359 catch (InterruptedException e) |
323 { | 360 { |
324 // TODO Auto-generated catch block | 361 // TODO Auto-generated catch block |
Felix Dahlke
2012/10/29 15:06:36
Like above, error logging.
Andrey Novikov
2012/10/30 09:24:17
Done.
| |
325 e.printStackTrace(); | 362 Log.e(TAG, e.getMessage(), e); |
326 } | 363 } |
327 catch (ExecutionException e) | 364 catch (ExecutionException e) |
328 { | 365 { |
329 // TODO Auto-generated catch block | 366 // TODO Auto-generated catch block |
330 e.printStackTrace(); | 367 Log.e(TAG, e.getMessage(), e); |
331 } | 368 } |
332 return null; | 369 return null; |
333 } | 370 } |
334 | 371 |
335 private class MatchesCallable implements Callable<Boolean> | 372 private class MatchesCallable implements Callable<Boolean> |
336 { | 373 { |
337 private String url; | 374 private String url; |
338 private String query; | 375 private String query; |
339 private String reqHost; | 376 private String reqHost; |
340 private String refHost; | 377 private String refHost; |
341 private String accept; | 378 private String accept; |
342 | 379 |
343 MatchesCallable(String url, String query, String reqHost, String refHost, St ring accept) | 380 MatchesCallable(String url, String query, String reqHost, String refHost, St ring accept) |
344 { | 381 { |
345 this.url = url; | 382 this.url = url; |
346 this.query = query; | 383 this.query = query; |
347 this.reqHost = reqHost != null ? reqHost : ""; | 384 this.reqHost = reqHost != null ? reqHost : ""; |
348 this.refHost = refHost != null ? refHost : ""; | 385 this.refHost = refHost != null ? refHost : ""; |
349 this.accept = accept != null ? accept : ""; | 386 this.accept = accept != null ? accept : ""; |
350 } | 387 } |
351 | 388 |
352 @Override | 389 @Override |
353 public Boolean call() throws Exception | 390 public Boolean call() throws Exception |
354 { | 391 { |
355 Boolean result = (Boolean) js.evaluate("matchesAny('" + url + "', '" + que ry + "', '" + reqHost + "', '" + refHost + "', '" + accept + "');"); | 392 Boolean result = (Boolean) js.evaluate("matchesAny('" + url + "', '" + que ry + "', '" + reqHost + "', '" + refHost + "', '" + accept + "');"); |
Felix Dahlke
2012/10/29 15:06:36
Nit: You could just return this directly
Andrey Novikov
2012/10/30 07:53:22
See above.
| |
356 return result; | 393 return result; |
357 } | 394 } |
358 } | 395 } |
359 | 396 |
360 /** | 397 /** |
361 * Checks if filters match request parameters. | 398 * Checks if filters match request parameters. |
362 * | 399 * |
363 * @param url | 400 * @param url |
364 * Request URL | 401 * Request URL |
365 * @param query | 402 * @param query |
(...skipping 14 matching lines...) Expand all Loading... | |
380 boolean matches = future.get().booleanValue(); | 417 boolean matches = future.get().booleanValue(); |
381 sendBroadcast(new Intent(BROADCAST_FILTER_MATCHES).putExtra("url", url).putE xtra("matches", matches)); | 418 sendBroadcast(new Intent(BROADCAST_FILTER_MATCHES).putExtra("url", url).putE xtra("matches", matches)); |
382 return matches; | 419 return matches; |
383 } | 420 } |
384 | 421 |
385 /** | 422 /** |
386 * Notifies JS code that application entered interactive mode. | 423 * Notifies JS code that application entered interactive mode. |
387 */ | 424 */ |
388 public void startInteractive() | 425 public void startInteractive() |
389 { | 426 { |
390 js.execute(new Runnable() { | 427 js.execute(new Runnable() |
428 { | |
391 @Override | 429 @Override |
392 public void run() | 430 public void run() |
393 { | 431 { |
394 js.evaluate("startInteractive()"); | 432 js.evaluate("startInteractive()"); |
395 } | 433 } |
396 }); | 434 }); |
397 interactive = true; | 435 interactive = true; |
398 } | 436 } |
399 | 437 |
400 /** | 438 /** |
401 * Notifies JS code that application quit interactive mode. | 439 * Notifies JS code that application quit interactive mode. |
402 */ | 440 */ |
403 public void stopInteractive() | 441 public void stopInteractive() |
404 { | 442 { |
405 js.execute(new Runnable() { | 443 js.execute(new Runnable() |
444 { | |
406 @Override | 445 @Override |
407 public void run() | 446 public void run() |
408 { | 447 { |
409 js.evaluate("stopInteractive()"); | 448 js.evaluate("stopInteractive()"); |
410 } | 449 } |
411 }); | 450 }); |
412 interactive = false; | 451 interactive = false; |
413 } | 452 } |
414 | 453 |
415 /** | 454 /** |
(...skipping 14 matching lines...) Expand all Loading... | |
430 } | 469 } |
431 | 470 |
432 /** | 471 /** |
433 * Starts JS engine. It also initiates subscription refresh if it is enabled | 472 * Starts JS engine. It also initiates subscription refresh if it is enabled |
434 * in user settings. | 473 * in user settings. |
435 */ | 474 */ |
436 public void startEngine() | 475 public void startEngine() |
437 { | 476 { |
438 if (js == null) | 477 if (js == null) |
439 { | 478 { |
440 Log.e(TAG, "startEngine"); | 479 Log.i(TAG, "startEngine"); |
Felix Dahlke
2012/10/29 15:06:36
Shouldn't this be Log.d()?
Andrey Novikov
2012/10/30 07:53:22
I use logging not only for error reporting but als
Felix Dahlke
2012/10/30 08:08:42
That's fine for debugging of course, but I think w
Andrey Novikov
2012/10/30 09:24:17
Done.
| |
441 js = new JSThread(this); | 480 js = new JSThread(this); |
442 js.start(); | 481 js.start(); |
443 | 482 |
444 final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferen ces(this); | 483 final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferen ces(this); |
445 final int refresh = Integer.valueOf(prefs.getString(getString(R.string.pre f_refresh), Integer.toString(getResources().getInteger(R.integer.def_refresh)))) ; | 484 final int refresh = Integer.valueOf(prefs.getString(getString(R.string.pre f_refresh), Integer.toString(getResources().getInteger(R.integer.def_refresh)))) ; |
Felix Dahlke
2012/10/29 15:06:36
We should use a fixed string for storing these pre
Andrey Novikov
2012/10/30 07:53:22
These are not locale dependent. Locale dependent s
Felix Dahlke
2012/10/30 08:08:42
The string "pref_refresh" is "Subscription refresh
Andrey Novikov
2012/10/30 09:24:17
No, the string pref_refresh is "refresh", and what
Felix Dahlke
2012/10/30 09:30:50
True, repeated string literals aren't great. How a
| |
446 final boolean wifionly = prefs.getBoolean(getString(R.string.pref_wifirefr esh), getResources().getBoolean(R.bool.def_wifirefresh)); | 485 final boolean wifionly = prefs.getBoolean(getString(R.string.pref_wifirefr esh), getResources().getBoolean(R.bool.def_wifirefresh)); |
447 // Refresh if user selected refresh on each start | 486 // Refresh if user selected refresh on each start |
448 if (refresh == 1 && (!wifionly || isWiFiConnected(this))) | 487 if (refresh == 1 && (!wifionly || isWiFiConnected(this))) |
449 { | 488 { |
450 refreshSubscription(); | 489 refreshSubscription(); |
451 } | 490 } |
452 } | 491 } |
453 } | 492 } |
454 | 493 |
455 /** | 494 /** |
456 * Stops JS engine. | 495 * Stops JS engine. |
457 * | 496 * |
458 * @param implicitly | 497 * @param implicitly |
459 * stop even in interactive mode | 498 * stop even in interactive mode |
460 */ | 499 */ |
461 public void stopEngine(boolean implicitly) | 500 public void stopEngine(boolean implicitly) |
462 { | 501 { |
463 if ((implicitly || !interactive) && js != null) | 502 if ((implicitly || !interactive) && js != null) |
464 { | 503 { |
465 js.stopEngine(); | 504 js.stopEngine(); |
466 try | 505 try |
467 { | 506 { |
468 js.join(); | 507 js.join(); |
469 } | 508 } |
470 catch (InterruptedException e) | 509 catch (InterruptedException e) |
471 { | 510 { |
472 e.printStackTrace(); | 511 Log.e(TAG, e.getMessage(), e); |
Felix Dahlke
2012/10/29 15:06:36
As before, error logging?
Andrey Novikov
2012/10/30 09:24:17
Done.
| |
473 } | 512 } |
474 js = null; | 513 js = null; |
475 } | 514 } |
476 } | 515 } |
477 | 516 |
478 /** | 517 /** |
479 * Sets or removes crash handler according to user setting | 518 * Sets or removes crash handler according to user setting |
480 */ | 519 */ |
481 public void updateCrashReportStatus() | 520 public void updateCrashReportStatus() |
482 { | 521 { |
(...skipping 15 matching lines...) Expand all Loading... | |
498 catch (ClassCastException e) | 537 catch (ClassCastException e) |
499 { | 538 { |
500 // ignore - already default handler | 539 // ignore - already default handler |
501 } | 540 } |
502 } | 541 } |
503 generateCrashReport = report; | 542 generateCrashReport = report; |
504 } | 543 } |
505 } | 544 } |
506 | 545 |
507 /** | 546 /** |
508 * Sets Alarm to call updater after specified number of minutes or after one d ay if | 547 * Sets Alarm to call updater after specified number of minutes or after one |
548 * day if | |
509 * minutes are set to 0. | 549 * minutes are set to 0. |
510 * | 550 * |
511 * @param minutes | 551 * @param minutes |
512 * number of minutes to wait | 552 * number of minutes to wait |
513 */ | 553 */ |
514 public void scheduleUpdater(int minutes) | 554 public void scheduleUpdater(int minutes) |
515 { | 555 { |
516 Calendar updateTime = Calendar.getInstance(); | 556 Calendar updateTime = Calendar.getInstance(); |
517 | 557 |
518 if (minutes == 0) | 558 if (minutes == 0) |
519 { | 559 { |
520 // Start update checks at 10:00 GMT... | 560 // Start update checks at 10:00 GMT... |
521 updateTime.setTimeZone(TimeZone.getTimeZone("GMT")); | 561 updateTime.setTimeZone(TimeZone.getTimeZone("GMT")); |
522 updateTime.set(Calendar.HOUR_OF_DAY, 10); | 562 updateTime.set(Calendar.HOUR_OF_DAY, 10); |
523 updateTime.set(Calendar.MINUTE, 0); | 563 updateTime.set(Calendar.MINUTE, 0); |
524 // ...next day | 564 // ...next day |
525 updateTime.add(Calendar.HOUR_OF_DAY, 24); | 565 updateTime.add(Calendar.HOUR_OF_DAY, 24); |
526 // Spread out the “mass downloading” for 6 hours | 566 // Spread out the “mass downloading” for 6 hours |
527 updateTime.add(Calendar.MINUTE, (int) Math.random() * 60 * 6); | 567 updateTime.add(Calendar.MINUTE, (int) Math.random() * 60 * 6); |
528 } | 568 } |
529 else | 569 else |
530 { | 570 { |
531 updateTime.add(Calendar.MINUTE, minutes); | 571 updateTime.add(Calendar.MINUTE, minutes); |
532 } | 572 } |
533 | 573 |
534 Intent updater = new Intent(this, AlarmReceiver.class); | 574 Intent updater = new Intent(this, AlarmReceiver.class); |
535 PendingIntent recurringUpdate = PendingIntent.getBroadcast(this, 0, updater, PendingIntent.FLAG_CANCEL_CURRENT); | 575 PendingIntent recurringUpdate = PendingIntent.getBroadcast(this, 0, updater, PendingIntent.FLAG_CANCEL_CURRENT); |
536 // Set non-waking alarm | 576 // Set non-waking alarm |
537 AlarmManager alarms = (AlarmManager) getSystemService(Context.ALARM_SERVICE) ; | 577 AlarmManager alarms = (AlarmManager) getSystemService(Context.ALARM_SERVICE) ; |
538 Log.e(TAG, "Set updater alarm"); | |
Felix Dahlke
2012/10/29 15:06:36
I guess Log.d() is more appropriate here?
Andrey Novikov
2012/10/30 09:24:17
Done.
| |
539 alarms.set(AlarmManager.RTC, updateTime.getTimeInMillis(), recurringUpdate); | 578 alarms.set(AlarmManager.RTC, updateTime.getTimeInMillis(), recurringUpdate); |
540 } | 579 } |
541 | 580 |
542 @Override | 581 @Override |
543 public void onCreate() | 582 public void onCreate() |
544 { | 583 { |
545 super.onCreate(); | 584 super.onCreate(); |
546 myself = this; | 585 instance = this; |
547 | 586 |
548 // Check for crash report | 587 // Check for crash report |
549 try | 588 try |
550 { | 589 { |
551 InputStreamReader reportFile = new InputStreamReader(openFileInput(CrashHa ndler.REPORT_FILE)); | 590 InputStreamReader reportFile = new InputStreamReader(openFileInput(CrashHa ndler.REPORT_FILE)); |
552 final char[] buffer = new char[0x1000]; | 591 final char[] buffer = new char[0x1000]; |
553 StringBuilder out = new StringBuilder(); | 592 StringBuilder out = new StringBuilder(); |
554 int read; | 593 int read; |
555 do | 594 do |
556 { | 595 { |
(...skipping 10 matching lines...) Expand all Loading... | |
567 intent.putExtra("report", report); | 606 intent.putExtra("report", report); |
568 startActivity(intent); | 607 startActivity(intent); |
569 } | 608 } |
570 } | 609 } |
571 catch (FileNotFoundException e) | 610 catch (FileNotFoundException e) |
572 { | 611 { |
573 // ignore | 612 // ignore |
574 } | 613 } |
575 catch (IOException e) | 614 catch (IOException e) |
576 { | 615 { |
577 // TODO Auto-generated catch block | 616 // TODO Auto-generated catch block |
Felix Dahlke
2012/10/29 15:06:36
Log.e()?
Andrey Novikov
2012/10/30 09:24:17
Done.
| |
578 e.printStackTrace(); | 617 Log.e(TAG, e.getMessage(), e); |
579 } | 618 } |
580 | 619 |
581 if (!getResources().getBoolean(R.bool.def_release)) | 620 if (!getResources().getBoolean(R.bool.def_release)) |
582 { | 621 { |
583 // Set crash handler | 622 // Set crash handler |
584 updateCrashReportStatus(); | 623 updateCrashReportStatus(); |
585 // Initiate update check | 624 // Initiate update check |
586 scheduleUpdater(0); | 625 scheduleUpdater(0); |
587 } | 626 } |
588 } | 627 } |
589 | 628 |
590 /** | 629 /** |
591 * Handler for showing toast messages from JS code. | 630 * Handler for showing toast messages from JS code. |
592 */ | 631 */ |
593 private final Handler messageHandler = new Handler() { | 632 private static final Handler messageHandler = new Handler() |
633 { | |
594 public void handleMessage(Message msg) | 634 public void handleMessage(Message msg) |
595 { | 635 { |
596 if (msg.what == MSG_TOAST) | 636 if (msg.what == MSG_TOAST) |
597 { | 637 { |
598 Toast.makeText(AdblockPlus.this, msg.getData().getString("message"), Toa st.LENGTH_LONG).show(); | 638 Toast.makeText(AdblockPlus.getApplication(), msg.getData().getString("me ssage"), Toast.LENGTH_LONG).show(); |
599 } | 639 } |
600 } | 640 } |
601 }; | 641 }; |
602 | 642 |
603 /** | 643 /** |
604 * JS execution thread. | 644 * JS execution thread. |
605 */ | 645 */ |
606 private final class JSThread extends Thread | 646 private final class JSThread extends Thread |
607 { | 647 { |
608 private JSEngine jsEngine; | 648 private JSEngine jsEngine; |
(...skipping 23 matching lines...) Expand all Loading... | |
632 { | 672 { |
633 read = reader.read(buffer, 0, buffer.length); | 673 read = reader.read(buffer, 0, buffer.length); |
634 if (read > 0) | 674 if (read > 0) |
635 out.append(buffer, 0, read); | 675 out.append(buffer, 0, read); |
636 } | 676 } |
637 while (read >= 0); | 677 while (read >= 0); |
638 result = out.toString(); | 678 result = out.toString(); |
639 } | 679 } |
640 catch (IOException e) | 680 catch (IOException e) |
641 { | 681 { |
642 e.printStackTrace(); | 682 Log.e(TAG, e.getMessage(), e); |
Felix Dahlke
2012/10/29 15:06:36
Log.e()?
Andrey Novikov
2012/10/30 09:24:17
Done.
| |
643 } | 683 } |
644 return result; | 684 return result; |
645 } | 685 } |
646 | 686 |
647 // JS helper | 687 // JS helper |
648 public FileInputStream getInputStream(String path) | 688 public FileInputStream getInputStream(String path) |
649 { | 689 { |
650 Log.e(TAG, path); | 690 Log.d(TAG, path); |
Felix Dahlke
2012/10/29 15:06:36
Log.d()?
Andrey Novikov
2012/10/30 09:24:17
Done.
| |
651 File f = new File(path); | 691 File f = new File(path); |
652 try | 692 try |
653 { | 693 { |
654 return openFileInput(f.getName()); | 694 return openFileInput(f.getName()); |
655 } | 695 } |
656 catch (FileNotFoundException e) | 696 catch (FileNotFoundException e) |
657 { | 697 { |
658 e.printStackTrace(); | 698 Log.e(TAG, e.getMessage(), e); |
Felix Dahlke
2012/10/29 15:06:36
Log.e()?
Andrey Novikov
2012/10/30 09:24:17
Done.
| |
659 } | 699 } |
660 return null; | 700 return null; |
661 } | 701 } |
662 | 702 |
663 // JS helper | 703 // JS helper |
664 public FileOutputStream getOutputStream(String path) | 704 public FileOutputStream getOutputStream(String path) |
665 { | 705 { |
666 Log.e(TAG, path); | 706 Log.d(TAG, path); |
Felix Dahlke
2012/10/29 15:06:36
Log.d()?
Andrey Novikov
2012/10/30 09:24:17
Done.
| |
667 File f = new File(path); | 707 File f = new File(path); |
668 try | 708 try |
669 { | 709 { |
670 return openFileOutput(f.getName(), MODE_PRIVATE); | 710 return openFileOutput(f.getName(), MODE_PRIVATE); |
671 } | 711 } |
672 catch (FileNotFoundException e) | 712 catch (FileNotFoundException e) |
673 { | 713 { |
674 e.printStackTrace(); | 714 Log.e(TAG, e.getMessage(), e); |
Felix Dahlke
2012/10/29 15:06:36
Log.e()?
Andrey Novikov
2012/10/30 09:24:17
Done.
| |
675 } | 715 } |
676 return null; | 716 return null; |
677 } | 717 } |
678 | 718 |
679 // JS helper | 719 // JS helper |
680 public String getVersion() | 720 public String getVersion() |
681 { | 721 { |
682 String versionName = null; | 722 String versionName = null; |
683 try | 723 try |
684 { | 724 { |
(...skipping 13 matching lines...) Expand all Loading... | |
698 final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferen ces(context); | 738 final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferen ces(context); |
699 final int refresh = Integer.valueOf(prefs.getString(getString(R.string.pre f_refresh), Integer.toString(context.getResources().getInteger(R.integer.def_ref resh)))); | 739 final int refresh = Integer.valueOf(prefs.getString(getString(R.string.pre f_refresh), Integer.toString(context.getResources().getInteger(R.integer.def_ref resh)))); |
700 final boolean wifionly = prefs.getBoolean(getString(R.string.pref_wifirefr esh), getResources().getBoolean(R.bool.def_wifirefresh)); | 740 final boolean wifionly = prefs.getBoolean(getString(R.string.pref_wifirefr esh), getResources().getBoolean(R.bool.def_wifirefresh)); |
701 return refresh == 2 && (!wifionly || isWiFiConnected(context)); | 741 return refresh == 2 && (!wifionly || isWiFiConnected(context)); |
702 } | 742 } |
703 | 743 |
704 // JS helper | 744 // JS helper |
705 @SuppressWarnings("unused") | 745 @SuppressWarnings("unused") |
706 public void httpSend(final String method, final String url, final String[][] headers, final boolean async, final long callback) | 746 public void httpSend(final String method, final String url, final String[][] headers, final boolean async, final long callback) |
707 { | 747 { |
708 Log.e(TAG, "httpSend('" + method + "', '" + url + "')"); | 748 Log.d(TAG, "httpSend('" + method + "', '" + url + "')"); |
Felix Dahlke
2012/10/29 15:06:36
Log.d()?
Andrey Novikov
2012/10/30 09:24:17
Done.
| |
709 messageHandler.post(new Runnable() { | 749 messageHandler.post(new Runnable() |
750 { | |
710 @Override | 751 @Override |
711 public void run() | 752 public void run() |
712 { | 753 { |
713 try | 754 try |
714 { | 755 { |
715 Task task = new Task(); | 756 Task task = new Task(); |
716 task.callback = callback; | 757 task.callback = callback; |
717 task.connection = (HttpURLConnection) new URL(url).openConnection(); | 758 task.connection = (HttpURLConnection) new URL(url).openConnection(); |
718 task.connection.setRequestMethod(method); | 759 task.connection.setRequestMethod(method); |
719 for (int i = 0; i < headers.length; i++) | 760 for (int i = 0; i < headers.length; i++) |
720 { | 761 { |
721 task.connection.setRequestProperty(headers[i][0], headers[i][1]); | 762 task.connection.setRequestProperty(headers[i][0], headers[i][1]); |
722 } | 763 } |
723 DownloadTask downloadTask = new DownloadTask(context); | 764 DownloadTask downloadTask = new DownloadTask(context); |
724 downloadTask.execute(task); | 765 downloadTask.execute(task); |
725 if (!async) | 766 if (!async) |
726 { | 767 { |
727 downloadTask.get(); | 768 downloadTask.get(); |
728 } | 769 } |
729 } | 770 } |
730 catch (Exception e) | 771 catch (Exception e) |
731 { | 772 { |
732 e.printStackTrace(); | 773 Log.e(TAG, e.getMessage(), e); |
733 js.callback(callback, null); | 774 js.callback(callback, null); |
734 } | 775 } |
735 } | 776 } |
736 }); | 777 }); |
737 } | 778 } |
738 | 779 |
739 // JS helper | 780 // JS helper |
740 @SuppressWarnings("unused") | 781 @SuppressWarnings("unused") |
Felix Dahlke
2012/10/29 15:06:36
I don't think this is necessary
Andrey Novikov
2012/10/30 07:53:22
This is necessary because Eclipse highlights all w
Felix Dahlke
2012/10/30 08:08:42
I know what it's for, but I can't see any unused v
Andrey Novikov
2012/10/30 09:24:17
It's not about variables but about the method itse
Felix Dahlke
2012/10/30 09:30:50
Ah, I see. You only need that code for debugging?
Andrey Novikov
2012/10/30 09:45:28
No, it's called by JS engine from native code, tha
| |
741 public void setStatus(String text, long time) | 782 public void setStatus(String text, long time) |
742 { | 783 { |
743 sendBroadcast(new Intent(BROADCAST_SUBSCRIPTION_STATUS).putExtra("text", t ext).putExtra("time", time)); | 784 sendBroadcast(new Intent(BROADCAST_SUBSCRIPTION_STATUS).putExtra("text", t ext).putExtra("time", time)); |
744 } | 785 } |
745 | 786 |
746 // JS helper | 787 // JS helper |
747 @SuppressWarnings("unused") | 788 @SuppressWarnings("unused") |
Felix Dahlke
2012/10/29 15:06:36
I don't think this is necessary
| |
748 public void showToast(String text) | 789 public void showToast(String text) |
749 { | 790 { |
750 Log.e(TAG, "Toast: " + text); | 791 Log.d(TAG, "Toast: " + text); |
751 Message msg = messageHandler.obtainMessage(MSG_TOAST); | 792 Message msg = messageHandler.obtainMessage(MSG_TOAST); |
Felix Dahlke
2012/10/29 15:06:36
Log.d()?
Andrey Novikov
2012/10/30 09:24:17
Done.
| |
752 Bundle data = new Bundle(); | 793 Bundle data = new Bundle(); |
753 data.putString("message", text); | 794 data.putString("message", text); |
754 msg.setData(data); | 795 msg.setData(data); |
755 messageHandler.sendMessage(msg); | 796 messageHandler.sendMessage(msg); |
756 } | 797 } |
757 | 798 |
758 // JS helper | 799 // JS helper |
759 @SuppressWarnings("unused") | 800 @SuppressWarnings("unused") |
Felix Dahlke
2012/10/29 15:06:36
I don't think this is necessary
| |
760 public void notify(long delay) | 801 public void notify(long delay) |
761 { | 802 { |
762 if (this.delay < 0 || delay < this.delay) | 803 if (this.delay < 0 || delay < this.delay) |
763 { | 804 { |
764 this.delay = delay; | 805 this.delay = delay; |
765 synchronized (queue) | 806 synchronized (queue) |
766 { | 807 { |
767 queue.notify(); | 808 queue.notify(); |
768 } | 809 } |
769 } | 810 } |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
813 jsEngine.put("_datapath", getFilesDir().getAbsolutePath()); | 854 jsEngine.put("_datapath", getFilesDir().getAbsolutePath()); |
814 jsEngine.put("_separator", File.separator); | 855 jsEngine.put("_separator", File.separator); |
815 jsEngine.put("_version", getVersion()); | 856 jsEngine.put("_version", getVersion()); |
816 | 857 |
817 try | 858 try |
818 { | 859 { |
819 jsEngine.evaluate("Android.load(\"start.js\");"); | 860 jsEngine.evaluate("Android.load(\"start.js\");"); |
820 } | 861 } |
821 catch (Exception e) | 862 catch (Exception e) |
822 { | 863 { |
823 e.printStackTrace(); | 864 Log.e(TAG, e.getMessage(), e); |
Felix Dahlke
2012/10/29 15:06:36
Log.e()?
Andrey Novikov
2012/10/30 09:24:17
Done.
| |
824 } | 865 } |
825 | 866 |
826 while (run) | 867 while (run) |
827 { | 868 { |
828 try | 869 try |
829 { | 870 { |
830 Runnable r = null; | 871 Runnable r = null; |
831 synchronized (queue) | 872 synchronized (queue) |
832 { | 873 { |
833 r = queue.poll(); | 874 r = queue.poll(); |
834 } | 875 } |
835 if (r != null) | 876 if (r != null) |
836 { | 877 { |
837 r.run(); | 878 r.run(); |
838 } | 879 } |
839 else if (delay > 0) | 880 else if (delay > 0) |
840 { | 881 { |
841 long t = SystemClock.uptimeMillis(); | 882 long t = SystemClock.uptimeMillis(); |
842 synchronized (queue) | 883 synchronized (queue) |
843 { | 884 { |
844 try | 885 try |
845 { | 886 { |
846 queue.wait(delay); | 887 queue.wait(delay); |
847 } | 888 } |
848 catch (InterruptedException e) | 889 catch (InterruptedException e) |
849 { | 890 { |
Felix Dahlke
2012/10/29 15:06:36
Log.e()?
Andrey Novikov
2012/10/30 09:24:17
Done.
| |
850 } | 891 } |
851 } | 892 } |
852 delay -= SystemClock.uptimeMillis() - t; | 893 delay -= SystemClock.uptimeMillis() - t; |
853 } | 894 } |
854 else if (delay <= 0) | 895 else if (delay <= 0) |
855 { | 896 { |
856 delay = jsEngine.runCallbacks(); | 897 delay = jsEngine.runCallbacks(); |
857 } | 898 } |
858 else | 899 else |
859 { | 900 { |
860 synchronized (queue) | 901 synchronized (queue) |
861 { | 902 { |
862 try | 903 try |
863 { | 904 { |
864 queue.wait(); | 905 queue.wait(); |
865 } | 906 } |
866 catch (InterruptedException e) | 907 catch (InterruptedException e) |
867 { | 908 { |
Felix Dahlke
2012/10/29 15:06:36
Log.e()?
Andrey Novikov
2012/10/30 09:24:17
Done.
| |
909 Log.e(TAG, e.getMessage(), e); | |
868 } | 910 } |
869 } | 911 } |
870 } | 912 } |
871 } | 913 } |
872 catch (Exception e) | 914 catch (Exception e) |
873 { | 915 { |
874 e.printStackTrace(); | 916 Log.e(TAG, e.getMessage(), e); |
Felix Dahlke
2012/10/29 15:06:36
Log.e()?
Andrey Novikov
2012/10/30 09:24:17
Done.
| |
875 } | 917 } |
876 } | 918 } |
877 | 919 |
878 jsEngine.release(); | 920 jsEngine.release(); |
879 } | 921 } |
880 } | 922 } |
881 | 923 |
882 /** | 924 /** |
883 * Helper class for XMLHttpRequest implementation. | 925 * Helper class for XMLHttpRequest implementation. |
884 */ | 926 */ |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
931 { | 973 { |
932 headers[i][0] = header; | 974 headers[i][0] = header; |
933 headers[i][1] = StringUtils.join(result.headers.get(header).toArray( ), "; "); | 975 headers[i][1] = StringUtils.join(result.headers.get(header).toArray( ), "; "); |
934 i++; | 976 i++; |
935 } | 977 } |
936 } | 978 } |
937 params[0] = result.code; | 979 params[0] = result.code; |
938 params[1] = result.message; | 980 params[1] = result.message; |
939 params[2] = headers; | 981 params[2] = headers; |
940 params[3] = result.data; | 982 params[3] = result.data; |
941 js.execute(new Runnable() { | 983 js.execute(new Runnable() |
984 { | |
942 @Override | 985 @Override |
943 public void run() | 986 public void run() |
944 { | 987 { |
945 js.callback(callback, params); | 988 js.callback(callback, params); |
946 } | 989 } |
947 | 990 |
948 }); | 991 }); |
949 } | 992 } |
950 } | 993 } |
951 | 994 |
952 @Override | 995 @Override |
953 protected void onCancelled() | 996 protected void onCancelled() |
954 { | 997 { |
955 } | 998 } |
956 | 999 |
957 @Override | 1000 @Override |
958 protected Result doInBackground(Task... tasks) | 1001 protected Result doInBackground(Task... tasks) |
959 { | 1002 { |
960 Task task = tasks[0]; | 1003 Task task = tasks[0]; |
961 Result result = new Result(); | 1004 Result result = new Result(); |
962 result.callback = task.callback; | 1005 result.callback = task.callback; |
963 try | 1006 try |
964 { | 1007 { |
965 HttpURLConnection connection = task.connection; | 1008 HttpURLConnection connection = task.connection; |
966 connection.connect(); | 1009 connection.connect(); |
967 int lenghtOfFile = connection.getContentLength(); | 1010 int lenghtOfFile = connection.getContentLength(); |
968 Log.w("D", "S: " + lenghtOfFile); | 1011 Log.d("D", "S: " + lenghtOfFile); |
Felix Dahlke
2012/10/29 15:06:36
Log.d()?
Andrey Novikov
2012/10/30 09:24:17
Done.
| |
969 | 1012 |
970 result.code = connection.getResponseCode(); | 1013 result.code = connection.getResponseCode(); |
971 result.message = connection.getResponseMessage(); | 1014 result.message = connection.getResponseMessage(); |
972 result.headers = connection.getHeaderFields(); | 1015 result.headers = connection.getHeaderFields(); |
973 | 1016 |
974 // download the file | 1017 // download the file |
975 String encoding = connection.getContentEncoding(); | 1018 String encoding = connection.getContentEncoding(); |
976 if (encoding == null) | 1019 if (encoding == null) |
977 encoding = "utf-8"; | 1020 encoding = "utf-8"; |
978 BufferedReader in = new BufferedReader(new InputStreamReader(connection. getInputStream(), encoding)); | 1021 BufferedReader in = new BufferedReader(new InputStreamReader(connection. getInputStream(), encoding)); |
979 | 1022 |
980 final char[] buffer = new char[0x10000]; | 1023 final char[] buffer = new char[0x10000]; |
Felix Dahlke
2012/10/29 15:06:36
Reminds me of the code up there, maybe have a sing
Andrey Novikov
2012/10/30 07:53:22
No, I can't. At least do not know how. Because her
| |
981 StringBuilder out = new StringBuilder(); | 1024 StringBuilder out = new StringBuilder(); |
982 long total = 0; | 1025 long total = 0; |
983 int read; | 1026 int read; |
984 do | 1027 do |
985 { | 1028 { |
986 read = in.read(buffer, 0, buffer.length); | 1029 read = in.read(buffer, 0, buffer.length); |
987 if (read > 0) | 1030 if (read > 0) |
988 { | 1031 { |
989 out.append(buffer, 0, read); | 1032 out.append(buffer, 0, read); |
990 total += read; | 1033 total += read; |
991 publishProgress((int) (total * 100. / lenghtOfFile)); | 1034 publishProgress((int) (total * 100. / lenghtOfFile)); |
992 } | 1035 } |
993 } | 1036 } |
994 while (!isCancelled() && read >= 0); | 1037 while (!isCancelled() && read >= 0); |
995 result.data = out.toString(); | 1038 result.data = out.toString(); |
996 in.close(); | 1039 in.close(); |
997 } | 1040 } |
998 catch (Exception e) | 1041 catch (Exception e) |
999 { | 1042 { |
1000 e.printStackTrace(); | 1043 Log.e(TAG, e.getMessage(), e); |
Felix Dahlke
2012/10/29 15:06:36
Log.e()?
Andrey Novikov
2012/10/30 09:24:17
Done.
| |
1001 result.data = ""; | 1044 result.data = ""; |
1002 result.code = HttpURLConnection.HTTP_INTERNAL_ERROR; | 1045 result.code = HttpURLConnection.HTTP_INTERNAL_ERROR; |
1003 result.message = e.toString(); | 1046 result.message = e.toString(); |
1004 } | 1047 } |
1005 return result; | 1048 return result; |
1006 } | 1049 } |
1007 | 1050 |
1008 protected void onProgressUpdate(Integer... progress) | 1051 protected void onProgressUpdate(Integer... progress) |
1009 { | 1052 { |
1010 Log.i("HTTP", "Progress: " + progress[0].intValue()); | 1053 Log.d("HTTP", "Progress: " + progress[0].intValue()); |
1011 } | 1054 } |
1012 } | 1055 } |
1013 } | 1056 } |
LEFT | RIGHT |