From ad2502a91a6d0814396b2d26a7270e8cbdb2ed38 Mon Sep 17 00:00:00 2001 From: Mill Chen Date: Tue, 16 Jul 2019 17:45:46 +0800 Subject: [PATCH 1/4] Prevent accounts page directly opening in screen pinning mode In Settings there is no auth mechanism to prevent accounts page being opened in screen pinning mode. This CL makes it so that when users are trying to navigate to any pages in Settings from other apps in screen pinning mode, Settings app will directly close its page. Bug: 137015265 Bug: 135604684 Test: manual Change-Id: If26eda408a9ef6fa03ad82e5bee51bb7185950d6 Merged-In: If26eda408a9ef6fa03ad82e5bee51bb7185950d6 (cherry picked from commit f3242dab3546c019d4b79c502f7b8850d36123a5) --- .../android/settings/SettingsActivity.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java index 29cd77ade61..3bfafbb19ae 100644 --- a/src/com/android/settings/SettingsActivity.java +++ b/src/com/android/settings/SettingsActivity.java @@ -234,6 +234,12 @@ public class SettingsActivity extends SettingsDrawerActivity protected void onCreate(Bundle savedState) { super.onCreate(savedState); Log.d(LOG_TAG, "Starting onCreate"); + + if (isLockTaskModePinned() && !isSettingsRunOnTop()) { + Log.w(LOG_TAG, "Devices lock task mode pinned."); + finish(); + } + long startTime = System.currentTimeMillis(); final FeatureFactory factory = FeatureFactory.getFactory(this); @@ -810,4 +816,18 @@ public class SettingsActivity extends SettingsDrawerActivity return bitmap; } + + private boolean isLockTaskModePinned() { + final ActivityManager activityManager = + getApplicationContext().getSystemService(ActivityManager.class); + return activityManager.getLockTaskModeState() == ActivityManager.LOCK_TASK_MODE_PINNED; + } + + private boolean isSettingsRunOnTop() { + final ActivityManager activityManager = + getApplicationContext().getSystemService(ActivityManager.class); + final String taskPkgName = activityManager.getRunningTasks(1 /* maxNum */) + .get(0 /* index */).baseActivity.getPackageName(); + return TextUtils.equals(getPackageName(), taskPkgName); + } } From 3c6a3011fa797bc00e5246b04e961847c0e60a1c Mon Sep 17 00:00:00 2001 From: Mill Chen Date: Tue, 16 Jul 2019 17:45:46 +0800 Subject: [PATCH 2/4] Prevent accounts page directly opening in screen pinning mode In Settings there is no auth mechanism to prevent accounts page being opened in screen pinning mode. This CL makes it so that when users are trying to navigate to any pages in Settings from other apps in screen pinning mode, Settings app will directly close its page. Bug: 137015265 Bug: 135604684 Test: manual Change-Id: If26eda408a9ef6fa03ad82e5bee51bb7185950d6 Merged-In: If26eda408a9ef6fa03ad82e5bee51bb7185950d6 (cherry picked from commit f3242dab3546c019d4b79c502f7b8850d36123a5) --- .../android/settings/SettingsActivity.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java index 06bdd0cad46..c0ffc19df52 100644 --- a/src/com/android/settings/SettingsActivity.java +++ b/src/com/android/settings/SettingsActivity.java @@ -254,6 +254,12 @@ public class SettingsActivity extends SettingsDrawerActivity @Override protected void onCreate(Bundle savedState) { super.onCreate(savedState); + + if (isLockTaskModePinned() && !isSettingsRunOnTop()) { + Log.w(LOG_TAG, "Devices lock task mode pinned."); + finish(); + } + long startTime = System.currentTimeMillis(); final FeatureFactory factory = FeatureFactory.getFactory(this); @@ -957,4 +963,18 @@ public class SettingsActivity extends SettingsDrawerActivity Intent intent = new Intent(this, SearchActivity.class); startActivity(intent); } + + private boolean isLockTaskModePinned() { + final ActivityManager activityManager = + getApplicationContext().getSystemService(ActivityManager.class); + return activityManager.getLockTaskModeState() == ActivityManager.LOCK_TASK_MODE_PINNED; + } + + private boolean isSettingsRunOnTop() { + final ActivityManager activityManager = + getApplicationContext().getSystemService(ActivityManager.class); + final String taskPkgName = activityManager.getRunningTasks(1 /* maxNum */) + .get(0 /* index */).baseActivity.getPackageName(); + return TextUtils.equals(getPackageName(), taskPkgName); + } } From 82a0ea022ecd2bd97f7d9b28c9c8f814eec25237 Mon Sep 17 00:00:00 2001 From: Jay Aliomer Date: Tue, 10 Dec 2019 14:49:27 -0500 Subject: [PATCH 3/4] Dark theme settings activity Dark theme settings is now launchable as an activity Test: launch activity android.settings.DARK_THEME_SETTINGS Fixes: 145560830 Change-Id: I24b8d3211e9d6e7a5b1f226001882573ae7fb311 --- AndroidManifest.xml | 18 ++++++++++++++++++ src/com/android/settings/Settings.java | 1 + .../settings/core/gateway/SettingsGateway.java | 4 +++- 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 9bbcf2341a4..86cb3f2c5da 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -935,6 +935,24 @@ android:value="true" /> + + + + + + + + + + + + + Date: Thu, 12 Dec 2019 15:14:34 +0800 Subject: [PATCH 4/4] Fix Settings crash when clicks Notifications - FaceSettingsLockscreenBypassPreferenceController's preference key is different from that in xml. Use DashboardFragment generic way to create PreferenceController which bind the preference key defined in xml. - Also refine the way of fixing b/140878309 Fixes: 145893081 Test: manual check FaceSettings and Notification Settings Change-Id: Ia80e755e3f86b44e771b0cf80c9bf53a8ef8f430 --- .../settings/biometrics/face/FaceSettings.java | 18 ++++++++++++------ ...gsLockscreenBypassPreferenceController.java | 6 ------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/com/android/settings/biometrics/face/FaceSettings.java b/src/com/android/settings/biometrics/face/FaceSettings.java index 9c424672c6a..46d288e4c2b 100644 --- a/src/com/android/settings/biometrics/face/FaceSettings.java +++ b/src/com/android/settings/biometrics/face/FaceSettings.java @@ -63,6 +63,7 @@ public class FaceSettings extends DashboardFragment { private FaceSettingsAttentionPreferenceController mAttentionController; private FaceSettingsRemoveButtonPreferenceController mRemoveController; private FaceSettingsEnrollButtonPreferenceController mEnrollController; + private FaceSettingsLockscreenBypassPreferenceController mLockscreenController; private List mControllers; private List mTogglePreferences; @@ -129,7 +130,7 @@ public class FaceSettings extends DashboardFragment { Preference attentionPref = findPreference(FaceSettingsAttentionPreferenceController.KEY); Preference confirmPref = findPreference(FaceSettingsConfirmPreferenceController.KEY); Preference bypassPref = - findPreference(FaceSettingsLockscreenBypassPreferenceController.KEY); + findPreference(mLockscreenController.getPreferenceKey()); mTogglePreferences = new ArrayList<>( Arrays.asList(keyguardPref, appPref, attentionPref, confirmPref, bypassPref)); @@ -138,12 +139,10 @@ public class FaceSettings extends DashboardFragment { // There is no better way to do this :/ for (AbstractPreferenceController controller : mControllers) { - if (controller instanceof FaceSettingsPreferenceController) { + if (controller instanceof FaceSettingsPreferenceController) { ((FaceSettingsPreferenceController) controller).setUserId(mUserId); } else if (controller instanceof FaceSettingsEnrollButtonPreferenceController) { ((FaceSettingsEnrollButtonPreferenceController) controller).setUserId(mUserId); - } else if (controller instanceof FaceSettingsLockscreenBypassPreferenceController) { - ((FaceSettingsLockscreenBypassPreferenceController) controller).setUserId(mUserId); } } mRemoveController.setUserId(mUserId); @@ -151,7 +150,7 @@ public class FaceSettings extends DashboardFragment { // Don't show keyguard controller for work profile settings. if (mUserManager.isManagedProfile(mUserId)) { removePreference(FaceSettingsKeyguardPreferenceController.KEY); - removePreference(FaceSettingsLockscreenBypassPreferenceController.KEY); + removePreference(mLockscreenController.getPreferenceKey()); } if (savedInstanceState != null) { @@ -159,6 +158,14 @@ public class FaceSettings extends DashboardFragment { } } + @Override + public void onAttach(Context context) { + super.onAttach(context); + + mLockscreenController = use(FaceSettingsLockscreenBypassPreferenceController.class); + mLockscreenController.setUserId(mUserId); + } + @Override public void onResume() { super.onResume(); @@ -263,7 +270,6 @@ public class FaceSettings extends DashboardFragment { final List controllers = new ArrayList<>(); controllers.add(new FaceSettingsVideoPreferenceController(context)); controllers.add(new FaceSettingsKeyguardPreferenceController(context)); - controllers.add(new FaceSettingsLockscreenBypassPreferenceController(context)); controllers.add(new FaceSettingsAppPreferenceController(context)); controllers.add(new FaceSettingsAttentionPreferenceController(context)); controllers.add(new FaceSettingsRemoveButtonPreferenceController(context)); diff --git a/src/com/android/settings/biometrics/face/FaceSettingsLockscreenBypassPreferenceController.java b/src/com/android/settings/biometrics/face/FaceSettingsLockscreenBypassPreferenceController.java index 44165b8211a..cef174d5243 100644 --- a/src/com/android/settings/biometrics/face/FaceSettingsLockscreenBypassPreferenceController.java +++ b/src/com/android/settings/biometrics/face/FaceSettingsLockscreenBypassPreferenceController.java @@ -30,16 +30,10 @@ import com.android.internal.annotations.VisibleForTesting; public class FaceSettingsLockscreenBypassPreferenceController extends FaceSettingsPreferenceController { - static final String KEY = "security_lockscreen_bypass"; - @VisibleForTesting protected FaceManager mFaceManager; private UserManager mUserManager; - public FaceSettingsLockscreenBypassPreferenceController(Context context) { - this(context, KEY); - } - public FaceSettingsLockscreenBypassPreferenceController(Context context, String preferenceKey) { super(context, preferenceKey); if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FACE)) {