From a369e77ae61352c5e205749e5dfd5e6d0835a8e4 Mon Sep 17 00:00:00 2001 From: Sahil Dave Date: Fri, 15 May 2015 19:53:59 +0530 Subject: [PATCH 1/2] Included HermesIntentService which handles messages. Changed HermesBroadcastReceiver to WakefulBroadcastReceiver --- .gitignore | 3 +- hermes/build.gradle | 9 +-- hermes/src/main/AndroidManifest.xml | 6 +- .../main/java/in/raveesh/hermes/Hermes.java | 39 ++++++---- .../src/main/java/in/raveesh/hermes/Util.java | 16 +++++ .../receivers/ExponentialBackoffReceiver.java | 6 +- .../receivers/HermesBroadcastReceiver.java | 44 ++++++------ .../hermes/receivers/HermesIntentService.java | 71 +++++++++++++++++++ hermesexample/build.gradle | 12 ++-- hermesexample/src/main/AndroidManifest.xml | 3 + .../hermesexample/GcmBroadcastReceiver.java | 14 +--- .../hermesexample/GcmIntentService.java | 35 +++++++++ .../raveesh/hermesexample/MainActivity.java | 58 +++++++++++---- 13 files changed, 234 insertions(+), 82 deletions(-) create mode 100644 hermes/src/main/java/in/raveesh/hermes/Util.java create mode 100644 hermes/src/main/java/in/raveesh/hermes/receivers/HermesIntentService.java create mode 100644 hermesexample/src/main/java/in/raveesh/hermesexample/GcmIntentService.java diff --git a/.gitignore b/.gitignore index a051216..57dfd66 100644 --- a/.gitignore +++ b/.gitignore @@ -14,4 +14,5 @@ hermes/build hermesexample/build hermes/hermes.iml hermesexample/hermesexample.iml -gradle.properties \ No newline at end of file +gradle.properties +gradlew.bat \ No newline at end of file diff --git a/hermes/build.gradle b/hermes/build.gradle index 212f215..496016d 100644 --- a/hermes/build.gradle +++ b/hermes/build.gradle @@ -1,12 +1,12 @@ apply plugin: 'com.android.library' android { - compileSdkVersion 21 - buildToolsVersion "21.1.2" + compileSdkVersion 22 + buildToolsVersion "22.0.1" defaultConfig { minSdkVersion 9 - targetSdkVersion 21 + targetSdkVersion 22 versionCode 1 versionName "1.0" } @@ -20,7 +20,8 @@ android { dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) - compile 'com.google.android.gms:play-services-gcm:7.0.0' + compile 'com.android.support:support-v4:22.1.1' + compile 'com.google.android.gms:play-services-gcm:7.3.0' } apply from: "../maven.gradle" diff --git a/hermes/src/main/AndroidManifest.xml b/hermes/src/main/AndroidManifest.xml index 86d9926..c7373ce 100644 --- a/hermes/src/main/AndroidManifest.xml +++ b/hermes/src/main/AndroidManifest.xml @@ -5,16 +5,12 @@ + - - () { @Override - protected Object doInBackground(Object[] params) { + protected String doInBackground(Object[] params) { String msg = ""; try { if (gcm == null) { @@ -166,7 +169,7 @@ protected Object doInBackground(Object[] params) { } regID = gcm.register(SENDER_ID); msg = "Device registered, registration ID=" + regID; - + Util.log("From Async - "+msg); // You should send the registration ID to your server over HTTP, // so it can use GCM/HTTP or CCS to send messages to your app. // The request to your server should be authenticated if your app @@ -179,11 +182,17 @@ protected Object doInBackground(Object[] params) { // Persist the registration ID - no need to register again. storeRegistrationId(context, regID); + if (CALLBACK != null){ + CALLBACK.registrationComplete(regID); + } } catch (IOException ex) { msg = "Error :" + ex.getMessage(); // If there is an error, don't just keep trying to register. // Require the user to click a button again, or perform // exponential back-off. + ExponentialBackoffReceiver.attemptRegistration(context, + Hermes.getDelay(), + Hermes.getSenderId()); } return msg; } @@ -199,11 +208,11 @@ protected Object doInBackground(Object[] params) { private void storeRegistrationId(Context context, String regId) { final SharedPreferences prefs = getGCMPreferences(context); int appVersion = getAppVersion(context); - Log.i(TAG, "Saving regId on app version " + appVersion); + Util.log("Saving regId on app version " + appVersion); SharedPreferences.Editor editor = prefs.edit(); editor.putString(PROPERTY_REG_ID, regId); editor.putInt(PROPERTY_APP_VERSION, appVersion); - editor.commit(); + editor.apply(); } /** diff --git a/hermes/src/main/java/in/raveesh/hermes/Util.java b/hermes/src/main/java/in/raveesh/hermes/Util.java new file mode 100644 index 0000000..e94a94c --- /dev/null +++ b/hermes/src/main/java/in/raveesh/hermes/Util.java @@ -0,0 +1,16 @@ +package in.raveesh.hermes; + +import android.annotation.SuppressLint; +import android.util.Log; + +/** + * Created by sahil on 15/5/15. + */ +public class Util { + public static final String LOG_TAG = "in.raveesh.hermesexample"; + + @SuppressLint("LongLogTag") + public static void log(String message) { + Log.d(LOG_TAG, message); + } +} diff --git a/hermes/src/main/java/in/raveesh/hermes/receivers/ExponentialBackoffReceiver.java b/hermes/src/main/java/in/raveesh/hermes/receivers/ExponentialBackoffReceiver.java index 2aa38fe..e228494 100644 --- a/hermes/src/main/java/in/raveesh/hermes/receivers/ExponentialBackoffReceiver.java +++ b/hermes/src/main/java/in/raveesh/hermes/receivers/ExponentialBackoffReceiver.java @@ -5,9 +5,9 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; -import android.util.Log; import in.raveesh.hermes.Hermes; +import in.raveesh.hermes.Util; public class ExponentialBackoffReceiver extends BroadcastReceiver { private static String ACTION = "in.raveesh.hermes.receivers.EXPONENTIAL_BACKOFF"; @@ -22,7 +22,7 @@ public static void attemptRegistration(Context context, int time, String sender_ PendingIntent pendingIntent = PendingIntent.getBroadcast(context, time, intent, PendingIntent.FLAG_UPDATE_CURRENT); AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); manager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + time, pendingIntent); - Log.d(Hermes.TAG, "Exponential Backoff Set for " + time); + Util.log("Exponential Backoff Set for " + time); if (Hermes.CALLBACK != null){ Hermes.CALLBACK.setExponentialBackoff(time); } @@ -37,7 +37,7 @@ public void onReceive(Context context, Intent intent) { if (Hermes.CALLBACK != null){ Hermes.CALLBACK.backoffComplete(backedOff); } - Log.d(Hermes.TAG, "Exponential backoff complete after "+ backedOff); + Util.log("Exponential backoff complete after " + backedOff); Hermes.register(context, intent.getStringExtra(EXTRA_SENDER_ID)); Hermes.setDelay(backedOff*2); } diff --git a/hermes/src/main/java/in/raveesh/hermes/receivers/HermesBroadcastReceiver.java b/hermes/src/main/java/in/raveesh/hermes/receivers/HermesBroadcastReceiver.java index 2066b4e..3cd3b96 100644 --- a/hermes/src/main/java/in/raveesh/hermes/receivers/HermesBroadcastReceiver.java +++ b/hermes/src/main/java/in/raveesh/hermes/receivers/HermesBroadcastReceiver.java @@ -1,38 +1,36 @@ package in.raveesh.hermes.receivers; -import android.content.BroadcastReceiver; +import android.app.Activity; +import android.content.ComponentName; import android.content.Context; import android.content.Intent; -import android.util.Log; +import android.support.v4.content.WakefulBroadcastReceiver; -import in.raveesh.hermes.Hermes; +import in.raveesh.hermes.Util; -public class HermesBroadcastReceiver extends BroadcastReceiver { +public class HermesBroadcastReceiver extends WakefulBroadcastReceiver { + private Class intentService; public HermesBroadcastReceiver() { } - protected boolean gotRegistrationId = false; - protected boolean error = false; - protected String registrationID; + public void setIntentService(Class intentService) { + this.intentService = intentService; + Util.log("Setting intentService class to - "+intentService); + } @Override public void onReceive(Context context, Intent intent) { - registrationID = intent.getStringExtra("registration_id"); - if (registrationID != null) { - gotRegistrationId = true; - if (Hermes.CALLBACK != null) { - Hermes.CALLBACK.registrationComplete(registrationID); - } - } else if (intent.getExtras() != null && intent.getExtras().get("error") != null) { - error = true; - if (Hermes.CALLBACK != null){ - Hermes.CALLBACK.registrationFailed(intent.getExtras().get("error").toString()); - } - ExponentialBackoffReceiver.attemptRegistration(context, Hermes.getDelay(), Hermes.getSenderId()); - } else { - Log.d(Hermes.TAG, "GCM Message Received"); - - } + + if(intentService == null ) throw new UnsupportedOperationException( + "Please use setIntentService in the " + + "constructor of your broadcastReceiver class."); + + ComponentName comp = new ComponentName( + context.getPackageName(), + intentService.getName()); + + startWakefulService(context, (intent.setComponent(comp))); + setResultCode(Activity.RESULT_OK); } } diff --git a/hermes/src/main/java/in/raveesh/hermes/receivers/HermesIntentService.java b/hermes/src/main/java/in/raveesh/hermes/receivers/HermesIntentService.java new file mode 100644 index 0000000..b17dfa9 --- /dev/null +++ b/hermes/src/main/java/in/raveesh/hermes/receivers/HermesIntentService.java @@ -0,0 +1,71 @@ +package in.raveesh.hermes.receivers; + +import android.app.IntentService; +import android.content.Intent; + +import com.google.android.gms.gcm.GoogleCloudMessaging; + +import in.raveesh.hermes.Hermes; +import in.raveesh.hermes.Util; + +/** + * Created by sahil on 15/5/15. + */ +public abstract class HermesIntentService extends IntentService{ + protected boolean gotRegistrationId = false; + protected boolean error = false; + protected String registrationID; + + public HermesIntentService(String name) { + super(name); + } + + @Override + protected void onHandleIntent(Intent intent) { + Util.log("HermesIntentService intent - " + intent); + + if(intent.getAction().equals("com.google.android.c2dm.intent.REGISTRATION")) { + Util.log("HermesIntentService action - REGISTRATION"); + + registrationID = intent.getStringExtra("registration_id"); + if (registrationID != null) { + gotRegistrationId = true; + if (Hermes.CALLBACK != null) { + Hermes.CALLBACK.registrationComplete(registrationID); + } + } else if (intent.getExtras() != null && intent.getExtras().get("error") != null) { + error = true; + if (Hermes.CALLBACK != null){ + Hermes.CALLBACK.registrationFailed(intent.getExtras().get("error").toString()); + } + + ExponentialBackoffReceiver.attemptRegistration(this, Hermes.getDelay(), Hermes.getSenderId()); + } + } else if(intent.getAction().equals("com.google.android.c2dm.intent.RECEIVE")) { + Util.log("HermesIntentService action - RECEIVE"); + + GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this); + String messageType = gcm.getMessageType(intent); + Util.log("HermesIntentService messageType - " + messageType); + + if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals(messageType)) { + Util.log("Message Received"); + messageReceived(); + } else if (GoogleCloudMessaging.MESSAGE_TYPE_DELETED.equals(messageType)) { + Util.log("Message Deleted"); + messageDeleted(); + } else if (GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR.equals(messageType)) { + Util.log("Message Send Error"); + messageSendError(); + } else if (GoogleCloudMessaging.MESSAGE_TYPE_SEND_EVENT.equals(messageType)) { + Util.log("Message Send Event"); + messageSendEvent(); + } + } + } + + public abstract void messageReceived(); + public abstract void messageDeleted(); + public abstract void messageSendEvent(); + public abstract void messageSendError(); +} diff --git a/hermesexample/build.gradle b/hermesexample/build.gradle index a1c3873..62c5253 100644 --- a/hermesexample/build.gradle +++ b/hermesexample/build.gradle @@ -1,13 +1,13 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 21 - buildToolsVersion "21.1.2" + compileSdkVersion 22 + buildToolsVersion "22.0.1" defaultConfig { applicationId "in.raveesh.hermesexample" minSdkVersion 9 - targetSdkVersion 21 + targetSdkVersion 22 versionCode 1 versionName "1.0" } @@ -25,6 +25,8 @@ repositories { dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) - compile 'com.android.support:appcompat-v7:22.0.0' - compile 'in.raveesh:hermes:0.1.0-SNAPSHOT' + compile 'com.android.support:appcompat-v7:22.1.1' +// compile 'in.raveesh:hermes:0.1.0-SNAPSHOT' + + compile project (':hermes') // For Development } diff --git a/hermesexample/src/main/AndroidManifest.xml b/hermesexample/src/main/AndroidManifest.xml index 49d4954..0926556 100644 --- a/hermesexample/src/main/AndroidManifest.xml +++ b/hermesexample/src/main/AndroidManifest.xml @@ -37,6 +37,9 @@ + + diff --git a/hermesexample/src/main/java/in/raveesh/hermesexample/GcmBroadcastReceiver.java b/hermesexample/src/main/java/in/raveesh/hermesexample/GcmBroadcastReceiver.java index 9790f0e..2514ad9 100644 --- a/hermesexample/src/main/java/in/raveesh/hermesexample/GcmBroadcastReceiver.java +++ b/hermesexample/src/main/java/in/raveesh/hermesexample/GcmBroadcastReceiver.java @@ -2,27 +2,17 @@ import android.content.Context; import android.content.Intent; -import android.util.Log; import in.raveesh.hermes.receivers.HermesBroadcastReceiver; public class GcmBroadcastReceiver extends HermesBroadcastReceiver { public GcmBroadcastReceiver() { + setIntentService(GcmIntentService.class); } + @Override public void onReceive(Context context, Intent intent) { super.onReceive(context, intent); - if (gotRegistrationId){ - /** - * Device has just been registered. - */ - Log.d("HermesExample", "Device Registered, ID is "+registrationID); - } - else if (!error){ - /** - * GCM Message received, handle it as per your requirements - */ - } } } diff --git a/hermesexample/src/main/java/in/raveesh/hermesexample/GcmIntentService.java b/hermesexample/src/main/java/in/raveesh/hermesexample/GcmIntentService.java new file mode 100644 index 0000000..b40f3a9 --- /dev/null +++ b/hermesexample/src/main/java/in/raveesh/hermesexample/GcmIntentService.java @@ -0,0 +1,35 @@ +package in.raveesh.hermesexample; + +import android.content.Intent; + +import in.raveesh.hermes.Util; +import in.raveesh.hermes.receivers.HermesIntentService; + +/** + * Created by sahil on 15/5/15. + */ +public class GcmIntentService extends HermesIntentService { + + public GcmIntentService() { + super("GcmIntentService"); + } + + @Override + protected void onHandleIntent(Intent intent) { + super.onHandleIntent(intent); + } + + @Override + public void messageReceived() { + Util.log("Message Received in overridden method"); + } + + @Override + public void messageDeleted() {} + + @Override + public void messageSendEvent() {} + + @Override + public void messageSendError() {} +} diff --git a/hermesexample/src/main/java/in/raveesh/hermesexample/MainActivity.java b/hermesexample/src/main/java/in/raveesh/hermesexample/MainActivity.java index fca1b8b..5eeca9d 100644 --- a/hermesexample/src/main/java/in/raveesh/hermesexample/MainActivity.java +++ b/hermesexample/src/main/java/in/raveesh/hermesexample/MainActivity.java @@ -1,17 +1,15 @@ package in.raveesh.hermesexample; -import android.support.v7.app.ActionBarActivity; import android.os.Bundle; -import android.view.Menu; -import android.view.MenuItem; +import android.support.v7.app.AppCompatActivity; import android.widget.TextView; -import in.raveesh.hermes.GcmRegistrationException; import in.raveesh.hermes.Hermes; import in.raveesh.hermes.RegistrationCallback; +import in.raveesh.hermes.Util; -public class MainActivity extends ActionBarActivity implements RegistrationCallback{ +public class MainActivity extends AppCompatActivity implements RegistrationCallback{ TextView textView; @@ -26,38 +24,70 @@ protected void onCreate(Bundle savedInstanceState) { @Override protected void onResume(){ + Util.log("onResume"); super.onResume(); Hermes.register(this, "893452105076"); } @Override protected void onPause(){ + Util.log("onPause"); super.onPause(); Hermes.pause(this); } @Override - public void registrationComplete(String id) { - textView.setText(id); + public void registrationComplete(final String id) { + Util.log("registrationComplete"); + this.runOnUiThread(new Runnable() { + @Override + public void run() { + textView.setText(id); + } + }); } @Override public void registrationProcessStarted() { - textView.setText("Started Registration Process"); + Util.log("registrationProcessStarted"); + this.runOnUiThread(new Runnable() { + @Override + public void run() { + textView.setText("Started Registration Process"); + } + }); } @Override - public void registrationFailed(String msg) { - textView.setText("Registration failed: "+msg); + public void registrationFailed(final String msg) { + Util.log("registrationFailed"); + this.runOnUiThread(new Runnable() { + @Override + public void run() { + textView.setText("Registration failed: " + msg); + } + }); } @Override - public void setExponentialBackoff(int time) { - textView.setText("Set exponential backoff for "+time); + public void setExponentialBackoff(final int time) { + Util.log("setExponentialBackoff"); + this.runOnUiThread(new Runnable() { + @Override + public void run() { + textView.setText("Set exponential backoff for " + time); + } + }); } @Override - public void backoffComplete(int time) { - textView.setText("Exponential backoff complete after "+time); + public void backoffComplete(final int time) { + Util.log("backoffComplete"); + this.runOnUiThread(new Runnable() { + @Override + public void run() { + textView.setText("Exponential backoff complete after " + time); + } + }); } } From d5e8eaa862ddc8967caa4e560bf2ea8fa20ce145 Mon Sep 17 00:00:00 2001 From: Sahil Dave Date: Mon, 18 May 2015 11:27:47 +0530 Subject: [PATCH 2/2] Removed Util.java. Added some JavaDocs. --- .../main/java/in/raveesh/hermes/Hermes.java | 19 +++++------ .../src/main/java/in/raveesh/hermes/Util.java | 16 ---------- .../receivers/ExponentialBackoffReceiver.java | 6 ++-- .../receivers/HermesBroadcastReceiver.java | 25 ++++++++++++--- .../hermes/receivers/HermesIntentService.java | 32 ++++++++++++------- .../hermesexample/GcmBroadcastReceiver.java | 3 ++ .../hermesexample/GcmIntentService.java | 7 ++-- .../raveesh/hermesexample/MainActivity.java | 21 +++++++----- 8 files changed, 72 insertions(+), 57 deletions(-) delete mode 100644 hermes/src/main/java/in/raveesh/hermes/Util.java diff --git a/hermes/src/main/java/in/raveesh/hermes/Hermes.java b/hermes/src/main/java/in/raveesh/hermes/Hermes.java index 193aa24..1185058 100644 --- a/hermes/src/main/java/in/raveesh/hermes/Hermes.java +++ b/hermes/src/main/java/in/raveesh/hermes/Hermes.java @@ -6,6 +6,7 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.AsyncTask; +import android.util.Log; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GooglePlayServicesUtil; @@ -43,7 +44,7 @@ public static boolean checkPlayServices(Context context) { int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(context); if (resultCode != ConnectionResult.SUCCESS) { if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)) { - Util.log("Google Play Services is not available, but the issue is User Recoverable"); + Log.d("Hermes", "Google Play Services is not available, but the issue is User Recoverable"); if (context instanceof Activity) { GooglePlayServicesUtil.getErrorDialog(resultCode, (Activity) context, PLAY_SERVICES_RESOLUTION_REQUEST).show(); } @@ -51,7 +52,7 @@ public static boolean checkPlayServices(Context context) { /** * TODO: Handle all issue related to non User recoverable error */ - Util.log("Non user recoverable error while checking for Play Services"); + Log.d("Hermes", "Non user recoverable error while checking for Play Services"); } return false; } @@ -72,7 +73,7 @@ public static void register(Context context, String senderID, RegistrationCallba CALLBACK = callback; } - Util.log("Registering... "); + Log.d("Hermes", "Registering... "); SENDER_ID = senderID; if (checkPlayServices(context)) { @@ -102,10 +103,10 @@ private static String getRegIdFromSharedPrefs(Context context) { final SharedPreferences prefs = getGCMPreferences(context); String registrationId = prefs.getString(PROPERTY_REG_ID, ""); if (registrationId == null || registrationId.isEmpty()) { - Util.log("Registration not found."); + Log.d("Hermes", "Registration not found."); return ""; } - Util.log("Got Reg Id from prefs"); + Log.d("Hermes", "Got Reg Id from prefs"); // Check if app was updated; if so, it must clear the registration ID // since the existing registration ID is not guaranteed to work with @@ -113,7 +114,7 @@ private static String getRegIdFromSharedPrefs(Context context) { int registeredVersion = prefs.getInt(PROPERTY_APP_VERSION, Integer.MIN_VALUE); int currentVersion = getAppVersion(context); if (registeredVersion != currentVersion) { - Util.log("App version changed."); + Log.d("Hermes", "App version changed."); return ""; } return registrationId; @@ -157,7 +158,7 @@ private static void registerInBackground(final Context context) { if (CALLBACK != null){ CALLBACK.registrationProcessStarted(); } - Util.log("Registers the application with GCM servers asynchronously"); + Log.d("Hermes", "Registers the application with GCM servers asynchronously"); new AsyncTask() { @Override @@ -169,7 +170,7 @@ protected String doInBackground(Object[] params) { } regID = gcm.register(SENDER_ID); msg = "Device registered, registration ID=" + regID; - Util.log("From Async - "+msg); + Log.d("Hermes", "From Async - "+msg); // You should send the registration ID to your server over HTTP, // so it can use GCM/HTTP or CCS to send messages to your app. // The request to your server should be authenticated if your app @@ -208,7 +209,7 @@ protected String doInBackground(Object[] params) { private void storeRegistrationId(Context context, String regId) { final SharedPreferences prefs = getGCMPreferences(context); int appVersion = getAppVersion(context); - Util.log("Saving regId on app version " + appVersion); + Log.d("Hermes", "Saving regId on app version " + appVersion); SharedPreferences.Editor editor = prefs.edit(); editor.putString(PROPERTY_REG_ID, regId); editor.putInt(PROPERTY_APP_VERSION, appVersion); diff --git a/hermes/src/main/java/in/raveesh/hermes/Util.java b/hermes/src/main/java/in/raveesh/hermes/Util.java deleted file mode 100644 index e94a94c..0000000 --- a/hermes/src/main/java/in/raveesh/hermes/Util.java +++ /dev/null @@ -1,16 +0,0 @@ -package in.raveesh.hermes; - -import android.annotation.SuppressLint; -import android.util.Log; - -/** - * Created by sahil on 15/5/15. - */ -public class Util { - public static final String LOG_TAG = "in.raveesh.hermesexample"; - - @SuppressLint("LongLogTag") - public static void log(String message) { - Log.d(LOG_TAG, message); - } -} diff --git a/hermes/src/main/java/in/raveesh/hermes/receivers/ExponentialBackoffReceiver.java b/hermes/src/main/java/in/raveesh/hermes/receivers/ExponentialBackoffReceiver.java index e228494..96b7a97 100644 --- a/hermes/src/main/java/in/raveesh/hermes/receivers/ExponentialBackoffReceiver.java +++ b/hermes/src/main/java/in/raveesh/hermes/receivers/ExponentialBackoffReceiver.java @@ -5,9 +5,9 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; +import android.util.Log; import in.raveesh.hermes.Hermes; -import in.raveesh.hermes.Util; public class ExponentialBackoffReceiver extends BroadcastReceiver { private static String ACTION = "in.raveesh.hermes.receivers.EXPONENTIAL_BACKOFF"; @@ -22,7 +22,7 @@ public static void attemptRegistration(Context context, int time, String sender_ PendingIntent pendingIntent = PendingIntent.getBroadcast(context, time, intent, PendingIntent.FLAG_UPDATE_CURRENT); AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); manager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + time, pendingIntent); - Util.log("Exponential Backoff Set for " + time); + Log.d("Hermes", "Exponential Backoff Set for " + time); if (Hermes.CALLBACK != null){ Hermes.CALLBACK.setExponentialBackoff(time); } @@ -37,7 +37,7 @@ public void onReceive(Context context, Intent intent) { if (Hermes.CALLBACK != null){ Hermes.CALLBACK.backoffComplete(backedOff); } - Util.log("Exponential backoff complete after " + backedOff); + Log.d("Hermes", "Exponential backoff complete after " + backedOff); Hermes.register(context, intent.getStringExtra(EXTRA_SENDER_ID)); Hermes.setDelay(backedOff*2); } diff --git a/hermes/src/main/java/in/raveesh/hermes/receivers/HermesBroadcastReceiver.java b/hermes/src/main/java/in/raveesh/hermes/receivers/HermesBroadcastReceiver.java index 3cd3b96..c105f68 100644 --- a/hermes/src/main/java/in/raveesh/hermes/receivers/HermesBroadcastReceiver.java +++ b/hermes/src/main/java/in/raveesh/hermes/receivers/HermesBroadcastReceiver.java @@ -5,18 +5,35 @@ import android.content.Context; import android.content.Intent; import android.support.v4.content.WakefulBroadcastReceiver; - -import in.raveesh.hermes.Util; - +import android.util.Log; + +/** + * This {@code HermesBroadcastReceiver} takes care of creating and managing a + * partial wake lock for your app. It passes off the work of processing the GCM + * message to {@code HermesIntentService}. + * + * The wakelock is release when {@code HermesIntentService} calls + * {@code completeWakefulIntent()} + * + */ public class HermesBroadcastReceiver extends WakefulBroadcastReceiver { private Class intentService; public HermesBroadcastReceiver() { } + /** + * This sets the class which should be called when the GCM message is + * received. + * This method should be called when creating the BroadcastReceiver, preferably in the + * constructor. When {@code onReceive} is called, the @param intentService class would + * be called to process the message + * @param intentService the intent service class which should be called to process the gcm + * message. Should extend {@code HermesIntentService} + */ public void setIntentService(Class intentService) { this.intentService = intentService; - Util.log("Setting intentService class to - "+intentService); + Log.d("Hermes", "Setting intentService class to - " + intentService); } @Override diff --git a/hermes/src/main/java/in/raveesh/hermes/receivers/HermesIntentService.java b/hermes/src/main/java/in/raveesh/hermes/receivers/HermesIntentService.java index b17dfa9..8d6bfdc 100644 --- a/hermes/src/main/java/in/raveesh/hermes/receivers/HermesIntentService.java +++ b/hermes/src/main/java/in/raveesh/hermes/receivers/HermesIntentService.java @@ -2,14 +2,22 @@ import android.app.IntentService; import android.content.Intent; +import android.util.Log; import com.google.android.gms.gcm.GoogleCloudMessaging; import in.raveesh.hermes.Hermes; -import in.raveesh.hermes.Util; /** - * Created by sahil on 15/5/15. + * Handles the intent which contains the GCM message. + * It holds the wake lock started by {@code HermesBroadcastReceiver} while + * doing the computation and finally releases it by calling + * {@code completeWakefulIntent()} + * + * This class is abstract and methods + * {@code messageReceived}, {@code messageDeleted}, {@code messageSendError}, + * {@code messageSendEvent} should be overridden in the subclass. + * */ public abstract class HermesIntentService extends IntentService{ protected boolean gotRegistrationId = false; @@ -22,11 +30,9 @@ public HermesIntentService(String name) { @Override protected void onHandleIntent(Intent intent) { - Util.log("HermesIntentService intent - " + intent); + Log.d("Hermes", "Received intent in HermesIntentService with action - "+intent.getAction()); if(intent.getAction().equals("com.google.android.c2dm.intent.REGISTRATION")) { - Util.log("HermesIntentService action - REGISTRATION"); - registrationID = intent.getStringExtra("registration_id"); if (registrationID != null) { gotRegistrationId = true; @@ -39,29 +45,31 @@ protected void onHandleIntent(Intent intent) { Hermes.CALLBACK.registrationFailed(intent.getExtras().get("error").toString()); } + // Registration message was received but was error. ExponentialBackoffReceiver.attemptRegistration(this, Hermes.getDelay(), Hermes.getSenderId()); } } else if(intent.getAction().equals("com.google.android.c2dm.intent.RECEIVE")) { - Util.log("HermesIntentService action - RECEIVE"); - GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this); String messageType = gcm.getMessageType(intent); - Util.log("HermesIntentService messageType - " + messageType); + // Logging and calling the appropriate abstract method. if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals(messageType)) { - Util.log("Message Received"); + Log.d("Hermes", "Message Received"); messageReceived(); } else if (GoogleCloudMessaging.MESSAGE_TYPE_DELETED.equals(messageType)) { - Util.log("Message Deleted"); + Log.d("Hermes", "Message Deleted"); messageDeleted(); } else if (GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR.equals(messageType)) { - Util.log("Message Send Error"); + Log.d("Hermes", "Message Send Error"); messageSendError(); } else if (GoogleCloudMessaging.MESSAGE_TYPE_SEND_EVENT.equals(messageType)) { - Util.log("Message Send Event"); + Log.d("Hermes", "Message Send Event"); messageSendEvent(); } } + + // Release the wake lock provided by the WakefulBroadcastReceiver. + HermesBroadcastReceiver.completeWakefulIntent(intent); } public abstract void messageReceived(); diff --git a/hermesexample/src/main/java/in/raveesh/hermesexample/GcmBroadcastReceiver.java b/hermesexample/src/main/java/in/raveesh/hermesexample/GcmBroadcastReceiver.java index 2514ad9..70c962b 100644 --- a/hermesexample/src/main/java/in/raveesh/hermesexample/GcmBroadcastReceiver.java +++ b/hermesexample/src/main/java/in/raveesh/hermesexample/GcmBroadcastReceiver.java @@ -7,6 +7,9 @@ public class GcmBroadcastReceiver extends HermesBroadcastReceiver { public GcmBroadcastReceiver() { + // IMPORTANT + // Call this with the intentservice class you want to start + // Refer javadoc for more info. setIntentService(GcmIntentService.class); } diff --git a/hermesexample/src/main/java/in/raveesh/hermesexample/GcmIntentService.java b/hermesexample/src/main/java/in/raveesh/hermesexample/GcmIntentService.java index b40f3a9..c7b4e91 100644 --- a/hermesexample/src/main/java/in/raveesh/hermesexample/GcmIntentService.java +++ b/hermesexample/src/main/java/in/raveesh/hermesexample/GcmIntentService.java @@ -1,13 +1,10 @@ package in.raveesh.hermesexample; import android.content.Intent; +import android.util.Log; -import in.raveesh.hermes.Util; import in.raveesh.hermes.receivers.HermesIntentService; -/** - * Created by sahil on 15/5/15. - */ public class GcmIntentService extends HermesIntentService { public GcmIntentService() { @@ -21,7 +18,7 @@ protected void onHandleIntent(Intent intent) { @Override public void messageReceived() { - Util.log("Message Received in overridden method"); + Log.d("HermesExample", "Message Received in overridden method"); } @Override diff --git a/hermesexample/src/main/java/in/raveesh/hermesexample/MainActivity.java b/hermesexample/src/main/java/in/raveesh/hermesexample/MainActivity.java index 5eeca9d..f44d953 100644 --- a/hermesexample/src/main/java/in/raveesh/hermesexample/MainActivity.java +++ b/hermesexample/src/main/java/in/raveesh/hermesexample/MainActivity.java @@ -2,11 +2,11 @@ import android.os.Bundle; import android.support.v7.app.AppCompatActivity; +import android.util.Log; import android.widget.TextView; import in.raveesh.hermes.Hermes; import in.raveesh.hermes.RegistrationCallback; -import in.raveesh.hermes.Util; public class MainActivity extends AppCompatActivity implements RegistrationCallback{ @@ -24,21 +24,26 @@ protected void onCreate(Bundle savedInstanceState) { @Override protected void onResume(){ - Util.log("onResume"); + Log.d("HermesExample", "onResume"); super.onResume(); Hermes.register(this, "893452105076"); } @Override protected void onPause(){ - Util.log("onPause"); + Log.d("HermesExample", "onPause"); super.onPause(); Hermes.pause(this); } + /** + * Run all the UI changes task on the UI thread as these calls are called from a + * different thread from asynctask in {@code Hermes} + */ + @Override public void registrationComplete(final String id) { - Util.log("registrationComplete"); + Log.d("HermesExample", "registrationComplete"); this.runOnUiThread(new Runnable() { @Override public void run() { @@ -49,7 +54,7 @@ public void run() { @Override public void registrationProcessStarted() { - Util.log("registrationProcessStarted"); + Log.d("HermesExample", "registrationProcessStarted"); this.runOnUiThread(new Runnable() { @Override public void run() { @@ -60,7 +65,7 @@ public void run() { @Override public void registrationFailed(final String msg) { - Util.log("registrationFailed"); + Log.d("HermesExample", "registrationFailed"); this.runOnUiThread(new Runnable() { @Override public void run() { @@ -71,7 +76,7 @@ public void run() { @Override public void setExponentialBackoff(final int time) { - Util.log("setExponentialBackoff"); + Log.d("HermesExample", "setExponentialBackoff"); this.runOnUiThread(new Runnable() { @Override public void run() { @@ -82,7 +87,7 @@ public void run() { @Override public void backoffComplete(final int time) { - Util.log("backoffComplete"); + Log.d("HermesExample", "backoffComplete"); this.runOnUiThread(new Runnable() { @Override public void run() {