diff --git a/briar-android/src/main/AndroidManifest.xml b/briar-android/src/main/AndroidManifest.xml
index 27956ce43..edcea26a7 100644
--- a/briar-android/src/main/AndroidManifest.xml
+++ b/briar-android/src/main/AndroidManifest.xml
@@ -99,6 +99,10 @@
android:name="org.briarproject.briar.android.splash.ExpiredActivity"
android:label="@string/app_name" />
+
+
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/activity/ActivityComponent.java b/briar-android/src/main/java/org/briarproject/briar/android/activity/ActivityComponent.java
index 8c0a30735..43baf5816 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/activity/ActivityComponent.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/activity/ActivityComponent.java
@@ -80,6 +80,7 @@ import org.briarproject.briar.android.sharing.ShareBlogFragment;
import org.briarproject.briar.android.sharing.ShareForumActivity;
import org.briarproject.briar.android.sharing.ShareForumFragment;
import org.briarproject.briar.android.sharing.SharingModule;
+import org.briarproject.briar.android.splash.ExpiredOldAndroidActivity;
import org.briarproject.briar.android.splash.SplashScreenActivity;
import org.briarproject.briar.android.test.TestDataActivity;
@@ -182,6 +183,8 @@ public interface ActivityComponent {
void inject(RemovableDriveActivity activity);
+ void inject(ExpiredOldAndroidActivity activity);
+
// Fragments
void inject(SetupFragment fragment);
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/splash/ExpiredOldAndroidActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/splash/ExpiredOldAndroidActivity.java
new file mode 100644
index 000000000..43cf53988
--- /dev/null
+++ b/briar-android/src/main/java/org/briarproject/briar/android/splash/ExpiredOldAndroidActivity.java
@@ -0,0 +1,57 @@
+package org.briarproject.briar.android.splash;
+
+import android.content.Intent;
+import android.os.Bundle;
+
+import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
+import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
+import org.briarproject.bramble.api.system.AndroidWakeLockManager;
+import org.briarproject.briar.R;
+import org.briarproject.briar.android.activity.ActivityComponent;
+import org.briarproject.briar.android.activity.BaseActivity;
+import org.briarproject.briar.android.controller.BriarController;
+import org.briarproject.briar.android.logout.ExitActivity;
+
+import javax.annotation.Nullable;
+import javax.inject.Inject;
+
+import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK;
+import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS;
+import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
+import static android.content.Intent.FLAG_ACTIVITY_NO_ANIMATION;
+
+@MethodsNotNullByDefault
+@ParametersNotNullByDefault
+public class ExpiredOldAndroidActivity extends BaseActivity {
+
+ @Inject
+ BriarController briarController;
+ @Inject
+ AndroidWakeLockManager wakeLockManager;
+
+ @Override
+ public void onCreate(@Nullable Bundle state) {
+ super.onCreate(state);
+
+ setContentView(R.layout.activity_expired_old_android);
+ findViewById(R.id.delete_account_button).setOnClickListener(v -> {
+ // Hold a wake lock to ensure we exit before the device goes to sleep
+ wakeLockManager.runWakefully(() -> {
+ // we're not signed in, just go ahead and delete
+ briarController.deleteAccount();
+ // remove from recent apps
+ Intent i = new Intent(this, ExitActivity.class);
+ i.addFlags(FLAG_ACTIVITY_NEW_TASK
+ | FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
+ | FLAG_ACTIVITY_NO_ANIMATION
+ | FLAG_ACTIVITY_CLEAR_TASK);
+ startActivity(i);
+ }, "DeleteAccount");
+ });
+ }
+
+ @Override
+ public void injectActivity(ActivityComponent component) {
+ component.inject(this);
+ }
+}
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/splash/SplashScreenActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/splash/SplashScreenActivity.java
index 81b3e75c6..b8905f764 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/splash/SplashScreenActivity.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/splash/SplashScreenActivity.java
@@ -65,9 +65,14 @@ public class SplashScreenActivity extends BaseActivity {
int duration =
getResources().getInteger(R.integer.splashScreenDuration);
new Handler().postDelayed(() -> {
- if (IS_DEBUG_BUILD && currentTimeMillis() >= EXPIRY_DATE) {
- LOG.info("Expired");
- startNextActivity(ExpiredActivity.class);
+ if (currentTimeMillis() >= EXPIRY_DATE) {
+ if (IS_DEBUG_BUILD) {
+ LOG.info("Expired: debug build");
+ startNextActivity(ExpiredActivity.class);
+ } else {
+ LOG.info("Expired: running on old Android");
+ startNextActivity(ExpiredOldAndroidActivity.class);
+ }
} else {
startNextActivity(ENTRY_ACTIVITY);
}
diff --git a/briar-android/src/main/res/layout/activity_expired_old_android.xml b/briar-android/src/main/res/layout/activity_expired_old_android.xml
new file mode 100644
index 000000000..2d21398ae
--- /dev/null
+++ b/briar-android/src/main/res/layout/activity_expired_old_android.xml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/briar-android/src/main/res/values/strings.xml b/briar-android/src/main/res/values/strings.xml
index 41a5fc249..e2842fc44 100644
--- a/briar-android/src/main/res/values/strings.xml
+++ b/briar-android/src/main/res/values/strings.xml
@@ -64,6 +64,9 @@
To continue using Briar, please download the latest release.
You will need to create a new account, but you can use the same nickname.
Download Latest Release
+ Briar no longer runs on Android 4.\nPlease install Briar on a newer device.
+ You can tap the button below to delete your account from this device.
+ Delete Account
Decrypting Database…
Upgrading Database…
Compacting Database…