From 6ff0f317a5d788fa1a7412f776e3ed2335488383 Mon Sep 17 00:00:00 2001
From: akwizgran <michael@briarproject.org>
Date: Wed, 21 Mar 2018 14:31:12 +0000
Subject: [PATCH] Shut down cleanly when memory is low.

---
 briar-android/src/main/AndroidManifest.xml    |  7 ++++-
 .../briar/android/BriarService.java           | 28 ++++++++++++++++++-
 .../briar/android/activity/BriarActivity.java |  2 +-
 .../{panic => logout}/ExitActivity.java       |  2 +-
 .../briar/android/logout/HideUiActivity.java  | 20 +++++++++++++
 .../{fragment => logout}/SignOutFragment.java |  6 ++--
 .../android/navdrawer/NavDrawerActivity.java  |  2 +-
 7 files changed, 60 insertions(+), 7 deletions(-)
 rename briar-android/src/main/java/org/briarproject/briar/android/{panic => logout}/ExitActivity.java (92%)
 create mode 100644 briar-android/src/main/java/org/briarproject/briar/android/logout/HideUiActivity.java
 rename briar-android/src/main/java/org/briarproject/briar/android/{fragment => logout}/SignOutFragment.java (77%)

diff --git a/briar-android/src/main/AndroidManifest.xml b/briar-android/src/main/AndroidManifest.xml
index 102de1290c..cc195722b5 100644
--- a/briar-android/src/main/AndroidManifest.xml
+++ b/briar-android/src/main/AndroidManifest.xml
@@ -374,7 +374,12 @@
 		</activity>
 
 		<activity
-			android:name="org.briarproject.briar.android.panic.ExitActivity"
+			android:name="org.briarproject.briar.android.logout.ExitActivity"
+			android:theme="@android:style/Theme.NoDisplay">
+		</activity>
+
+		<activity
+			android:name=".android.logout.HideUiActivity"
 			android:theme="@android:style/Theme.NoDisplay">
 		</activity>
 
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/BriarService.java b/briar-android/src/main/java/org/briarproject/briar/android/BriarService.java
index 8e1abd66a2..633a9f3c21 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/BriarService.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/BriarService.java
@@ -17,6 +17,7 @@ import org.briarproject.bramble.api.lifecycle.LifecycleManager;
 import org.briarproject.bramble.api.lifecycle.LifecycleManager.StartResult;
 import org.briarproject.bramble.api.system.AndroidExecutor;
 import org.briarproject.briar.R;
+import org.briarproject.briar.android.logout.HideUiActivity;
 import org.briarproject.briar.android.navdrawer.NavDrawerActivity;
 
 import java.util.concurrent.CountDownLatch;
@@ -28,8 +29,11 @@ import javax.inject.Inject;
 import static android.app.NotificationManager.IMPORTANCE_DEFAULT;
 import static android.app.NotificationManager.IMPORTANCE_NONE;
 import static android.app.PendingIntent.FLAG_UPDATE_CURRENT;
+import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK;
 import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP;
+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;
 import static android.os.Build.VERSION.SDK_INT;
 import static android.support.v4.app.NotificationCompat.CATEGORY_SERVICE;
 import static android.support.v4.app.NotificationCompat.PRIORITY_MIN;
@@ -194,7 +198,29 @@ public class BriarService extends Service {
 	public void onLowMemory() {
 		super.onLowMemory();
 		LOG.warning("Memory is low");
-		// FIXME: Work out what to do about it
+		shutdownFromBackground();
+	}
+
+	private void shutdownFromBackground() {
+		// Stop the service
+		stopSelf();
+		// Hide the UI
+		Intent i = new Intent(this, HideUiActivity.class);
+		i.addFlags(FLAG_ACTIVITY_NEW_TASK
+				| FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
+				| FLAG_ACTIVITY_NO_ANIMATION
+				| FLAG_ACTIVITY_CLEAR_TASK);
+		startActivity(i);
+		// Wait for shutdown to complete, then exit
+		new Thread(() -> {
+			try {
+				if (started) lifecycleManager.waitForShutdown();
+			} catch (InterruptedException e) {
+				LOG.info("Interrupted while waiting for shutdown");
+			}
+			LOG.info("Exiting");
+			System.exit(0);
+		}).start();
 	}
 
 	/**
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/activity/BriarActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/activity/BriarActivity.java
index 4996961820..d557e717fc 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/activity/BriarActivity.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/activity/BriarActivity.java
@@ -16,7 +16,7 @@ import org.briarproject.briar.android.controller.BriarController;
 import org.briarproject.briar.android.controller.DbController;
 import org.briarproject.briar.android.controller.handler.UiResultHandler;
 import org.briarproject.briar.android.login.PasswordActivity;
-import org.briarproject.briar.android.panic.ExitActivity;
+import org.briarproject.briar.android.logout.ExitActivity;
 
 import java.util.logging.Logger;
 
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/panic/ExitActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/logout/ExitActivity.java
similarity index 92%
rename from briar-android/src/main/java/org/briarproject/briar/android/panic/ExitActivity.java
rename to briar-android/src/main/java/org/briarproject/briar/android/logout/ExitActivity.java
index bd027c39c0..78c0a57e9f 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/panic/ExitActivity.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/logout/ExitActivity.java
@@ -1,4 +1,4 @@
-package org.briarproject.briar.android.panic;
+package org.briarproject.briar.android.logout;
 
 import android.os.Build;
 import android.os.Bundle;
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/logout/HideUiActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/logout/HideUiActivity.java
new file mode 100644
index 0000000000..3064993f79
--- /dev/null
+++ b/briar-android/src/main/java/org/briarproject/briar/android/logout/HideUiActivity.java
@@ -0,0 +1,20 @@
+package org.briarproject.briar.android.logout;
+
+import android.os.Bundle;
+
+import org.briarproject.briar.android.activity.ActivityComponent;
+import org.briarproject.briar.android.activity.BaseActivity;
+
+public class HideUiActivity extends BaseActivity {
+
+	@Override
+	public void onCreate(Bundle state) {
+		super.onCreate(state);
+		finish();
+	}
+
+	@Override
+	public void injectActivity(ActivityComponent component) {
+
+	}
+}
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/fragment/SignOutFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/logout/SignOutFragment.java
similarity index 77%
rename from briar-android/src/main/java/org/briarproject/briar/android/fragment/SignOutFragment.java
rename to briar-android/src/main/java/org/briarproject/briar/android/logout/SignOutFragment.java
index 6d122c6df6..a0bc316846 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/fragment/SignOutFragment.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/logout/SignOutFragment.java
@@ -1,4 +1,4 @@
-package org.briarproject.briar.android.fragment;
+package org.briarproject.briar.android.logout;
 
 import android.os.Bundle;
 import android.view.LayoutInflater;
@@ -7,7 +7,9 @@ import android.view.ViewGroup;
 
 import org.briarproject.briar.R;
 import org.briarproject.briar.android.activity.ActivityComponent;
+import org.briarproject.briar.android.fragment.BaseFragment;
 
+import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
 public class SignOutFragment extends BaseFragment {
@@ -15,7 +17,7 @@ public class SignOutFragment extends BaseFragment {
 	public static final String TAG = SignOutFragment.class.getName();
 
 	@Override
-	public View onCreateView(LayoutInflater inflater,
+	public View onCreateView(@Nonnull LayoutInflater inflater,
 			@Nullable ViewGroup container,
 			@Nullable Bundle savedInstanceState) {
 		return inflater.inflate(R.layout.fragment_sign_out, container, false);
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 a42a1071c7..af09db7004 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
@@ -37,7 +37,7 @@ import org.briarproject.briar.android.controller.handler.UiResultHandler;
 import org.briarproject.briar.android.forum.ForumListFragment;
 import org.briarproject.briar.android.fragment.BaseFragment;
 import org.briarproject.briar.android.fragment.BaseFragment.BaseFragmentListener;
-import org.briarproject.briar.android.fragment.SignOutFragment;
+import org.briarproject.briar.android.logout.SignOutFragment;
 import org.briarproject.briar.android.navdrawer.NavDrawerController.ExpiryWarning;
 import org.briarproject.briar.android.privategroup.list.GroupListFragment;
 import org.briarproject.briar.android.settings.SettingsActivity;
-- 
GitLab