Use do-not-kill-me-lib

This commit is contained in:
Torsten Grote
2022-02-25 10:37:10 -03:00
parent 7536f16c61
commit 784c7416ec
58 changed files with 289 additions and 406 deletions

View File

@@ -13,12 +13,12 @@ import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
import org.briarproject.briar.R;
import org.briarproject.briar.android.account.PowerView.OnCheckedChangedListener;
import org.briarproject.briar.android.util.UiUtils;
import androidx.annotation.Nullable;
import static android.view.View.INVISIBLE;
import static android.view.View.VISIBLE;
import static org.briarproject.android.dontkillmelib.DozeUtils.getDozeWhitelistingIntent;
import static org.briarproject.briar.android.activity.RequestCodes.REQUEST_DOZE_WHITELISTING;
import static org.briarproject.briar.android.util.UiUtils.showOnboardingDialog;
@@ -44,7 +44,7 @@ public class DozeFragment extends SetupFragment
public View onCreateView(LayoutInflater inflater,
@Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
requireActivity().setTitle(getString(R.string.setup_doze_title));
requireActivity().setTitle(getString(R.string.dnkm_doze_title));
setHasOptionsMenu(false);
View v = inflater.inflate(R.layout.fragment_setup_doze, container,
false);
@@ -80,7 +80,7 @@ public class DozeFragment extends SetupFragment
@Override
protected String getHelpText() {
return getString(R.string.setup_doze_explanation);
return getString(R.string.dnkm_doze_explanation);
}
@Override
@@ -108,7 +108,7 @@ public class DozeFragment extends SetupFragment
@SuppressLint("BatteryLife")
private void askForDozeWhitelisting() {
if (getContext() == null) return;
Intent i = UiUtils.getDozeWhitelistingIntent(getContext());
Intent i = getDozeWhitelistingIntent(getContext());
startActivityForResult(i, REQUEST_DOZE_WHITELISTING);
}

View File

@@ -1,8 +0,0 @@
package org.briarproject.briar.android.account;
import android.content.Context;
interface DozeHelper {
boolean needToShowDozeFragment(Context context);
}

View File

@@ -1,16 +0,0 @@
package org.briarproject.briar.android.account;
import android.content.Context;
import static org.briarproject.briar.android.util.UiUtils.needsDozeWhitelisting;
class DozeHelperImpl implements DozeHelper {
@Override
public boolean needToShowDozeFragment(Context context) {
Context appContext = context.getApplicationContext();
return needsDozeWhitelisting(appContext) ||
HuaweiProtectedAppsView.needsToBeShown(appContext) ||
HuaweiAppLaunchView.needsToBeShown(appContext) ||
XiaomiView.isXiaomiOrRedmiDevice();
}
}

View File

@@ -1,5 +1,8 @@
package org.briarproject.briar.android.account;
import org.briarproject.android.dontkillmelib.DozeHelper;
import org.briarproject.android.dontkillmelib.DozeHelperImpl;
import dagger.Module;
import dagger.Provides;

View File

@@ -10,7 +10,7 @@ import org.briarproject.briar.R;
import androidx.annotation.Nullable;
import androidx.annotation.UiThread;
import static org.briarproject.briar.android.util.UiUtils.needsDozeWhitelisting;
import static org.briarproject.android.dontkillmelib.DozeUtils.needsDozeWhitelisting;
@UiThread
@NotNullByDefault
@@ -30,22 +30,18 @@ class DozeView extends PowerView {
public DozeView(Context context, @Nullable AttributeSet attrs,
int defStyleAttr) {
super(context, attrs, defStyleAttr);
setText(R.string.setup_doze_intro);
setButtonText(R.string.setup_doze_button);
setText(R.string.dnkm_doze_intro);
setButtonText(R.string.dnkm_doze_button);
}
@Override
public boolean needsToBeShown() {
return needsToBeShown(getContext());
}
public static boolean needsToBeShown(Context context) {
return needsDozeWhitelisting(context);
return needsDozeWhitelisting(getContext());
}
@Override
protected int getHelpText() {
return R.string.setup_doze_explanation;
return R.string.dnkm_doze_explanation;
}
@Override

View File

@@ -3,14 +3,12 @@ package org.briarproject.briar.android.account;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.util.AttributeSet;
import android.widget.Toast;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.briar.R;
import java.util.List;
import java.util.logging.Logger;
import javax.annotation.Nullable;
@@ -18,12 +16,11 @@ 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;
import static android.widget.Toast.LENGTH_LONG;
import static java.util.Arrays.asList;
import static java.util.logging.Level.WARNING;
import static java.util.logging.Logger.getLogger;
import static org.briarproject.android.dontkillmelib.HuaweiUtils.appLaunchNeedsToBeShown;
import static org.briarproject.android.dontkillmelib.HuaweiUtils.getHuaweiAppLaunchIntents;
import static org.briarproject.bramble.util.LogUtils.logException;
@UiThread
@@ -33,14 +30,6 @@ class HuaweiAppLaunchView extends PowerView {
private static final Logger LOG =
getLogger(HuaweiAppLaunchView.class.getName());
private final static String PACKAGE_NAME = "com.huawei.systemmanager";
// First try to open StartupNormalAppListActivity
private final static String CLASS_NAME_1 =
PACKAGE_NAME + ".startupmgr.ui.StartupNormalAppListActivity";
// Fall back to HwPowerManagerActivity
private final static String CLASS_NAME_2 =
PACKAGE_NAME + ".power.ui.HwPowerManagerActivity";
public HuaweiAppLaunchView(Context context) {
this(context, null);
}
@@ -52,8 +41,8 @@ class HuaweiAppLaunchView extends PowerView {
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);
setText(R.string.dnkm_huawei_app_launch_text);
setButtonText(R.string.dnkm_huawei_app_launch_button);
}
@Override
@@ -62,27 +51,19 @@ class HuaweiAppLaunchView extends PowerView {
}
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();
for (Intent i : getIntents()) {
if (!pm.queryIntentActivities(i, MATCH_DEFAULT_ONLY).isEmpty()) {
return true;
}
}
return false;
return appLaunchNeedsToBeShown(context);
}
@Override
@StringRes
protected int getHelpText() {
return R.string.setup_huawei_app_launch_help;
return R.string.dnkm_huawei_app_launch_help;
}
@Override
protected void onButtonClick() {
Context context = getContext();
for (Intent i : getIntents()) {
for (Intent i : getHuaweiAppLaunchIntents()) {
try {
context.startActivity(i);
setChecked(true);
@@ -91,17 +72,9 @@ class HuaweiAppLaunchView extends PowerView {
logException(LOG, WARNING, e);
}
}
Toast.makeText(context, R.string.setup_huawei_app_launch_error_toast,
Toast.makeText(context, R.string.dnkm_huawei_app_launch_error_toast,
LENGTH_LONG).show();
// Let the user continue with setup
setChecked(true);
}
private static List<Intent> getIntents() {
Intent intent1 = new Intent();
intent1.setClassName(PACKAGE_NAME, CLASS_NAME_1);
Intent intent2 = new Intent();
intent2.setClassName(PACKAGE_NAME, CLASS_NAME_2);
return asList(intent1, intent2);
}
}

View File

@@ -2,32 +2,23 @@ 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;
import static org.briarproject.android.dontkillmelib.HuaweiUtils.getHuaweiProtectedAppsIntent;
import static org.briarproject.android.dontkillmelib.HuaweiUtils.protectedAppsNeedsToBeShown;
@UiThread
@NotNullByDefault
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 HuaweiProtectedAppsView(Context context) {
this(context, null);
}
@@ -41,40 +32,24 @@ class HuaweiProtectedAppsView extends PowerView {
@Nullable AttributeSet attrs,
int defStyleAttr) {
super(context, attrs, defStyleAttr);
setText(R.string.setup_huawei_text);
setButtonText(R.string.setup_huawei_button);
setText(R.string.dnkm_huawei_protected_text);
setButtonText(R.string.dnkm_huawei_protected_button);
}
@Override
public boolean needsToBeShown() {
return needsToBeShown(getContext());
}
public static boolean needsToBeShown(Context context) {
// "Protected apps" no longer exists on Huawei EMUI 5.0 (Android 7.0)
if (SDK_INT >= 24) return false;
PackageManager pm = context.getPackageManager();
List<ResolveInfo> resolveInfos = pm.queryIntentActivities(getIntent(),
MATCH_DEFAULT_ONLY);
return !resolveInfos.isEmpty();
return protectedAppsNeedsToBeShown(getContext());
}
@Override
@StringRes
protected int getHelpText() {
return R.string.setup_huawei_help;
return R.string.dnkm_huawei_protected_help;
}
@Override
protected void onButtonClick() {
getContext().startActivity(getIntent());
getContext().startActivity(getHuaweiProtectedAppsIntent());
setChecked(true);
}
private static Intent getIntent() {
Intent intent = new Intent();
intent.setClassName(PACKAGE_NAME, CLASS_NAME);
return intent;
}
}

View File

@@ -2,6 +2,7 @@ package org.briarproject.briar.android.account;
import android.app.Application;
import org.briarproject.android.dontkillmelib.DozeHelper;
import org.briarproject.bramble.api.account.AccountManager;
import org.briarproject.bramble.api.crypto.PasswordStrengthEstimator;
import org.briarproject.bramble.api.lifecycle.IoExecutor;
@@ -95,7 +96,7 @@ class SetupViewModel extends AndroidViewModel {
}
boolean needToShowDozeFragment() {
return dozeHelper.needToShowDozeFragment(getApplication());
return dozeHelper.needToShowDoNotKillMeFragment(getApplication());
}
void dozeExceptionConfirmed() {

View File

@@ -12,9 +12,8 @@ import javax.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.annotation.UiThread;
import static android.os.Build.BRAND;
import static org.briarproject.bramble.util.AndroidUtils.getSystemProperty;
import static org.briarproject.bramble.util.StringUtils.isNullOrEmpty;
import static org.briarproject.android.dontkillmelib.XiaomiUtils.isMiuiTenOrLater;
import static org.briarproject.android.dontkillmelib.XiaomiUtils.isXiaomiOrRedmiDevice;
import static org.briarproject.briar.android.util.UiUtils.showOnboardingDialog;
@UiThread
@@ -32,8 +31,8 @@ class XiaomiView extends PowerView {
public XiaomiView(Context context, @Nullable AttributeSet attrs,
int defStyleAttr) {
super(context, attrs, defStyleAttr);
setText(R.string.setup_xiaomi_text);
setButtonText(R.string.setup_xiaomi_button);
setText(R.string.dnkm_xiaomi_text);
setButtonText(R.string.dnkm_xiaomi_button);
}
@Override
@@ -41,34 +40,18 @@ class XiaomiView extends PowerView {
return isXiaomiOrRedmiDevice();
}
public static boolean isXiaomiOrRedmiDevice() {
return "Xiaomi".equalsIgnoreCase(BRAND) ||
"Redmi".equalsIgnoreCase(BRAND);
}
@Override
@StringRes
protected int getHelpText() {
return R.string.setup_xiaomi_help;
return R.string.dnkm_xiaomi_help;
}
@Override
protected void onButtonClick() {
int bodyRes = isMiuiTenOrLater()
? R.string.setup_xiaomi_dialog_body_new
: R.string.setup_xiaomi_dialog_body_old;
? R.string.dnkm_xiaomi_dialog_body_new
: R.string.dnkm_xiaomi_dialog_body_old;
showOnboardingDialog(getContext(), getContext().getString(bodyRes));
setChecked(true);
}
private boolean isMiuiTenOrLater() {
String version = getSystemProperty("ro.miui.ui.version.name");
if (isNullOrEmpty(version)) return false;
version = version.replaceAll("[^\\d]", "");
try {
return Integer.parseInt(version) >= 10;
} catch (NumberFormatException e) {
return false;
}
}
}

View File

@@ -36,11 +36,11 @@ import static android.content.Intent.FLAG_ACTIVITY_NO_ANIMATION;
import static android.os.Build.VERSION.SDK_INT;
import static java.util.logging.Level.INFO;
import static java.util.logging.Logger.getLogger;
import static org.briarproject.android.dontkillmelib.DozeUtils.getDozeWhitelistingIntent;
import static org.briarproject.briar.android.activity.RequestCodes.REQUEST_DOZE_WHITELISTING;
import static org.briarproject.briar.android.activity.RequestCodes.REQUEST_PASSWORD;
import static org.briarproject.briar.android.activity.RequestCodes.REQUEST_UNLOCK;
import static org.briarproject.briar.android.util.UiUtils.excludeSystemUi;
import static org.briarproject.briar.android.util.UiUtils.getDozeWhitelistingIntent;
import static org.briarproject.briar.android.util.UiUtils.isSamsung7;
@MethodsNotNullByDefault
@@ -116,7 +116,7 @@ public abstract class BriarActivity extends BaseActivity {
@Override
public void onResultUi(Boolean result) {
if (result) {
showDozeDialog(getString(R.string.warning_dozed,
showDozeDialog(getString(R.string.dnkm_warning_dozed,
getString(R.string.app_name)));
}
}

View File

@@ -27,10 +27,10 @@ import androidx.annotation.CallSuper;
import static java.util.logging.Level.WARNING;
import static java.util.logging.Logger.getLogger;
import static org.briarproject.android.dontkillmelib.DozeUtils.needsDozeWhitelisting;
import static org.briarproject.bramble.api.lifecycle.LifecycleManager.LifecycleState.STARTING_SERVICES;
import static org.briarproject.bramble.util.LogUtils.logException;
import static org.briarproject.briar.android.settings.SettingsFragment.SETTINGS_NAMESPACE;
import static org.briarproject.briar.android.util.UiUtils.needsDozeWhitelisting;
@NotNullByDefault
public class BriarControllerImpl implements BriarController {

View File

@@ -147,7 +147,7 @@ public class NavDrawerActivity extends BriarActivity implements
}
}
navDrawerViewModel.shouldAskForDozeWhitelisting().observe(this, ask -> {
if (ask) showDozeDialog(getString(R.string.setup_doze_intro));
if (ask) showDozeDialog(getString(R.string.dnkm_doze_intro));
});
Toolbar toolbar = setUpCustomToolbar(false);

View File

@@ -25,11 +25,11 @@ import androidx.lifecycle.MutableLiveData;
import static java.util.concurrent.TimeUnit.DAYS;
import static java.util.logging.Level.WARNING;
import static java.util.logging.Logger.getLogger;
import static org.briarproject.android.dontkillmelib.DozeUtils.needsDozeWhitelisting;
import static org.briarproject.bramble.util.LogUtils.logException;
import static org.briarproject.briar.android.TestingConstants.EXPIRY_DATE;
import static org.briarproject.briar.android.controller.BriarControllerImpl.DOZE_ASK_AGAIN;
import static org.briarproject.briar.android.settings.SettingsFragment.SETTINGS_NAMESPACE;
import static org.briarproject.briar.android.util.UiUtils.needsDozeWhitelisting;
@NotNullByDefault
public class NavDrawerViewModel extends DbViewModel {

View File

@@ -1,7 +1,5 @@
package org.briarproject.briar.android.util;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.KeyguardManager;
import android.content.ActivityNotFoundException;
@@ -12,7 +10,6 @@ import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.location.LocationManager;
import android.net.Uri;
import android.os.PowerManager;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.SpannableStringBuilder;
@@ -69,13 +66,11 @@ import androidx.lifecycle.Observer;
import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat;
import static android.content.Context.KEYGUARD_SERVICE;
import static android.content.Context.POWER_SERVICE;
import static android.content.Intent.CATEGORY_DEFAULT;
import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
import static android.os.Build.MANUFACTURER;
import static android.os.Build.VERSION.SDK_INT;
import static android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS;
import static android.provider.Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS;
import static android.text.format.DateUtils.DAY_IN_MILLIS;
import static android.text.format.DateUtils.FORMAT_ABBREV_ALL;
import static android.text.format.DateUtils.FORMAT_ABBREV_MONTH;
@@ -340,23 +335,6 @@ public class UiUtils {
.show();
}
public static boolean needsDozeWhitelisting(Context ctx) {
if (SDK_INT < 23) return false;
PowerManager pm = (PowerManager) ctx.getSystemService(POWER_SERVICE);
String packageName = ctx.getPackageName();
if (pm == null) throw new AssertionError();
return !pm.isIgnoringBatteryOptimizations(packageName);
}
@TargetApi(23)
@SuppressLint("BatteryLife")
public static Intent getDozeWhitelistingIntent(Context ctx) {
Intent i = new Intent();
i.setAction(ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
i.setData(Uri.parse("package:" + ctx.getPackageName()));
return i;
}
/**
* @return true if location is enabled,
* or it isn't required due to this being a SDK < 28 device.