From 709377e0a9c6024cb33dbc13f4ab0811b58e6d62 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Wed, 6 Apr 2011 20:14:52 +0200 Subject: [PATCH] implement WantConnectivityService to re-trigger failed updates when there is no network connectivity --- android-widget/AndroidManifest.xml | 3 +- .../raumzeitlabor/status/StatusProvider.java | 10 ++- .../status/WantConnectivityService.java | 90 +++++++++++++++++++ 3 files changed, 101 insertions(+), 2 deletions(-) create mode 100644 android-widget/src/org/raumzeitlabor/status/WantConnectivityService.java diff --git a/android-widget/AndroidManifest.xml b/android-widget/AndroidManifest.xml index 6d90431..bf246bb 100644 --- a/android-widget/AndroidManifest.xml +++ b/android-widget/AndroidManifest.xml @@ -39,8 +39,9 @@ android:resource="@xml/statusprovider" /> - + + diff --git a/android-widget/src/org/raumzeitlabor/status/StatusProvider.java b/android-widget/src/org/raumzeitlabor/status/StatusProvider.java index 7ffced9..4972505 100644 --- a/android-widget/src/org/raumzeitlabor/status/StatusProvider.java +++ b/android-widget/src/org/raumzeitlabor/status/StatusProvider.java @@ -196,7 +196,7 @@ protected Character doInBackground(Void... param) { return (char)firstByte; } catch (Exception e) { e.printStackTrace(); - return '?'; + return '!'; } finally { client.close(); } @@ -226,6 +226,14 @@ protected void onPostExecute(Character result) { update.setOnClickPendingIntent(R.id.lastupdate, pendingIntent); AppWidgetManager manager = AppWidgetManager.getInstance(context); manager.updateAppWidget(widgetId, update); + + /* Tell the WantConnectivityService that we want an update as soon + * as there is network connectivity */ + if (result == '!') { + Intent si = new Intent(context, WantConnectivityService.class); + si.putExtra("widgetId", widgetId); + context.startService(si); + } } } diff --git a/android-widget/src/org/raumzeitlabor/status/WantConnectivityService.java b/android-widget/src/org/raumzeitlabor/status/WantConnectivityService.java new file mode 100644 index 0000000..c734951 --- /dev/null +++ b/android-widget/src/org/raumzeitlabor/status/WantConnectivityService.java @@ -0,0 +1,90 @@ +/* + * vim:ts=4:sw=4:expandtab + */ +package org.raumzeitlabor.status; + +import android.app.AlarmManager; +import android.app.PendingIntent; +import android.app.Service; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.os.IBinder; +import android.util.Log; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; +import android.net.NetworkInfo.State; +import android.content.IntentFilter; +import android.content.BroadcastReceiver; + +import java.util.ArrayList; + +public class WantConnectivityService extends Service { + private static final String TAG = "rzlstatus/WCS"; + private BroadcastReceiver mReceiver; + private ArrayList widgetIds = new ArrayList(); + + @Override + public IBinder onBind(Intent intent) { + return null; + } + + @Override + public void onCreate() { + Log.d(TAG, "Creating WantConnectivityService"); + + mReceiver = new NetworkChangeReceiver(); + + IntentFilter filter = new IntentFilter(); + filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); + registerReceiver(mReceiver, filter); + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + int widgetId = intent.getIntExtra("widgetId", -1); + if (widgetId == -1) { + Log.e(TAG, "No widget ID passed"); + return START_STICKY; + } + if (!widgetIds.contains(widgetId)) { + Log.d(TAG, "widgetId " + widgetId + " is new, adding to list"); + widgetIds.add(widgetId); + } + return START_STICKY; + } + + @Override + public void onDestroy() { + Log.d(TAG, "Destroying WantConnectivityService"); + unregisterReceiver(mReceiver); + } + + public class NetworkChangeReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + Log.d(TAG, "Broadcast! action = " + intent.getAction()); + if (!intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) { + Log.d(TAG, "Broadcast does not match CONNECTIVITY_ACTION"); + return; + } + + Bundle extras = intent.getExtras(); + Log.d(TAG, "no connectivity = " + extras.getBoolean(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false)); + Log.d(TAG, "failover = " + extras.getBoolean(ConnectivityManager.EXTRA_IS_FAILOVER, false)); + NetworkInfo info = (NetworkInfo)extras.get(ConnectivityManager.EXTRA_NETWORK_INFO); + + if (info.getState() != State.CONNECTED) { + Log.d(TAG, "NOT connected yet, waiting..."); + return; + } + + for (Integer id : widgetIds) { + Log.d(TAG, "Should update widget with id " + id); + sendBroadcast(StatusProvider.intentForWidget(id, ".UPDATE")); + } + + WantConnectivityService.this.stopSelf(); + } + } +}