mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-13 19:29:06 +01:00
Use do-not-kill-me-lib
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
package org.briarproject.briar.android.account;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
interface DozeHelper {
|
||||
|
||||
boolean needToShowDozeFragment(Context context);
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user