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/findbugs-annotations.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"/>
</classpath>

@ -45,6 +45,9 @@
<!-- required for in-app billing of premium subscriptions -->
<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 = -->
@ -415,12 +418,17 @@
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<category android:name="com.timsu.astrid" />
</intent-filter>
<!-- Receive the registration id -->
<intent-filter>
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="com.timsu.astrid" />
</intent-filter>
</receiver>
<receiver android:name="com.google.android.gcm.GCMBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="com.timsu.astrid" />
</intent-filter>
</receiver>
<service android:name=".GCMIntentService" />
<!-- gtasks -->
<activity android:name="com.todoroo.astrid.gtasks.GtasksListFragment"

Binary file not shown.

Binary file not shown.

@ -15,8 +15,6 @@ import android.app.PendingIntent;
import android.content.BroadcastReceiver;
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;
@ -28,7 +26,6 @@ import com.todoroo.andlib.service.NotificationManager;
import com.todoroo.andlib.service.NotificationManager.AndroidNotificationManager;
import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.sql.QueryTemplate;
import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.andlib.utility.Preferences;
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
public void onReceive(Context context, final Intent intent) {
if (Preferences.getStringValue(GCMIntentService.PREF_REGISTRATION) != null) // GCM takes precedence
return;
ContextManager.setContext(context);
DependencyInjectionService.getInstance().inject(this);
if (intent.getAction().equals("com.google.android.c2dm.intent.REGISTRATION")) {
handleRegistration(intent);
} else if (intent.getAction().equals("com.google.android.c2dm.intent.RECEIVE")) {
if (intent.getAction().equals("com.google.android.c2dm.intent.RECEIVE")) {
new Thread(new Runnable() {
@Override
public void run() {
@ -419,56 +397,4 @@ public class C2DMReceiver extends BroadcastReceiver {
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.google.android.googlelogin.GoogleLoginServiceConstants;
import com.google.android.googlelogin.GoogleLoginServiceHelper;
import com.timsu.astrid.C2DMReceiver;
import com.timsu.astrid.GCMIntentService;
import com.timsu.astrid.R;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.ContextManager;
@ -572,12 +572,7 @@ public class ActFmLoginActivity extends FragmentActivity implements AuthListener
setResult(RESULT_OK);
finish();
try {
C2DMReceiver.register();
} catch (Exception e) {
// phone may not support c2dm
exceptionService.reportError("error-c2dm-register", e);
}
GCMIntentService.register(this);
}
@SuppressWarnings("nls")

@ -32,6 +32,7 @@ import android.os.ConditionVariable;
import android.text.TextUtils;
import android.util.Log;
import com.timsu.astrid.GCMIntentService;
import com.timsu.astrid.R;
import com.todoroo.andlib.data.AbstractModel;
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) {
Criterion criterion = null;
if (tagData.getValue(TagData.REMOTE_ID) < 1) {

@ -14,7 +14,7 @@ import java.util.concurrent.atomic.AtomicInteger;
import org.json.JSONException;
import org.json.JSONObject;
import com.timsu.astrid.C2DMReceiver;
import com.timsu.astrid.GCMIntentService;
import com.timsu.astrid.R;
import com.todoroo.andlib.data.AbstractModel;
import com.todoroo.andlib.data.TodorooCursor;
@ -147,7 +147,7 @@ public class ActFmSyncV2Provider extends SyncV2Provider {
actFmPreferenceService.setToken(null);
actFmPreferenceService.clearLastSyncDate();
ActFmPreferenceService.premiumLogout();
C2DMReceiver.unregister();
GCMIntentService.unregister(ContextManager.getContext());
}
@Override
@ -196,6 +196,10 @@ public class ActFmSyncV2Provider extends SyncV2Provider {
/** fetch user status hash*/
@SuppressWarnings("nls")
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)) {
actFmSyncService.updateUserSubscriptionStatus(null, null, null);
}

Loading…
Cancel
Save