Skip to content

Commit

Permalink
Press the button for C2DM Registration.
Browse files Browse the repository at this point in the history
  • Loading branch information
joemoore committed Sep 25, 2011
1 parent dcad26c commit 09a595d
Show file tree
Hide file tree
Showing 12 changed files with 213 additions and 127 deletions.
7 changes: 5 additions & 2 deletions AndroidManifest.xml
Expand Up @@ -11,15 +11,18 @@
<uses-permission android:name="com.pivot13.permission.C2D_MESSAGE"/>
<!-- This app has permission to register and receive message -->
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>
<!-- C2DM needs this permission or else C2DM Registration will crash -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<!-- Send the registration id to the server. Many apps will want this permission even when C2DM is not needed. -->
<uses-permission android:name="android.permission.INTERNET"/>

<!-- End of C2DM permissions -->

<application
android:label="@string/app_name"
android:icon="@drawable/icon"
android:name=".MySampleApplication">
<activity android:name=".StarterActivity"
android:name=".C2DeMoApplication">
<activity android:name=".HomeActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
Expand Down
35 changes: 22 additions & 13 deletions res/layout/home.xml
@@ -1,18 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@android:color/white"
>
<TextView
android:id="@+id/title"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<TextView
android:id="@+id/current_time"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<TextView
android:id="@+id/title"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="@android:color/black"
android:textSize="20dip"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="10dip"
android:text="C2DeMo"
/>

<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/registerButton"
android:text="Register"
/>

</LinearLayout>

55 changes: 52 additions & 3 deletions 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;
Expand All @@ -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);
}

/**
Expand All @@ -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!!!!!!!!!!!!!!!!!!!!!!!!");
}

/**
Expand All @@ -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();
}
});
}

/**
Expand All @@ -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();
}
});
}

/**
Expand Down
Expand Up @@ -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
Expand Down
35 changes: 35 additions & 0 deletions 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);
}
}
}
27 changes: 0 additions & 27 deletions src/com/pivot13/StarterActivity.java

This file was deleted.

48 changes: 41 additions & 7 deletions 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)
Expand All @@ -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
Expand Down
54 changes: 54 additions & 0 deletions 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.<Parcelable>getParcelableExtra("app")).not.toBeNull();
expect(intent.getStringExtra("sender")).toEqual(C2DeMoApplication.C2DM_SENDER_KEY);
expect(intent.getAction()).toEqual("com.google.android.c2dm.intent.REGISTER");
}
}
19 changes: 0 additions & 19 deletions test/java/com/pivot13/StarterActivityTest.java

This file was deleted.

0 comments on commit 09a595d

Please sign in to comment.