From 94a4bd82ba2c2cf84fc97676edfd4ddde15cb557 Mon Sep 17 00:00:00 2001 From: Arc Wang Date: Thu, 23 Sep 2021 18:33:22 +0800 Subject: [PATCH 1/6] Ues permission to protect DeepLinkHomepageActivity DeepLinkHomepageActivity needs the permission android.permission.LAUNCH_TWO_PANE_SETTINGS_DEEP_LINK to limit the apps that can show Activity in Settings 2-pane. The permission is of protectionLevel signature|preinstalled. System grants the permission automatically to all the preinstalled apps and the apps that signed with platform key. Bug: 197048599 Test: build pass Change-Id: I1c2de3c9cddae432c5ff6e5d6ad56959b8117f8b --- AndroidManifest.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index d2a9c75fc69..a34713dce6c 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -178,6 +178,7 @@ From af5f355b35da8bda71398f9de71df831a9ee513c Mon Sep 17 00:00:00 2001 From: Peter_Liang Date: Sat, 11 Sep 2021 15:16:35 +0800 Subject: [PATCH 2/6] Add the max height restriction into the illustration view. Bug: 191721423 Test: manual test Change-Id: I3829ead500eaf586f6d543855690ee8f0d0913ff --- .../accessibility/AccessibilityUtil.java | 25 +++++++++++++++++++ .../ToggleFeaturePreferenceFragment.java | 3 +++ 2 files changed, 28 insertions(+) diff --git a/src/com/android/settings/accessibility/AccessibilityUtil.java b/src/com/android/settings/accessibility/AccessibilityUtil.java index 5c316a40acd..c93595689b4 100644 --- a/src/com/android/settings/accessibility/AccessibilityUtil.java +++ b/src/com/android/settings/accessibility/AccessibilityUtil.java @@ -17,16 +17,22 @@ package com.android.settings.accessibility; import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU; +import static android.view.WindowInsets.Type.displayCutout; +import static android.view.WindowInsets.Type.systemBars; import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL; import android.accessibilityservice.AccessibilityServiceInfo; import android.content.ComponentName; import android.content.Context; import android.content.res.Resources; +import android.graphics.Insets; +import android.graphics.Rect; import android.os.Build; import android.provider.Settings; import android.text.TextUtils; import android.util.TypedValue; +import android.view.WindowManager; +import android.view.WindowMetrics; import android.view.accessibility.AccessibilityManager; import androidx.annotation.IntDef; @@ -390,6 +396,25 @@ final class AccessibilityUtil { resources.getDisplayMetrics())); } + /** + * Gets the bounds of the display window excluding the insets of the system bar and display + * cut out. + * + * @param context the current context. + * @return the bounds of the display window. + */ + public static Rect getDisplayBounds(Context context) { + final WindowManager windowManager = context.getSystemService(WindowManager.class); + final WindowMetrics metrics = windowManager.getCurrentWindowMetrics(); + + final Rect displayBounds = metrics.getBounds(); + final Insets displayInsets = metrics.getWindowInsets().getInsetsIgnoringVisibility( + systemBars() | displayCutout()); + displayBounds.inset(displayInsets); + + return displayBounds; + } + /** * Indicates if the accessibility service belongs to a system App. * @param info AccessibilityServiceInfo diff --git a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java index 245f362e093..4f45b03b5a8 100644 --- a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java +++ b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java @@ -406,10 +406,13 @@ public abstract class ToggleFeaturePreferenceFragment extends SettingsPreference return; } + final int displayHalfHeight = + AccessibilityUtil.getDisplayBounds(getPrefContext()).height() / 2; final IllustrationPreference illustrationPreference = new IllustrationPreference(getPrefContext()); illustrationPreference.setImageUri(mImageUri); illustrationPreference.setSelectable(false); + illustrationPreference.setMaxHeight(displayHalfHeight); illustrationPreference.setKey(KEY_ANIMATED_IMAGE); getPreferenceScreen().addPreference(illustrationPreference); From 22e637bfc950bd148b208b4d25af88f45a4c09f9 Mon Sep 17 00:00:00 2001 From: ykhung Date: Mon, 27 Sep 2021 17:41:07 +0800 Subject: [PATCH 3/6] [S-QPR1] protect gettinng battery stats from DeadSystemException In some corner cases, we will receive the DeadSystemException from BatteryStatService when invoking getBatteryUsageStats() method, since it will encounter the binder transaction too large error. Before the root cause is resolved by the BatteryStatService team, we have to add workaround protection in the app side to avoid Setting is crashed. Bug: 191237968 Bug: 198084535 Test: make SettingsRoboTests Change-Id: I783479241bac83b4afc8ced3073e1b1db302c48c Merged-In: I75fcf63f4f69d86d6dce0e12bd4d738b1219ae47 --- src/com/android/settings/fuelgauge/BatteryInfo.java | 13 +++++++++++-- .../settings/fuelgauge/BatteryOptimizeUtils.java | 8 ++++++++ .../settings/fuelgauge/BatteryUsageStatsLoader.java | 11 ++++++++++- .../android/settings/fuelgauge/BatteryUtils.java | 13 +++++++++++-- 4 files changed, 40 insertions(+), 5 deletions(-) diff --git a/src/com/android/settings/fuelgauge/BatteryInfo.java b/src/com/android/settings/fuelgauge/BatteryInfo.java index 92151c0c58d..d641e7bef3c 100644 --- a/src/com/android/settings/fuelgauge/BatteryInfo.java +++ b/src/com/android/settings/fuelgauge/BatteryInfo.java @@ -25,6 +25,7 @@ import android.os.BatteryStatsManager; import android.os.BatteryUsageStats; import android.os.SystemClock; import android.text.format.Formatter; +import android.util.Log; import android.util.SparseIntArray; import androidx.annotation.NonNull; @@ -42,6 +43,7 @@ import com.android.settingslib.utils.PowerUtil; import com.android.settingslib.utils.StringUtil; public class BatteryInfo { + private static final String TAG = "BatteryInfo"; public CharSequence chargeLabel; public CharSequence remainingLabel; @@ -155,8 +157,15 @@ public class BatteryInfo { if (batteryUsageStats != null) { stats = batteryUsageStats; } else { - stats = context.getSystemService(BatteryStatsManager.class) - .getBatteryUsageStats(); + try { + stats = context.getSystemService(BatteryStatsManager.class) + .getBatteryUsageStats(); + } catch (RuntimeException e) { + Log.e(TAG, "getBatteryInfo() from getBatteryUsageStats()", e); + // Use default BatteryUsageStats. + stats = new BatteryUsageStats.Builder( + new String[0], /* includePowerModels */ false).build(); + } } return getBatteryInfo(context, stats, shortString); } diff --git a/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java b/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java index 4a560402667..21d20235f65 100644 --- a/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java +++ b/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java @@ -74,6 +74,14 @@ public class BatteryOptimizeUtils { } public void setAppUsageState(AppUsageState state) { + try { + setAppUsageStateInternal(state); + } catch (Exception e) { + Log.e(TAG, "setAppUsageState() is failed for " + mPackageName, e); + } + } + + private void setAppUsageStateInternal(AppUsageState state) { switch (state) { case RESTRICTED: mBatteryUtils.setForceAppStandby(mUid, mPackageName, AppOpsManager.MODE_IGNORED); diff --git a/src/com/android/settings/fuelgauge/BatteryUsageStatsLoader.java b/src/com/android/settings/fuelgauge/BatteryUsageStatsLoader.java index d35ef82b818..2e3200d5835 100644 --- a/src/com/android/settings/fuelgauge/BatteryUsageStatsLoader.java +++ b/src/com/android/settings/fuelgauge/BatteryUsageStatsLoader.java @@ -20,6 +20,7 @@ import android.content.Context; import android.os.BatteryStatsManager; import android.os.BatteryUsageStats; import android.os.BatteryUsageStatsQuery; +import android.util.Log; import com.android.settingslib.utils.AsyncLoaderCompat; @@ -27,6 +28,7 @@ import com.android.settingslib.utils.AsyncLoaderCompat; * Loader to get new {@link BatteryUsageStats} in the background */ public class BatteryUsageStatsLoader extends AsyncLoaderCompat { + private static final String TAG = "BatteryUsageStatsLoader"; private final BatteryStatsManager mBatteryStatsManager; private final boolean mIncludeBatteryHistory; @@ -42,7 +44,14 @@ public class BatteryUsageStatsLoader extends AsyncLoaderCompat Date: Tue, 14 Sep 2021 12:18:20 +0800 Subject: [PATCH 4/6] [S-QPR1] add package name for enable/disable app user actions metric add package name into the metric per @wangkelly request to analyze users behavior in the battery setting relative CUJ: go/battery-setting-enums go/battery-setting-metrics-dev Bug: 199807285 Test: make SettingsRoboTests Change-Id: Ica6da59b933b0dcff940215d4e537a670bac52cb (cherry picked from commit e12712dd1d53a6f922bca4c90f19c01efe67f2a9) --- .../AppButtonsPreferenceController.java | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java b/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java index 09bf86a8120..1b270d63b4d 100644 --- a/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java +++ b/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java @@ -226,7 +226,8 @@ public class AppButtonsPreferenceController extends BasePreferenceController imp uninstallDaIntent.putExtra(DeviceAdminAdd.EXTRA_DEVICE_ADMIN_PACKAGE_NAME, packageName); mMetricsFeatureProvider.action(mActivity, - SettingsEnums.ACTION_SETTINGS_UNINSTALL_DEVICE_ADMIN); + SettingsEnums.ACTION_SETTINGS_UNINSTALL_DEVICE_ADMIN, + getPackageNameForMetric()); mFragment.startActivityForResult(uninstallDaIntent, mRequestRemoveDeviceAdmin); return; } @@ -253,7 +254,8 @@ public class AppButtonsPreferenceController extends BasePreferenceController imp mActivity, mAppEntry.info.enabled ? SettingsEnums.ACTION_SETTINGS_DISABLE_APP - : SettingsEnums.ACTION_SETTINGS_ENABLE_APP); + : SettingsEnums.ACTION_SETTINGS_ENABLE_APP, + getPackageNameForMetric()); AsyncTask.execute(new DisableChangerRunnable(mPm, mAppEntry.info.packageName, PackageManager.COMPONENT_ENABLED_STATE_DEFAULT)); } @@ -270,7 +272,9 @@ public class AppButtonsPreferenceController extends BasePreferenceController imp @Override public void onClick(View v) { mMetricsFeatureProvider.action( - mActivity, SettingsEnums.ACTION_APP_INFO_FORCE_STOP); + mActivity, + SettingsEnums.ACTION_APP_INFO_FORCE_STOP, + getPackageNameForMetric()); // force stop if (mPm.isPackageStateProtected(mAppEntry.info.packageName, mUserId)) { RestrictedLockUtils.sendShowAdminSupportDetailsIntent(mActivity, @@ -757,6 +761,14 @@ public class AppButtonsPreferenceController extends BasePreferenceController imp || AppUtils.isMainlineModule(mPm, mAppEntry.info.packageName)); } + private String getPackageNameForMetric() { + final String packageName = + mAppEntry != null && mAppEntry.info != null + ? mAppEntry.info.packageName + : null; + return packageName != null ? packageName : ""; + } + /** * Changes the status of disable/enable for a package */ From a9c582262ea91fe2eacb87c730db2e6674355ddf Mon Sep 17 00:00:00 2001 From: Curtis Belmonte Date: Mon, 27 Sep 2021 13:27:20 -0700 Subject: [PATCH 5/6] Make biometric setting toggles show dynamic auth types Updates the preference toggles shown on the combined biometric settings screen to indicate which types of biometric sensor (e.g. face and/or fingerprint) each setting applies to. This is done by checking the maximum registered strength for each type of sensor. Test: Manual Bug: 193714498 Bug: 201306569 Change-Id: I1f27bbe1fdd172ebc899c3c5f1daef9095b338bd --- res/values/strings.xml | 31 ++----- .../security_settings_combined_biometric.xml | 3 +- ...ty_settings_combined_biometric_profile.xml | 3 +- .../combination/BiometricsSettingsBase.java | 80 +++++++++++++++++++ .../CombinedBiometricProfileSettings.java | 12 +++ .../CombinedBiometricSettings.java | 12 +++ 6 files changed, 114 insertions(+), 27 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 41de5539a3b..d6f22fbb102 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -997,12 +997,16 @@ When you set up Face Unlock and Fingerprint Unlock, your phone will ask for your fingerprint when you wear a mask or are in a dark area Ways to unlock - - Use face and fingerprint for - Unlocking your phone + Unlock your phone - Authentication in apps + Verify it\u2019s you in apps + + Using face + + Using fingerprint + + Using face or fingerprint Hand the phone back to your parent @@ -1242,25 +1246,6 @@ Yes, remove - - Face \u0026 fingerprint unlock - - Tap to set up - - Face only - - Fingerprint only - - Face and fingerprint - - When you set up face and fingerprint unlock, your phone will ask for your fingerprint when you wear a mask or are in a dark area - - Ways to unlock - - Use face or fingerprint for - - Authentication in apps - Encryption diff --git a/res/xml/security_settings_combined_biometric.xml b/res/xml/security_settings_combined_biometric.xml index a394b7b4688..ef3a3fd1ff2 100644 --- a/res/xml/security_settings_combined_biometric.xml +++ b/res/xml/security_settings_combined_biometric.xml @@ -43,8 +43,7 @@ + android:key="biometric_ways_to_use"> + android:key="biometric_ways_to_use"> Date: Tue, 28 Sep 2021 17:30:04 +0800 Subject: [PATCH 6/6] [Robustness] protect get battery stats from DeadSystemException Refine the original workaround patch in the ag/15527095 from NPE to return default BatteryUsageStats instance as we merged in the ag/15919139 (align the same solution). Bug: 195306545 Test: make SettingsRoboTests Change-Id: Ic03e8296d16ecb8629155f75727e9cde48c303eb --- src/com/android/settings/fuelgauge/BatteryInfo.java | 4 +++- .../settings/fuelgauge/BatteryUsageStatsLoader.java | 4 +++- src/com/android/settings/fuelgauge/BatteryUtils.java | 7 +++++-- .../android/settings/fuelgauge/PowerUsageSummary.java | 9 --------- .../settings/fuelgauge/batterytip/BatteryTipLoader.java | 8 +------- 5 files changed, 12 insertions(+), 20 deletions(-) diff --git a/src/com/android/settings/fuelgauge/BatteryInfo.java b/src/com/android/settings/fuelgauge/BatteryInfo.java index 4433da2c9cc..d641e7bef3c 100644 --- a/src/com/android/settings/fuelgauge/BatteryInfo.java +++ b/src/com/android/settings/fuelgauge/BatteryInfo.java @@ -162,7 +162,9 @@ public class BatteryInfo { .getBatteryUsageStats(); } catch (RuntimeException e) { Log.e(TAG, "getBatteryInfo() from getBatteryUsageStats()", e); - return null; + // Use default BatteryUsageStats. + stats = new BatteryUsageStats.Builder( + new String[0], /* includePowerModels */ false).build(); } } return getBatteryInfo(context, stats, shortString); diff --git a/src/com/android/settings/fuelgauge/BatteryUsageStatsLoader.java b/src/com/android/settings/fuelgauge/BatteryUsageStatsLoader.java index 0acc54e758b..2e3200d5835 100644 --- a/src/com/android/settings/fuelgauge/BatteryUsageStatsLoader.java +++ b/src/com/android/settings/fuelgauge/BatteryUsageStatsLoader.java @@ -48,7 +48,9 @@ public class BatteryUsageStatsLoader extends AsyncLoaderCompat loader, BatteryInfo batteryInfo) { - if (batteryInfo == null) { - Log.w(TAG, "mBatteryInfoLoaderCallbacks: batteryInfo = null"); - return; - } mBatteryHeaderPreferenceController.updateHeaderPreference(batteryInfo); mBatteryHeaderPreferenceController.updateHeaderByBatteryTips( mBatteryTipPreferenceController.getCurrentBatteryTip(), batteryInfo); @@ -131,10 +126,6 @@ public class PowerUsageSummary extends PowerUsageBase implements @Override public void onLoadFinished(Loader> loader, List data) { - if (mBatteryInfo == null) { - Log.w(TAG, "mBatteryTipsCallbacks: batteryInfo = null"); - return; - } mBatteryTipPreferenceController.updateBatteryTips(data); mBatteryHeaderPreferenceController.updateHeaderByBatteryTips( mBatteryTipPreferenceController.getCurrentBatteryTip(), mBatteryInfo); diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java index b6806e8573a..4b9858753da 100644 --- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java +++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java @@ -18,7 +18,6 @@ package com.android.settings.fuelgauge.batterytip; import android.content.Context; import android.os.BatteryUsageStats; -import android.util.Log; import androidx.annotation.VisibleForTesting; @@ -68,16 +67,11 @@ public class BatteryTipLoader extends AsyncLoaderCompat> { final BatteryInfo batteryInfo = mBatteryUtils.getBatteryInfo(TAG); final Context context = getContext(); - tips.add(new EarlyWarningDetector(policy, context).detect()); - if (batteryInfo == null) { - Log.w(TAG, "loadInBackground() batteryInfo = null"); - return tips; - } - tips.add(new LowBatteryDetector(context, policy, batteryInfo).detect()); tips.add(new HighUsageDetector(context, policy, mBatteryUsageStats, batteryInfo).detect()); tips.add(new SmartBatteryDetector( context, policy, batteryInfo, context.getContentResolver()).detect()); + tips.add(new EarlyWarningDetector(policy, context).detect()); tips.add(new BatteryDefenderDetector(batteryInfo).detect()); Collections.sort(tips); return tips;