From 22e637bfc950bd148b208b4d25af88f45a4c09f9 Mon Sep 17 00:00:00 2001 From: ykhung Date: Mon, 27 Sep 2021 17:41:07 +0800 Subject: [PATCH 1/2] [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 2/2] [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 */