Skip to content

Commit

Permalink
implement WantConnectivityService to re-trigger failed updates when t…
Browse files Browse the repository at this point in the history
…here is no network connectivity
  • Loading branch information
stapelberg committed Apr 6, 2011
1 parent 4e4136e commit 709377e
Show file tree
Hide file tree
Showing 3 changed files with 101 additions and 2 deletions.
3 changes: 2 additions & 1 deletion android-widget/AndroidManifest.xml
Expand Up @@ -39,8 +39,9 @@
android:resource="@xml/statusprovider" />
</receiver>

<service android:name=".StatusProvider$UpdateService" />
<service android:name=".WantConnectivityService" />
</application>
<uses-sdk android:minSdkVersion="7" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
</manifest>
10 changes: 9 additions & 1 deletion android-widget/src/org/raumzeitlabor/status/StatusProvider.java
Expand Up @@ -196,7 +196,7 @@ protected Character doInBackground(Void... param) {
return (char)firstByte;
} catch (Exception e) {
e.printStackTrace();
return '?';
return '!';
} finally {
client.close();
}
Expand Down Expand Up @@ -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);
}
}
}

Expand Down
@@ -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<Integer> widgetIds = new ArrayList<Integer>();

@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();
}
}
}

0 comments on commit 709377e

Please sign in to comment.