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" /> + +