diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 64a722c..b53236b 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -11,15 +11,18 @@
+
+
+
-
+
diff --git a/res/layout/home.xml b/res/layout/home.xml
index 696e9cb..ccab870 100644
--- a/res/layout/home.xml
+++ b/res/layout/home.xml
@@ -1,18 +1,27 @@
-
-
+
+
+
+
diff --git a/src/com/pivot13/C2DMReceiver.java b/src/com/pivot13/C2DMReceiver.java
index a5f295f..c3ab11d 100644
--- a/src/com/pivot13/C2DMReceiver.java
+++ b/src/com/pivot13/C2DMReceiver.java
@@ -1,7 +1,16 @@
package com.pivot13;
+import android.app.Notification;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
+import android.content.SharedPreferences;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.SystemClock;
+import android.util.Log;
+import android.widget.Toast;
import com.google.android.c2dm.C2DMBaseReceiver;
import java.io.IOException;
@@ -17,12 +26,18 @@
*/
public class C2DMReceiver extends C2DMBaseReceiver {
+ public static final int MESSAGE_KEY = 1;
+ public static final String REG_ID = "regId";
+ public static final CharSequence REGISTRATION_SUCCESS_MESSAGE = "C2DM Registration Successful!";
+ public static final CharSequence REGISTRATION_ERROR_MESSAGE = "C2DM Registration Error: ";
+
+
/**
* The senderId is a google email address, such as a gmail address or a apps-for-your-domain gmail address.
* Use the same address when registering a device with C2DM.
*/
public C2DMReceiver() {
- super("example@a_google_acount.com");
+ super(C2DeMoApplication.C2DM_SENDER_KEY);
}
/**
@@ -42,6 +57,22 @@ public C2DMReceiver() {
*/
@Override
protected void onMessage(Context context, Intent intent) {
+
+ String message = intent.getStringExtra("message");
+ String moreData = intent.getStringExtra("moreData");
+ String notificationText = new StringBuilder()
+ .append("message: ").append(message).append("; ")
+ .append("moreData: ").append(moreData).toString();
+
+
+ Notification notification = new Notification(android.R.drawable.ic_dialog_alert, "Ticker Ticker ticker!! " + notificationText, SystemClock.currentThreadTimeMillis());
+
+ notification.setLatestEventInfo(context, "C2DeMo Message", notificationText, PendingIntent.getBroadcast(context, 0, new Intent(), 0));
+
+ NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
+
+ notificationManager.notify(MESSAGE_KEY, notification);
+ Log.v("pivot13", "************ about to notify!!!!!!!!!!!!!!!!!!!!!!!!");
}
/**
@@ -59,8 +90,19 @@ protected void onMessage(Context context, Intent intent) {
* registration_ids and might receiving duplicate notifications.
*/
@Override
- public void onRegistered(Context context, String registrationId) throws IOException {
+ public void onRegistered(final Context context, String registrationId) throws IOException {
super.onRegistered(context, registrationId);
+ SharedPreferences.Editor editor = getSharedPreferences("C2DM", 0).edit();
+ editor.putString(REG_ID, registrationId);
+ editor.commit();
+ Log.v("pivot13", registrationId);
+
+ new Handler(Looper.getMainLooper()).post(new Runnable() {
+ @Override
+ public void run() {
+ Toast.makeText(context, REGISTRATION_SUCCESS_MESSAGE, Toast.LENGTH_LONG).show();
+ }
+ });
}
/**
@@ -70,7 +112,14 @@ public void onRegistered(Context context, String registrationId) throws IOExcept
* Called on Registration error. See http://code.google.com/android/c2dm/#handling_reg
*/
@Override
- public void onError(Context context, String errorId) {
+ public void onError(final Context context, final String errorId) {
+ new Handler().post(new Runnable() {
+ @Override
+ public void run() {
+ String errorMessage = new StringBuilder().append(REGISTRATION_ERROR_MESSAGE).append(": ").append(errorId).toString();
+ Toast.makeText(context, errorMessage, Toast.LENGTH_LONG).show();
+ }
+ });
}
/**
diff --git a/src/com/pivot13/MySampleApplication.java b/src/com/pivot13/C2DeMoApplication.java
similarity index 86%
rename from src/com/pivot13/MySampleApplication.java
rename to src/com/pivot13/C2DeMoApplication.java
index 35a7924..069c115 100644
--- a/src/com/pivot13/MySampleApplication.java
+++ b/src/com/pivot13/C2DeMoApplication.java
@@ -6,7 +6,8 @@
import java.util.List;
-public class MySampleApplication extends RoboInjectableApplication {
+public class C2DeMoApplication extends RoboInjectableApplication {
+ public static final String C2DM_SENDER_KEY = "c2dm@pivot13.com";
private Module module = new ApplicationModule();
@Override
diff --git a/src/com/pivot13/HomeActivity.java b/src/com/pivot13/HomeActivity.java
new file mode 100644
index 0000000..0442e97
--- /dev/null
+++ b/src/com/pivot13/HomeActivity.java
@@ -0,0 +1,35 @@
+package com.pivot13;
+
+import android.os.Bundle;
+import android.view.View;
+import android.widget.Button;
+import com.google.android.c2dm.C2DMessaging;
+import com.google.inject.Inject;
+import com.pivot13.util.CurrentTime;
+import roboguice.activity.RoboActivity;
+import roboguice.inject.InjectView;
+
+public class HomeActivity extends RoboActivity {
+ @InjectView(R.id.registerButton)
+ Button registerButton;
+
+ @Inject
+ private CurrentTime currentTime;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.home);
+
+ registerButton.setOnClickListener(new RegisterOnClickListener());
+
+
+ }
+
+ private class RegisterOnClickListener implements View.OnClickListener {
+ @Override
+ public void onClick(View v) {
+ C2DMessaging.register(HomeActivity.this, C2DeMoApplication.C2DM_SENDER_KEY);
+ }
+ }
+}
diff --git a/src/com/pivot13/StarterActivity.java b/src/com/pivot13/StarterActivity.java
deleted file mode 100644
index 4182af5..0000000
--- a/src/com/pivot13/StarterActivity.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package com.pivot13;
-
-import android.os.Bundle;
-import android.widget.TextView;
-import com.pivot13.util.CurrentTime;
-import com.google.inject.Inject;
-import roboguice.activity.RoboActivity;
-import roboguice.inject.InjectView;
-
-public class StarterActivity extends RoboActivity {
- @InjectView(R.id.title)
- TextView title;
-
- @InjectView(R.id.current_time)
- TextView currentTimeText;
-
- @Inject
- private CurrentTime currentTime;
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.home);
- title.setText("Hello World");
- currentTimeText.setText(String.valueOf(currentTime.currentTimeMillis()));
- }
-}
diff --git a/test/java/com/pivot13/C2DMReceiverTest.java b/test/java/com/pivot13/C2DMReceiverTest.java
index 3e142a2..97b842f 100644
--- a/test/java/com/pivot13/C2DMReceiverTest.java
+++ b/test/java/com/pivot13/C2DMReceiverTest.java
@@ -1,12 +1,20 @@
package com.pivot13;
+import android.app.NotificationManager;
+import android.content.Context;
import android.content.Intent;
+import android.content.SharedPreferences;
import com.xtremelabs.robolectric.Robolectric;
import com.xtremelabs.robolectric.RobolectricTestRunner;
+import com.xtremelabs.robolectric.shadows.ShadowNotification;
+import com.xtremelabs.robolectric.shadows.ShadowNotificationManager;
+import com.xtremelabs.robolectric.shadows.ShadowToast;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import static com.pivotallabs.robolectricgem.expect.Expect.expect;
+import static com.xtremelabs.robolectric.Robolectric.shadowOf;
import static org.junit.Assert.assertTrue;
@RunWith(RobolectricTestRunner.class)
@@ -19,21 +27,47 @@ public void setup() {
}
@Test
- public void testOnMessage() throws Exception {
- c2DMReceiver.onMessage(Robolectric.application, new Intent());
- assertTrue("Implement your own tests or delete this", true);
+ public void whenC2DMMessageReceived__shouldUpdateNotificationBar() throws Exception {
+ Intent intent = new Intent()
+ .putExtra("message", "Main Message Here")
+ .putExtra("moreData", "extra data here");
+ c2DMReceiver.onMessage(Robolectric.application, intent);
+
+ NotificationManager notificationManager =
+ (NotificationManager) Robolectric.application.getSystemService(Context.NOTIFICATION_SERVICE);
+
+ ShadowNotificationManager shadowNotificationManager = shadowOf(notificationManager);
+ expect(shadowNotificationManager.size()).toEqual(1);
+
+ ShadowNotification notification = shadowOf(shadowNotificationManager.getNotification(C2DMReceiver.MESSAGE_KEY));
+ expect(notification.getLatestEventInfo().getContentTitle()).toEqual("C2DeMo Message");
+ expect(notification.getLatestEventInfo().getContentText().toString()).toContain("message: Main Message Here");
+ expect(notification.getLatestEventInfo().getContentText().toString()).toContain("moreData: extra data here");
}
@Test
- public void testOnRegistered() throws Exception {
- c2DMReceiver.onRegistered(Robolectric.application, "reg_id");
+ public void successfulRegistration__shouldStoreRegId() throws Exception {
+ c2DMReceiver.onRegistered(Robolectric.application, "testRegId");
+ SharedPreferences sharedPreferences = Robolectric.application.getSharedPreferences("C2DM", 0);
+ expect(sharedPreferences.getString(C2DMReceiver.REG_ID, null)).toEqual("testRegId");
+ }
+
+ @Test
+ public void successfulRegistration__shouldToastSuccess() throws Exception {
+ c2DMReceiver.onRegistered(Robolectric.application, "testRegId");
+ expect(ShadowToast.showedToast(C2DMReceiver.REGISTRATION_SUCCESS_MESSAGE)).toBeTrue();
+ }
+
+ @Test
+ public void successfulRegistration__shouldReplaceExistingRegId() throws Exception {
+ c2DMReceiver.onRegistered(Robolectric.application, "testRegId");
assertTrue("Implement your own tests or delete this", true);
}
@Test
- public void testOnError() throws Exception {
+ public void failedRegistration__shouldToastReason() throws Exception {
c2DMReceiver.onError(Robolectric.application, C2DMReceiver.ERR_ACCOUNT_MISSING);
- assertTrue("Implement your own tests or delete this", true);
+ expect(ShadowToast.showedToast(C2DMReceiver.REGISTRATION_ERROR_MESSAGE + ": " + C2DMReceiver.ERR_ACCOUNT_MISSING)).toBeTrue();
}
@Test
diff --git a/test/java/com/pivot13/HomeActivityTest.java b/test/java/com/pivot13/HomeActivityTest.java
new file mode 100644
index 0000000..db51690
--- /dev/null
+++ b/test/java/com/pivot13/HomeActivityTest.java
@@ -0,0 +1,54 @@
+package com.pivot13;
+
+import android.content.Intent;
+import android.os.Parcelable;
+import android.widget.Button;
+import android.widget.TextView;
+import com.google.inject.Inject;
+import com.pivot13.test.support.RobolectricTestRunnerWithInjection;
+import com.xtremelabs.robolectric.Robolectric;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import roboguice.inject.InjectView;
+
+import static com.pivotallabs.robolectricgem.expect.Expect.expect;
+import static org.junit.Assert.assertEquals;
+
+@RunWith(RobolectricTestRunnerWithInjection.class)
+public class HomeActivityTest {
+ @Inject
+ HomeActivity activity;
+
+ @InjectView(R.id.registerButton)
+ Button registerButton;
+
+
+ @Before
+ public void setup() throws Exception {
+ activity.onCreate(null);
+ }
+
+ @Test
+ public void shouldHaveATitle() {
+ final HomeActivity activity = new HomeActivity();
+ activity.onCreate(null);
+ TextView title = (TextView) activity.findViewById(R.id.title);
+ assertEquals("C2DeMo", title.getText());
+ }
+
+ @Test
+ public void shouldHaveARegisterButton() throws Exception {
+ expect(registerButton).toBeVisible();
+ }
+
+ @Test
+ public void clickingRegisterButton__shouldRegisterWithC2DMService() throws Exception {
+ expect(Robolectric.getShadowApplication().peekNextStartedService()).toBeNull();
+ Robolectric.clickOn(registerButton);
+ Intent intent = Robolectric.getShadowApplication().peekNextStartedService();
+ expect(intent.getParcelableExtra("app")).not.toBeNull();
+ expect(intent.getStringExtra("sender")).toEqual(C2DeMoApplication.C2DM_SENDER_KEY);
+ expect(intent.getAction()).toEqual("com.google.android.c2dm.intent.REGISTER");
+ }
+}
diff --git a/test/java/com/pivot13/StarterActivityTest.java b/test/java/com/pivot13/StarterActivityTest.java
deleted file mode 100644
index 8841322..0000000
--- a/test/java/com/pivot13/StarterActivityTest.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.pivot13;
-
-import android.widget.TextView;
-import com.xtremelabs.robolectric.RobolectricTestRunner;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import static org.junit.Assert.assertEquals;
-
-@RunWith(RobolectricTestRunner.class)
-public class StarterActivityTest {
- @Test
- public void shouldHaveATitle() {
- final StarterActivity activity = new StarterActivity();
- activity.onCreate(null);
- TextView title = (TextView) activity.findViewById(R.id.title);
- assertEquals("Hello World", title.getText());
- }
-}
diff --git a/test/java/com/pivot13/StarterActivityTestWithGreatExpectations.java b/test/java/com/pivot13/StarterActivityTestWithGreatExpectations.java
deleted file mode 100644
index dab727a..0000000
--- a/test/java/com/pivot13/StarterActivityTestWithGreatExpectations.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package com.pivot13;
-
-import android.widget.TextView;
-import com.xtremelabs.robolectric.RobolectricTestRunner;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.io.FileNotFoundException;
-
-import static com.pivotallabs.robolectricgem.expect.Expect.expect;
-
-
-@RunWith(RobolectricTestRunner.class)
-public class StarterActivityTestWithGreatExpectations {
- @Test
- public void shouldHaveATitle() throws FileNotFoundException {
- final StarterActivity activity = new StarterActivity();
- activity.onCreate(null);
- TextView title = (TextView) activity.findViewById(R.id.title);
- expect(title).not.toBeNull();
- expect(title.getText()).toBeInstanceOf(String.class);
- expect(title.getText()).toEqual("Hello World");
-
- // custom matcher!
- expect(title).toBeVisible();
- }
-}
diff --git a/test/java/com/pivot13/StarterActivityWithRoboguiceTest.java b/test/java/com/pivot13/StarterActivityWithRoboguiceTest.java
deleted file mode 100644
index 98151e6..0000000
--- a/test/java/com/pivot13/StarterActivityWithRoboguiceTest.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.pivot13;
-
-import android.widget.TextView;
-import com.pivot13.test.support.FakeCurrentTime;
-import com.pivot13.test.support.RobolectricTestRunnerWithInjection;
-import com.pivot13.util.CurrentTime;
-import com.google.inject.Inject;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import static org.junit.Assert.assertEquals;
-
-@RunWith(RobolectricTestRunnerWithInjection.class)
-public class StarterActivityWithRoboguiceTest {
- @Inject
- CurrentTime currentTime;
-
- @Test
- public void testCurrentTimeIsInjected() throws Exception {
- ((FakeCurrentTime) currentTime).setCurrentTime(12345L);
- final StarterActivity activity = new StarterActivity();
- activity.onCreate(null);
- TextView title = (TextView) activity.findViewById(R.id.current_time);
- assertEquals("12345", title.getText());
- }
-}
diff --git a/test/java/com/pivot13/test/support/RobolectricTestRunnerWithInjection.java b/test/java/com/pivot13/test/support/RobolectricTestRunnerWithInjection.java
index dcaa9e1..8211d15 100644
--- a/test/java/com/pivot13/test/support/RobolectricTestRunnerWithInjection.java
+++ b/test/java/com/pivot13/test/support/RobolectricTestRunnerWithInjection.java
@@ -1,6 +1,6 @@
package com.pivot13.test.support;
-import com.pivot13.MySampleApplication;
+import com.pivot13.C2DeMoApplication;
import com.pivot13.util.CurrentTime;
import com.xtremelabs.robolectric.Robolectric;
import com.xtremelabs.robolectric.RobolectricTestRunner;
@@ -15,7 +15,7 @@ public RobolectricTestRunnerWithInjection(Class> testClass) throws Initializat
@Override
public void prepareTest(Object test) {
- MySampleApplication application = (MySampleApplication) Robolectric.application;
+ C2DeMoApplication application = (C2DeMoApplication) Robolectric.application;
application.setModule(new TestApplicationModule());
application.getInjector().injectMembers(test);
}