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 771b2b006..343422d7b 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 @@ -30,7 +30,8 @@ public class DozeFragment extends SetupFragment private final static String TAG = DozeFragment.class.getName(); private DozeView dozeView; - private HuaweiView huaweiView; + private HuaweiProtectedAppsView huaweiProtectedAppsView; + private HuaweiAppLaunchView huaweiAppLaunchView; private Button next; private boolean secondAttempt = false; @@ -48,8 +49,10 @@ public class DozeFragment extends SetupFragment false); dozeView = v.findViewById(R.id.dozeView); dozeView.setOnCheckedChangedListener(this); - huaweiView = v.findViewById(R.id.huaweiView); - huaweiView.setOnCheckedChangedListener(this); + huaweiProtectedAppsView = v.findViewById(R.id.huaweiProtectedAppsView); + huaweiProtectedAppsView.setOnCheckedChangedListener(this); + huaweiAppLaunchView = v.findViewById(R.id.huaweiAppLaunchView); + huaweiAppLaunchView.setOnCheckedChangedListener(this); next = v.findViewById(R.id.next); ProgressBar progressBar = v.findViewById(R.id.progress); @@ -93,7 +96,9 @@ public class DozeFragment extends SetupFragment @Override public void onCheckedChanged() { - next.setEnabled(dozeView.isChecked() && huaweiView.isChecked()); + next.setEnabled(dozeView.isChecked() && + huaweiProtectedAppsView.isChecked() && + huaweiAppLaunchView.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 a47f3ce92..0824643d9 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 @@ -2,13 +2,14 @@ package org.briarproject.briar.android.account; import android.content.Context; -import static org.briarproject.briar.android.account.HuaweiView.needsToBeShown; import static org.briarproject.briar.android.util.UiUtils.needsDozeWhitelisting; class DozeHelperImpl implements DozeHelper { @Override public boolean needToShowDozeFragment(Context context) { - return needsDozeWhitelisting(context.getApplicationContext()) || - needsToBeShown(context.getApplicationContext()); + Context appContext = context.getApplicationContext(); + return needsDozeWhitelisting(appContext) || + HuaweiProtectedAppsView.needsToBeShown(appContext) || + HuaweiAppLaunchView.needsToBeShown(appContext); } } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/account/HuaweiAppLaunchView.java b/briar-android/src/main/java/org/briarproject/briar/android/account/HuaweiAppLaunchView.java new file mode 100644 index 000000000..bd5dac903 --- /dev/null +++ b/briar-android/src/main/java/org/briarproject/briar/android/account/HuaweiAppLaunchView.java @@ -0,0 +1,78 @@ +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; +import static android.os.Build.VERSION.SDK_INT; + +@UiThread +@NotNullByDefault +class HuaweiAppLaunchView extends PowerView { + + private final static String PACKAGE_NAME = "com.huawei.systemmanager"; + private final static String CLASS_NAME = + PACKAGE_NAME + ".power.ui.HwPowerManagerActivity"; + + public HuaweiAppLaunchView(Context context) { + this(context, null); + } + + public HuaweiAppLaunchView(Context context, @Nullable AttributeSet attrs) { + this(context, attrs, 0); + } + + public HuaweiAppLaunchView(Context context, @Nullable AttributeSet attrs, + int defStyleAttr) { + super(context, attrs, defStyleAttr); + setText(R.string.setup_huawei_app_launch_text); + setButtonText(R.string.setup_huawei_app_launch_button); + } + + @Override + public boolean needsToBeShown() { + return needsToBeShown(getContext()); + } + + public static boolean needsToBeShown(Context context) { + // "App launch" was introduced in EMUI 8 (Android 8.0) + if (SDK_INT < 26) return false; + PackageManager pm = context.getPackageManager(); + List resolveInfos = pm.queryIntentActivities(getIntent(), + MATCH_DEFAULT_ONLY); + return !resolveInfos.isEmpty(); + } + + @Override + @StringRes + protected int getHelpText() { + return R.string.setup_huawei_app_launch_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/java/org/briarproject/briar/android/account/HuaweiView.java b/briar-android/src/main/java/org/briarproject/briar/android/account/HuaweiProtectedAppsView.java similarity index 82% rename from briar-android/src/main/java/org/briarproject/briar/android/account/HuaweiView.java rename to briar-android/src/main/java/org/briarproject/briar/android/account/HuaweiProtectedAppsView.java index 54b4f4831..c86c6e7ae 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/account/HuaweiView.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/account/HuaweiProtectedAppsView.java @@ -17,25 +17,28 @@ import javax.annotation.Nullable; import androidx.annotation.StringRes; import androidx.annotation.UiThread; +import static android.content.pm.PackageManager.MATCH_DEFAULT_ONLY; import static android.os.Build.VERSION.SDK_INT; @UiThread @NotNullByDefault -class HuaweiView extends PowerView { +class HuaweiProtectedAppsView extends PowerView { private final static String PACKAGE_NAME = "com.huawei.systemmanager"; private final static String CLASS_NAME = PACKAGE_NAME + ".optimize.process.ProtectActivity"; - public HuaweiView(Context context) { + public HuaweiProtectedAppsView(Context context) { this(context, null); } - public HuaweiView(Context context, @Nullable AttributeSet attrs) { + public HuaweiProtectedAppsView(Context context, + @Nullable AttributeSet attrs) { this(context, attrs, 0); } - public HuaweiView(Context context, @Nullable AttributeSet attrs, + public HuaweiProtectedAppsView(Context context, + @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); setText(R.string.setup_huawei_text); @@ -52,7 +55,7 @@ class HuaweiView extends PowerView { if (SDK_INT >= 24) return false; PackageManager pm = context.getPackageManager(); List resolveInfos = pm.queryIntentActivities(getIntent(), - PackageManager.MATCH_DEFAULT_ONLY); + MATCH_DEFAULT_ONLY); return !resolveInfos.isEmpty(); } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/account/PowerView.java b/briar-android/src/main/java/org/briarproject/briar/android/account/PowerView.java index f4a88af20..6cf3401e3 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/account/PowerView.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/account/PowerView.java @@ -43,7 +43,6 @@ abstract class PowerView extends ConstraintLayout { this(context, attrs, 0); } - @SuppressWarnings("ConstantConditions") public PowerView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); @@ -85,6 +84,7 @@ abstract class PowerView extends ConstraintLayout { setChecked(ss.value[0]); // also calls listener } + @SuppressWarnings("BooleanMethodIsAlwaysInverted") public abstract boolean needsToBeShown(); public void setChecked(boolean checked) { 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 0a5c03f14..8571fde69 100644 --- a/briar-android/src/main/res/layout/fragment_setup_doze.xml +++ b/briar-android/src/main/res/layout/fragment_setup_doze.xml @@ -15,18 +15,29 @@ android:id="@+id/dozeView" android:layout_width="match_parent" android:layout_height="wrap_content" + android:paddingBottom="@dimen/margin_large" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> - + +