diff --git a/briar-android/src/main/AndroidManifest.xml b/briar-android/src/main/AndroidManifest.xml index ffac6071b..e325e8aca 100644 --- a/briar-android/src/main/AndroidManifest.xml +++ b/briar-android/src/main/AndroidManifest.xml @@ -343,7 +343,13 @@ + android:excludeFromRecents="true" + android:exported="false" + android:finishOnTaskLaunch="true" + android:label="@string/startup_failed_activity_title" + android:launchMode="singleInstance" + android:process=":briar_startup_failure" + android:windowSoftInputMode="adjustResize|stateHidden" /> { - NotificationCompat.Builder b = new NotificationCompat.Builder( - BriarService.this, FAILURE_CHANNEL_ID); - b.setSmallIcon(android.R.drawable.stat_notify_error); - b.setContentTitle(getText( - R.string.startup_failed_notification_title)); - b.setContentText(getText( - R.string.startup_failed_notification_text)); - Intent i = new Intent(BriarService.this, - StartupFailureActivity.class); - i.setFlags(FLAG_ACTIVITY_NEW_TASK); - i.putExtra(EXTRA_START_RESULT, result); - i.putExtra(EXTRA_NOTIFICATION_ID, FAILURE_NOTIFICATION_ID); - b.setContentIntent(PendingIntent.getActivity(BriarService.this, - 0, i, FLAG_UPDATE_CURRENT)); - NotificationManager nm = (NotificationManager) - requireNonNull(getSystemService(NOTIFICATION_SERVICE)); - nm.notify(FAILURE_NOTIFICATION_ID, b.build()); - // Bring the dashboard to the front to clear the back stack - i = new Intent(BriarService.this, ENTRY_ACTIVITY); + // Bring the entry activity to the front to clear the back stack + Intent i = new Intent(BriarService.this, ENTRY_ACTIVITY); i.setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TOP); i.putExtra(EXTRA_STARTUP_FAILED, true); + i.putExtra(EXTRA_START_RESULT, result); startActivity(i); }); } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/StartupFailureActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/StartupFailureActivity.java index 5f1e29fa2..6cfdc2565 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/StartupFailureActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/StartupFailureActivity.java @@ -1,6 +1,5 @@ package org.briarproject.briar.android; -import android.app.NotificationManager; import android.content.Intent; import android.os.Bundle; @@ -15,9 +14,7 @@ import org.briarproject.briar.android.fragment.ErrorFragment; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import static java.util.Objects.requireNonNull; import static org.briarproject.bramble.api.lifecycle.LifecycleManager.StartResult; -import static org.briarproject.briar.android.BriarService.EXTRA_NOTIFICATION_ID; import static org.briarproject.briar.android.BriarService.EXTRA_START_RESULT; @MethodsNotNullByDefault @@ -41,14 +38,6 @@ public class StartupFailureActivity extends BaseActivity implements private void handleIntent(Intent i) { StartResult result = (StartResult) i.getSerializableExtra(EXTRA_START_RESULT); - int notificationId = i.getIntExtra(EXTRA_NOTIFICATION_ID, -1); - - // cancel notification - if (notificationId > -1) { - Object o = getSystemService(NOTIFICATION_SERVICE); - NotificationManager nm = (NotificationManager) requireNonNull(o); - nm.cancel(notificationId); - } // show proper error message int errorRes; @@ -78,5 +67,4 @@ public class StartupFailureActivity extends BaseActivity implements public void runOnDbThread(@NonNull Runnable runnable) { throw new UnsupportedOperationException(); } - } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerActivity.java index 557d4b677..893560485 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerActivity.java @@ -29,6 +29,7 @@ import org.briarproject.bramble.api.plugin.TorConstants; import org.briarproject.bramble.api.plugin.TransportId; import org.briarproject.briar.R; import org.briarproject.briar.android.BriarApplication; +import org.briarproject.briar.android.StartupFailureActivity; import org.briarproject.briar.android.activity.ActivityComponent; import org.briarproject.briar.android.activity.BriarActivity; import org.briarproject.briar.android.blog.FeedFragment; @@ -73,6 +74,7 @@ import static org.briarproject.bramble.api.plugin.Plugin.State.ACTIVE; import static org.briarproject.bramble.api.plugin.Plugin.State.ENABLING; import static org.briarproject.bramble.api.plugin.Plugin.State.STARTING_STOPPING; import static org.briarproject.briar.android.BriarService.EXTRA_STARTUP_FAILED; +import static org.briarproject.briar.android.BriarService.EXTRA_START_RESULT; import static org.briarproject.briar.android.TestingConstants.IS_DEBUG_BUILD; import static org.briarproject.briar.android.activity.RequestCodes.REQUEST_PASSWORD; import static org.briarproject.briar.android.navdrawer.IntentRouter.handleExternalIntent; @@ -250,6 +252,11 @@ public class NavDrawerActivity extends BriarActivity implements private void exitIfStartupFailed(Intent intent) { if (intent.getBooleanExtra(EXTRA_STARTUP_FAILED, false)) { + // Launch StartupFailureActivity in its own process, then exit + Intent i = new Intent(this, StartupFailureActivity.class); + i.putExtra(EXTRA_START_RESULT, + intent.getSerializableExtra(EXTRA_START_RESULT)); + startActivity(i); finish(); LOG.info("Exiting"); System.exit(0); diff --git a/briar-android/src/main/java/org/briarproject/briar/api/android/AndroidNotificationManager.java b/briar-android/src/main/java/org/briarproject/briar/api/android/AndroidNotificationManager.java index 6a3a5cbb2..765425720 100644 --- a/briar-android/src/main/java/org/briarproject/briar/api/android/AndroidNotificationManager.java +++ b/briar-android/src/main/java/org/briarproject/briar/api/android/AndroidNotificationManager.java @@ -41,8 +41,10 @@ public interface AndroidNotificationManager { // that will sort below the main channels such as contacts String ONGOING_CHANNEL_OLD_ID = "zForegroundService"; String ONGOING_CHANNEL_ID = "zForegroundService2"; - String FAILURE_CHANNEL_ID = "zStartupFailure"; String REMINDER_CHANNEL_ID = "zSignInReminder"; + // This channel is no longer used - keep the ID so we can remove the + // channel from existing installations + String FAILURE_CHANNEL_ID = "zStartupFailure"; // Actions for pending intents String ACTION_DISMISS_REMINDER = "dismissReminder";