diff --git a/AndroidManifest.xml b/AndroidManifest.xml index fc0db3909b..ec2b841187 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -208,13 +208,14 @@ android:clearTaskOnLaunch="true" android:finishOnTaskLaunch="true" /> - + + - - + + Permanent TextSecure communication failure! + TextSecure was unable to register with Google Play Services. Communication over the data channel has been disabled, please try re-registering from the TextSecure settings menu. + New group Update group diff --git a/src/org/thoughtcrime/securesms/PlayServicesProblemActivity.java b/src/org/thoughtcrime/securesms/PlayServicesProblemActivity.java new file mode 100644 index 0000000000..216fab99f3 --- /dev/null +++ b/src/org/thoughtcrime/securesms/PlayServicesProblemActivity.java @@ -0,0 +1,30 @@ +/** + * Copyright (C) 2014 Open Whisper Systems + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.thoughtcrime.securesms; + +import android.os.Bundle; +import android.support.v4.app.FragmentActivity; + +public class PlayServicesProblemActivity extends FragmentActivity { + + @Override + public void onCreate(Bundle bundle) { + super.onCreate(bundle); + PlayServicesProblemFragment fragment = new PlayServicesProblemFragment(); + fragment.show(getSupportFragmentManager(), "dialog"); + } +} diff --git a/src/org/thoughtcrime/securesms/PlayServicesProblemFragment.java b/src/org/thoughtcrime/securesms/PlayServicesProblemFragment.java new file mode 100644 index 0000000000..aebec3b700 --- /dev/null +++ b/src/org/thoughtcrime/securesms/PlayServicesProblemFragment.java @@ -0,0 +1,35 @@ +/** + * Copyright (C) 2014 Open Whisper Systems + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.thoughtcrime.securesms; + +import android.app.Dialog; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.v4.app.DialogFragment; + +import com.google.android.gms.common.GooglePlayServicesUtil; + +public class PlayServicesProblemFragment extends DialogFragment { + + @Override + public Dialog onCreateDialog(@NonNull Bundle bundle) { + int code = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getActivity()); + return GooglePlayServicesUtil.getErrorDialog(code, getActivity(), 9111); + } + +} diff --git a/src/org/thoughtcrime/securesms/jobs/GcmRefreshJob.java b/src/org/thoughtcrime/securesms/jobs/GcmRefreshJob.java index 4d78773a49..ab50ff98cc 100644 --- a/src/org/thoughtcrime/securesms/jobs/GcmRefreshJob.java +++ b/src/org/thoughtcrime/securesms/jobs/GcmRefreshJob.java @@ -1,13 +1,35 @@ +/** + * Copyright (C) 2014 Open Whisper Systems + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.thoughtcrime.securesms.jobs; +import android.app.NotificationManager; +import android.app.PendingIntent; import android.content.Context; +import android.content.Intent; +import android.graphics.BitmapFactory; +import android.support.v4.app.NotificationCompat; import android.util.Log; -import android.widget.Toast; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GooglePlayServicesUtil; import com.google.android.gms.gcm.GoogleCloudMessaging; +import org.thoughtcrime.securesms.PlayServicesProblemActivity; +import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.push.TextSecureCommunicationFactory; import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.whispersystems.jobqueue.JobParameters; @@ -31,22 +53,22 @@ public class GcmRefreshJob extends ContextJob { @Override public void onRun() throws Exception { - String registrationId = TextSecurePreferences.getGcmRegistrationId(context); + TextSecureAccountManager accountManager = TextSecureCommunicationFactory.createManager(context); + String registrationId = TextSecurePreferences.getGcmRegistrationId(context); if (registrationId == null) { Log.w(TAG, "GCM registrationId expired, reregistering..."); int result = GooglePlayServicesUtil.isGooglePlayServicesAvailable(context); if (result != ConnectionResult.SUCCESS) { - Toast.makeText(context, "Unable to register with GCM!", Toast.LENGTH_LONG).show(); + notifyGcmFailure(); + accountManager.setGcmId(Optional.absent()); + TextSecurePreferences.setPushRegistered(context, false); + } else { + String gcmId = GoogleCloudMessaging.getInstance(context).register(REGISTRATION_ID); + accountManager.setGcmId(Optional.of(gcmId)); + TextSecurePreferences.setGcmRegistrationId(context, gcmId); } - - String gcmId = GoogleCloudMessaging.getInstance(context).register(REGISTRATION_ID); - TextSecureAccountManager accountManager = TextSecureCommunicationFactory.createManager(context); - - accountManager.setGcmId(Optional.of(gcmId)); - - TextSecurePreferences.setGcmRegistrationId(context, gcmId); } } @@ -61,4 +83,21 @@ public class GcmRefreshJob extends ContextJob { return true; } + private void notifyGcmFailure() { + Intent intent = new Intent(context, PlayServicesProblemActivity.class); + PendingIntent pendingIntent = PendingIntent.getActivity(context, 1122, intent, PendingIntent.FLAG_CANCEL_CURRENT); + NotificationCompat.Builder builder = new NotificationCompat.Builder(context); + + builder.setSmallIcon(R.drawable.icon_notification); + builder.setLargeIcon(BitmapFactory.decodeResource(context.getResources(), + R.drawable.ic_action_warning_red)); + builder.setContentTitle(context.getString(R.string.GcmRefreshJob_Permanent_TextSecure_communication_failure)); + builder.setContentText(context.getString(R.string.GcmRefreshJob_TextSecure_was_unable_to_register_with_Google_Play_Services)); + builder.setTicker(context.getString(R.string.GcmRefreshJob_Permanent_TextSecure_communication_failure)); + builder.setContentIntent(pendingIntent); + + ((NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE)) + .notify(12, builder.build()); + } + }