diff --git a/briar-android/src/main/AndroidManifest.xml b/briar-android/src/main/AndroidManifest.xml
index 87d431f37..0be030d40 100644
--- a/briar-android/src/main/AndroidManifest.xml
+++ b/briar-android/src/main/AndroidManifest.xml
@@ -459,6 +459,7 @@
+
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/account/DozeFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/account/DozeFragment.java
index 343422d7b..cd7d6eca1 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/account/DozeFragment.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/account/DozeFragment.java
@@ -32,6 +32,7 @@ public class DozeFragment extends SetupFragment
private DozeView dozeView;
private HuaweiProtectedAppsView huaweiProtectedAppsView;
private HuaweiAppLaunchView huaweiAppLaunchView;
+ private XiaomiBatterySaverView xiaomiBatterySaverView;
private Button next;
private boolean secondAttempt = false;
@@ -53,6 +54,8 @@ public class DozeFragment extends SetupFragment
huaweiProtectedAppsView.setOnCheckedChangedListener(this);
huaweiAppLaunchView = v.findViewById(R.id.huaweiAppLaunchView);
huaweiAppLaunchView.setOnCheckedChangedListener(this);
+ xiaomiBatterySaverView = v.findViewById(R.id.xiaomiBatterySaverView);
+ xiaomiBatterySaverView.setOnCheckedChangedListener(this);
next = v.findViewById(R.id.next);
ProgressBar progressBar = v.findViewById(R.id.progress);
@@ -98,7 +101,8 @@ public class DozeFragment extends SetupFragment
public void onCheckedChanged() {
next.setEnabled(dozeView.isChecked() &&
huaweiProtectedAppsView.isChecked() &&
- huaweiAppLaunchView.isChecked());
+ huaweiAppLaunchView.isChecked() &&
+ xiaomiBatterySaverView.isChecked());
}
@SuppressLint("BatteryLife")
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/account/DozeHelperImpl.java b/briar-android/src/main/java/org/briarproject/briar/android/account/DozeHelperImpl.java
index 0824643d9..a5a0a0c48 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/account/DozeHelperImpl.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/account/DozeHelperImpl.java
@@ -10,6 +10,7 @@ class DozeHelperImpl implements DozeHelper {
Context appContext = context.getApplicationContext();
return needsDozeWhitelisting(appContext) ||
HuaweiProtectedAppsView.needsToBeShown(appContext) ||
- HuaweiAppLaunchView.needsToBeShown(appContext);
+ HuaweiAppLaunchView.needsToBeShown(appContext) ||
+ XiaomiBatterySaverView.needsToBeShown(appContext);
}
}
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/account/XiaomiBatterySaverView.java b/briar-android/src/main/java/org/briarproject/briar/android/account/XiaomiBatterySaverView.java
new file mode 100644
index 000000000..662c85c16
--- /dev/null
+++ b/briar-android/src/main/java/org/briarproject/briar/android/account/XiaomiBatterySaverView.java
@@ -0,0 +1,76 @@
+package org.briarproject.briar.android.account;
+
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.util.AttributeSet;
+
+import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
+import org.briarproject.briar.R;
+
+import java.util.List;
+
+import javax.annotation.Nullable;
+
+import androidx.annotation.StringRes;
+import androidx.annotation.UiThread;
+
+import static android.content.pm.PackageManager.MATCH_DEFAULT_ONLY;
+
+@UiThread
+@NotNullByDefault
+class XiaomiBatterySaverView extends PowerView {
+
+ private final static String PACKAGE_NAME = "com.miui.powerkeeper";
+ private final static String CLASS_NAME =
+ PACKAGE_NAME + ".ui.HiddenAppsConfigActivity";
+
+ public XiaomiBatterySaverView(Context context) {
+ this(context, null);
+ }
+
+ public XiaomiBatterySaverView(Context context,
+ @Nullable AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public XiaomiBatterySaverView(Context context, @Nullable AttributeSet attrs,
+ int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ setText(R.string.setup_xiaomi_text);
+ setButtonText(R.string.setup_xiaomi_button);
+ }
+
+ @Override
+ public boolean needsToBeShown() {
+ return needsToBeShown(getContext());
+ }
+
+ public static boolean needsToBeShown(Context context) {
+ PackageManager pm = context.getPackageManager();
+ List resolveInfos = pm.queryIntentActivities(getIntent(),
+ MATCH_DEFAULT_ONLY);
+ return !resolveInfos.isEmpty();
+ }
+
+ @Override
+ @StringRes
+ protected int getHelpText() {
+ return R.string.setup_xiaomi_help;
+ }
+
+ @Override
+ protected void onButtonClick() {
+ getContext().startActivity(getIntent());
+ setChecked(true);
+ }
+
+ private static Intent getIntent() {
+ Intent intent = new Intent();
+ intent.setClassName(PACKAGE_NAME, CLASS_NAME);
+ return intent;
+ }
+
+}
diff --git a/briar-android/src/main/res/layout/fragment_setup_doze.xml b/briar-android/src/main/res/layout/fragment_setup_doze.xml
index 8571fde69..63ff2fc31 100644
--- a/briar-android/src/main/res/layout/fragment_setup_doze.xml
+++ b/briar-android/src/main/res/layout/fragment_setup_doze.xml
@@ -38,6 +38,15 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/huaweiProtectedAppsView" />
+
+
diff --git a/briar-android/src/main/res/values/strings.xml b/briar-android/src/main/res/values/strings.xml
index f7c84824f..880b838c0 100644
--- a/briar-android/src/main/res/values/strings.xml
+++ b/briar-android/src/main/res/values/strings.xml
@@ -30,6 +30,9 @@
Please tap the button below, open the \"App launch\" screen and make sure Briar is set to \"Manage manually\".
Open Battery Settings
If Briar is not set to \"Manage manually\" in the \"App launch\" screen, it will not be able to run in the background.
+ Please tap the button below and make sure Briar is set to \"No restrictions\".
+ Open Background Settings
+ Briar must be set to \"No restrictions\" in the \"Background settings\" screen so that it can run in the background.
%s was unable to run in the background