Started refactoring to use GCM instead of C2DM

pull/14/head
Sam Bosley 13 years ago
parent 2950307dc8
commit 74019d7cb1

@ -31,5 +31,6 @@
<classpathentry kind="lib" path="libs/crittercism_v2_1_2.jar"/> <classpathentry kind="lib" path="libs/crittercism_v2_1_2.jar"/>
<classpathentry kind="lib" path="libs/findbugs-annotations.jar"/> <classpathentry kind="lib" path="libs/findbugs-annotations.jar"/>
<classpathentry kind="lib" path="libs/CWAC-SackOfViewsAdapter.jar"/> <classpathentry kind="lib" path="libs/CWAC-SackOfViewsAdapter.jar"/>
<classpathentry kind="lib" path="libs/gcm.jar" sourcepath="libs/gcm-src.jar"/>
<classpathentry kind="output" path="bin/classes"/> <classpathentry kind="output" path="bin/classes"/>
</classpath> </classpath>

@ -46,6 +46,9 @@
<!-- required for in-app billing of premium subscriptions --> <!-- required for in-app billing of premium subscriptions -->
<uses-permission android:name="com.android.vending.BILLING"/> <uses-permission android:name="com.android.vending.BILLING"/>
<!-- Required for GCM - keeps the processor from sleeping when a message is received. -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<!-- ============================================== Exported Permissions = --> <!-- ============================================== Exported Permissions = -->
<!-- for v2 tasks provider --> <!-- for v2 tasks provider -->
@ -415,13 +418,18 @@
<action android:name="com.google.android.c2dm.intent.RECEIVE" /> <action android:name="com.google.android.c2dm.intent.RECEIVE" />
<category android:name="com.timsu.astrid" /> <category android:name="com.timsu.astrid" />
</intent-filter> </intent-filter>
<!-- Receive the registration id --> </receiver>
<receiver android:name="com.google.android.gcm.GCMBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter> <intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" /> <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="com.timsu.astrid" /> <category android:name="com.timsu.astrid" />
</intent-filter> </intent-filter>
</receiver> </receiver>
<service android:name=".GCMIntentService" />
<!-- gtasks --> <!-- gtasks -->
<activity android:name="com.todoroo.astrid.gtasks.GtasksListFragment" <activity android:name="com.todoroo.astrid.gtasks.GtasksListFragment"
android:windowSoftInputMode="stateHidden|adjustResize" android:windowSoftInputMode="stateHidden|adjustResize"

Binary file not shown.

Binary file not shown.

@ -15,8 +15,6 @@ import android.app.PendingIntent;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.Build;
import android.provider.Settings.Secure;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; import android.util.Log;
@ -28,7 +26,6 @@ import com.todoroo.andlib.service.NotificationManager;
import com.todoroo.andlib.service.NotificationManager.AndroidNotificationManager; import com.todoroo.andlib.service.NotificationManager.AndroidNotificationManager;
import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.sql.QueryTemplate; import com.todoroo.andlib.sql.QueryTemplate;
import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.andlib.utility.Preferences; import com.todoroo.andlib.utility.Preferences;
import com.todoroo.astrid.actfm.TagViewFragment; import com.todoroo.astrid.actfm.TagViewFragment;
@ -81,33 +78,14 @@ public class C2DMReceiver extends BroadcastReceiver {
} }
}; };
private static String getDeviceID() {
String id = Secure.getString(ContextManager.getContext().getContentResolver(), Secure.ANDROID_ID);;
if(AndroidUtilities.getSdkVersion() > 8) { //Gingerbread and above
//the following uses relection to get android.os.Build.SERIAL to avoid having to build with Gingerbread
try {
if(!Build.UNKNOWN.equals(Build.SERIAL))
id = Build.SERIAL;
} catch(Exception e) {
// Ah well
}
}
if (TextUtils.isEmpty(id) || "9774d56d682e549c".equals(id)) { // check for failure or devices affected by the "9774d56d682e549c" bug
return null;
}
return id;
}
@Override @Override
public void onReceive(Context context, final Intent intent) { public void onReceive(Context context, final Intent intent) {
if (Preferences.getStringValue(GCMIntentService.PREF_REGISTRATION) != null) // GCM takes precedence
return;
ContextManager.setContext(context); ContextManager.setContext(context);
DependencyInjectionService.getInstance().inject(this); DependencyInjectionService.getInstance().inject(this);
if (intent.getAction().equals("com.google.android.c2dm.intent.REGISTRATION")) { if (intent.getAction().equals("com.google.android.c2dm.intent.RECEIVE")) {
handleRegistration(intent);
} else if (intent.getAction().equals("com.google.android.c2dm.intent.RECEIVE")) {
new Thread(new Runnable() { new Thread(new Runnable() {
@Override @Override
public void run() { public void run() {
@ -419,56 +397,4 @@ public class C2DMReceiver extends BroadcastReceiver {
return true; return true;
} }
private void handleRegistration(Intent intent) {
final String registration = intent.getStringExtra("registration_id");
if (intent.getStringExtra("error") != null) {
Log.w("astrid-actfm", "error-c2dm: " + intent.getStringExtra("error"));
} else if (intent.getStringExtra("unregistered") != null) {
// un-registration done
} else if (registration != null) {
DependencyInjectionService.getInstance().inject(this);
new Thread() {
@Override
public void run() {
try {
String deviceId = getDeviceID();
if (deviceId != null)
actFmSyncService.invoke("user_set_c2dm", "c2dm", registration, "device_id", deviceId);
else
actFmSyncService.invoke("user_set_c2dm", "c2dm", registration);
Preferences.setString(PREF_REGISTRATION, registration);
} catch (IOException e) {
Log.e("astrid-actfm", "error-c2dm-transfer", e);
}
}
}.start();
}
}
/** try to request registration from c2dm service */
public static void register() {
if(Preferences.getStringValue(PREF_REGISTRATION) != null)
return;
new Thread() {
@Override
public void run() {
Context context = ContextManager.getContext();
Intent registrationIntent = new Intent("com.google.android.c2dm.intent.REGISTER");
registrationIntent.putExtra("app", PendingIntent.getBroadcast(context, 0, new Intent(), 0)); // boilerplate
registrationIntent.putExtra("sender", C2DM_SENDER);
context.startService(registrationIntent);
}
}.start();
}
/** unregister with c2dm service */
public static void unregister() {
Preferences.setString(PREF_REGISTRATION, null);
Context context = ContextManager.getContext();
Intent unregIntent = new Intent("com.google.android.c2dm.intent.UNREGISTER");
unregIntent.putExtra("app", PendingIntent.getBroadcast(context, 0, new Intent(), 0));
context.startService(unregIntent);
}
} }

@ -0,0 +1,102 @@
package com.timsu.astrid;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.provider.Settings.Secure;
import android.text.TextUtils;
import android.util.Log;
import com.google.android.gcm.GCMBaseIntentService;
import com.google.android.gcm.GCMRegistrar;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.astrid.actfm.sync.ActFmSyncService;
@SuppressWarnings("nls")
public class GCMIntentService extends GCMBaseIntentService {
public static final String SENDER_ID = "gcm@astrid.com"; //$NON-NLS-1$
public static final String PREF_REGISTRATION = "gcm_id";
public static final String PREF_NEEDS_REGISTRATION = "gcm_needs_reg";
public static String getDeviceID() {
String id = Secure.getString(ContextManager.getContext().getContentResolver(), Secure.ANDROID_ID);;
if(AndroidUtilities.getSdkVersion() > 8) { //Gingerbread and above
//the following uses relection to get android.os.Build.SERIAL to avoid having to build with Gingerbread
try {
if(!Build.UNKNOWN.equals(Build.SERIAL))
id = Build.SERIAL;
} catch(Exception e) {
// Ah well
}
}
if (TextUtils.isEmpty(id) || "9774d56d682e549c".equals(id)) { // check for failure or devices affected by the "9774d56d682e549c" bug
return null;
}
return id;
}
@Autowired
private ActFmSyncService actFmSyncService;
public GCMIntentService() {
super();
DependencyInjectionService.getInstance().inject(this);
}
@Override
protected void onRegistered(Context context, String registrationId) {
actFmSyncService.setGCMRegistration(registrationId);
}
@Override
protected void onUnregistered(Context context, String registrationId) {
// Server will unregister automatically next time it tries to send a message
}
@Override
protected void onError(Context context, String intent) {
// Unrecoverable
}
@Override
protected void onMessage(Context context, Intent intent) {
// Intent extras are the keys in the server message's "data" object
}
public static final void register(Context context) {
try {
if (AndroidUtilities.getSdkVersion() >= 8) {
GCMRegistrar.checkDevice(context);
GCMRegistrar.checkManifest(context);
final String regId = GCMRegistrar.getRegistrationId(context);
if ("".equals(regId)) {
GCMRegistrar.register(context, GCMIntentService.SENDER_ID);
} else {
// TODO: Already registered--do something?
}
}
} catch (Exception e) {
// phone may not support gcm
Log.e("actfm-sync", "gcm-register", e);
}
}
public static final void unregister(Context context) {
try {
if (AndroidUtilities.getSdkVersion() >= 8) {
GCMRegistrar.checkDevice(context);
GCMRegistrar.unregister(context);
}
} catch (Exception e) {
Log.e("actfm-sync", "gcm-unregister", e);
}
}
}

@ -50,7 +50,7 @@ import com.facebook.android.LoginButton;
import com.facebook.android.Util; import com.facebook.android.Util;
import com.google.android.googlelogin.GoogleLoginServiceConstants; import com.google.android.googlelogin.GoogleLoginServiceConstants;
import com.google.android.googlelogin.GoogleLoginServiceHelper; import com.google.android.googlelogin.GoogleLoginServiceHelper;
import com.timsu.astrid.C2DMReceiver; import com.timsu.astrid.GCMIntentService;
import com.timsu.astrid.R; import com.timsu.astrid.R;
import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.service.ContextManager;
@ -572,12 +572,7 @@ public class ActFmLoginActivity extends FragmentActivity implements AuthListener
setResult(RESULT_OK); setResult(RESULT_OK);
finish(); finish();
try { GCMIntentService.register(this);
C2DMReceiver.register();
} catch (Exception e) {
// phone may not support c2dm
exceptionService.reportError("error-c2dm-register", e);
}
} }
@SuppressWarnings("nls") @SuppressWarnings("nls")

@ -32,6 +32,7 @@ import android.os.ConditionVariable;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import com.timsu.astrid.GCMIntentService;
import com.timsu.astrid.R; import com.timsu.astrid.R;
import com.todoroo.andlib.data.AbstractModel; import com.todoroo.andlib.data.AbstractModel;
import com.todoroo.andlib.data.DatabaseDao; import com.todoroo.andlib.data.DatabaseDao;
@ -1232,6 +1233,21 @@ public final class ActFmSyncService {
} }
} }
public void setGCMRegistration(String regId) {
try {
String deviceId = GCMIntentService.getDeviceID();
if (deviceId != null)
invoke("user_set_gcm", "c2dm", regId, "device_id", deviceId);
else
invoke("user_set_gcm", "c2dm", regId);
Preferences.setString(GCMIntentService.PREF_REGISTRATION, regId);
Preferences.setString(GCMIntentService.PREF_NEEDS_REGISTRATION, null);
} catch (IOException e) {
Preferences.setString(GCMIntentService.PREF_NEEDS_REGISTRATION, regId);
Log.e("gcm", "error-gcm-register", e);
}
}
private void pushQueuedUpdatesForTag(TagData tagData) { private void pushQueuedUpdatesForTag(TagData tagData) {
Criterion criterion = null; Criterion criterion = null;
if (tagData.getValue(TagData.REMOTE_ID) < 1) { if (tagData.getValue(TagData.REMOTE_ID) < 1) {

@ -14,7 +14,7 @@ import java.util.concurrent.atomic.AtomicInteger;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import com.timsu.astrid.C2DMReceiver; import com.timsu.astrid.GCMIntentService;
import com.timsu.astrid.R; import com.timsu.astrid.R;
import com.todoroo.andlib.data.AbstractModel; import com.todoroo.andlib.data.AbstractModel;
import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.data.TodorooCursor;
@ -147,7 +147,7 @@ public class ActFmSyncV2Provider extends SyncV2Provider {
actFmPreferenceService.setToken(null); actFmPreferenceService.setToken(null);
actFmPreferenceService.clearLastSyncDate(); actFmPreferenceService.clearLastSyncDate();
ActFmPreferenceService.premiumLogout(); ActFmPreferenceService.premiumLogout();
C2DMReceiver.unregister(); GCMIntentService.unregister(ContextManager.getContext());
} }
@Override @Override
@ -196,6 +196,10 @@ public class ActFmSyncV2Provider extends SyncV2Provider {
/** fetch user status hash*/ /** fetch user status hash*/
@SuppressWarnings("nls") @SuppressWarnings("nls")
public void updateUserStatus() { public void updateUserStatus() {
if (Preferences.getStringValue(GCMIntentService.PREF_NEEDS_REGISTRATION) != null) {
actFmSyncService.setGCMRegistration(Preferences.getStringValue(GCMIntentService.PREF_NEEDS_REGISTRATION));
}
if (Preferences.getBoolean(BillingConstants.PREF_NEEDS_SERVER_UPDATE, false)) { if (Preferences.getBoolean(BillingConstants.PREF_NEEDS_SERVER_UPDATE, false)) {
actFmSyncService.updateUserSubscriptionStatus(null, null, null); actFmSyncService.updateUserSubscriptionStatus(null, null, null);
} }

Loading…
Cancel
Save