Loading res/values/strings.xml +7 −5 Original line number Diff line number Diff line Loading @@ -10479,13 +10479,15 @@ Allowing <xliff:g id="app_name" example="Settings">%1$s</xliff:g> to always run in the background may reduce battery life. \n\nYou can change this later from Settings > Apps & notifications.</string> <!-- Summary of power usage for an app [CHAR LIMIT=NONE] --> <string name="battery_summary"><xliff:g id="percentage" example="2">%1$s</xliff:g> use for past 24 hours</string> <!-- Title of a group of settings that let you manage settings that affect battery life [CHAR LIMIT=60] --> <string name="battery_power_management">Power management</string> <string name="battery_summary"><xliff:g id="percentage" example="2">%1$s</xliff:g> use since last full charge</string> <!-- Summary of power usage for an app within past 24 hr[CHAR LIMIT=NONE] --> <string name="battery_summary_24hr"><xliff:g id="percentage" example="2">%1$s</xliff:g> use for past 24 hours</string> <!-- Summary for app with no battery usage [CHAR LIMIT=NONE] --> <string name="no_battery_summary">No battery use for past 24 hours</string> <string name="no_battery_summary">No battery use since last full charge</string> <!-- Summary for app with no battery usage for past 24 hours [CHAR LIMIT=NONE] --> <string name="no_battery_summary_24hr">No battery use for past 24 hours</string> <!-- Link to an apps notification settings [CHAR LIMIT=50] --> <string name="app_notification_preferences">App settings</string> src/com/android/settings/applications/appinfo/AppBatteryPreferenceController.java +58 −6 Original line number Diff line number Diff line Loading @@ -18,11 +18,14 @@ package com.android.settings.applications.appinfo; import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.AsyncTask; import android.os.BatteryUsageStats; import android.os.Bundle; import android.os.UidBatteryConsumer; import android.os.UserHandle; import android.os.UserManager; import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; Loading @@ -40,6 +43,8 @@ import com.android.settings.fuelgauge.BatteryDiffEntry; import com.android.settings.fuelgauge.BatteryEntry; import com.android.settings.fuelgauge.BatteryUsageStatsLoader; import com.android.settings.fuelgauge.BatteryUtils; import com.android.settings.fuelgauge.PowerUsageFeatureProvider; import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.events.OnPause; Loading @@ -50,6 +55,7 @@ import java.util.List; public class AppBatteryPreferenceController extends BasePreferenceController implements LifecycleObserver, OnResume, OnPause { private static final String TAG = "AppBatteryPreferenceController"; private static final String KEY_BATTERY = "battery"; @VisibleForTesting Loading @@ -61,13 +67,16 @@ public class AppBatteryPreferenceController extends BasePreferenceController BatteryUsageStats mBatteryUsageStats; @VisibleForTesting UidBatteryConsumer mUidBatteryConsumer; @VisibleForTesting BatteryDiffEntry mBatteryDiffEntry; @VisibleForTesting boolean mIsChartGraphEnabled; private Preference mPreference; private final AppInfoDashboardFragment mParent; private String mBatteryPercent; private final String mPackageName; private final int mUid; private BatteryDiffEntry mBatteryDiffEntry; private boolean mBatteryUsageStatsLoaded = false; private boolean mBatteryDiffEntriesLoaded = false; Loading @@ -78,6 +87,7 @@ public class AppBatteryPreferenceController extends BasePreferenceController mBatteryUtils = BatteryUtils.getInstance(mContext); mPackageName = packageName; mUid = uid; refreshFeatureFlag(mContext); if (lifecycle != null) { lifecycle.addObserver(this); } Loading Loading @@ -108,7 +118,8 @@ public class AppBatteryPreferenceController extends BasePreferenceController mParent.getActivity(), mParent, mBatteryDiffEntry, mBatteryPercent, Utils.formatPercentage( mBatteryDiffEntry.getPercentOfTotal(), /* round */ true), /*isValidToShowSummary=*/ true, /*slotInformation=*/ null); return true; Loading @@ -120,8 +131,9 @@ public class AppBatteryPreferenceController extends BasePreferenceController final BatteryEntry entry = new BatteryEntry(mContext, /* handler */null, userManager, mUidBatteryConsumer, /* isHidden */ false, mUidBatteryConsumer.getUid(), /* packages */ null, mPackageName); AdvancedPowerUsageDetail.startBatteryDetailPage(mParent.getActivity(), mParent, entry, mBatteryPercent); AdvancedPowerUsageDetail.startBatteryDetailPage(mParent.getActivity(), mParent, entry, mIsChartGraphEnabled ? Utils.formatPercentage(0) : mBatteryPercent, !mIsChartGraphEnabled); } else { AdvancedPowerUsageDetail.startBatteryDetailPage(mParent.getActivity(), mParent, mPackageName); Loading Loading @@ -161,12 +173,29 @@ public class AppBatteryPreferenceController extends BasePreferenceController @Override protected void onPostExecute(BatteryDiffEntry batteryDiffEntry) { mBatteryDiffEntry = batteryDiffEntry; mBatteryDiffEntriesLoaded = true; mPreference.setEnabled(mBatteryUsageStatsLoaded); updateBatteryWithDiffEntry(); } }.execute(); } @VisibleForTesting void updateBatteryWithDiffEntry() { if (mIsChartGraphEnabled) { if (mBatteryDiffEntry != null && mBatteryDiffEntry.mConsumePower > 0) { mBatteryPercent = Utils.formatPercentage( mBatteryDiffEntry.getPercentOfTotal(), /* round */ true); mPreference.setSummary(mContext.getString( R.string.battery_summary_24hr, mBatteryPercent)); } else { mPreference.setSummary( mContext.getString(R.string.no_battery_summary_24hr)); } } mBatteryDiffEntriesLoaded = true; mPreference.setEnabled(mBatteryUsageStatsLoaded); } private void onLoadFinished() { if (mBatteryUsageStats == null) { return; Loading @@ -182,10 +211,33 @@ public class AppBatteryPreferenceController extends BasePreferenceController } } private void refreshFeatureFlag(Context context) { if (isWorkProfile(context)) { try { context = context.createPackageContextAsUser( context.getPackageName(), 0, UserHandle.OWNER); } catch (PackageManager.NameNotFoundException e) { Log.e(TAG, "context.createPackageContextAsUser() fail: " + e); } } final PowerUsageFeatureProvider powerUsageFeatureProvider = FeatureFactory.getFactory(context).getPowerUsageFeatureProvider(context); mIsChartGraphEnabled = powerUsageFeatureProvider.isChartGraphEnabled(context); } private boolean isWorkProfile(Context context) { final UserManager userManager = context.getSystemService(UserManager.class); return userManager.isManagedProfile() && !userManager.isSystemUser(); } @VisibleForTesting void updateBattery() { mBatteryUsageStatsLoaded = true; mPreference.setEnabled(mBatteryDiffEntriesLoaded); if (mIsChartGraphEnabled) { return; } if (isBatteryStatsAvailable()) { final int percentOfMax = (int) mBatteryUtils.calculateBatteryPercent( mUidBatteryConsumer.getConsumedPower(), mBatteryUsageStats.getConsumedPower(), Loading src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java +4 −3 Original line number Diff line number Diff line Loading @@ -157,7 +157,8 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements /** Launches battery details page for an individual battery consumer. */ public static void startBatteryDetailPage(Activity caller, InstrumentedPreferenceFragment fragment, BatteryEntry entry, String usagePercent) { InstrumentedPreferenceFragment fragment, BatteryEntry entry, String usagePercent, boolean isValidToShowSummary) { final LaunchBatteryDetailPageArgs launchArgs = new LaunchBatteryDetailPageArgs(); // configure the launch argument. launchArgs.mUsagePercent = usagePercent; Loading @@ -166,8 +167,8 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements launchArgs.mUid = entry.getUid(); launchArgs.mIconId = entry.iconId; launchArgs.mConsumedPower = (int) entry.getConsumedPower(); launchArgs.mForegroundTimeMs = entry.getTimeInForegroundMs(); launchArgs.mBackgroundTimeMs = entry.getTimeInBackgroundMs(); launchArgs.mForegroundTimeMs = isValidToShowSummary ? entry.getTimeInForegroundMs() : 0; launchArgs.mBackgroundTimeMs = isValidToShowSummary ? entry.getTimeInBackgroundMs() : 0; launchArgs.mIsUserEntry = entry.isUserEntry(); startBatteryDetailPage(caller, fragment, launchArgs); } Loading src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java +1 −1 Original line number Diff line number Diff line Loading @@ -188,7 +188,7 @@ public class BatteryAppListPreferenceController extends AbstractPreferenceContro PowerGaugePreference pgp = (PowerGaugePreference) preference; BatteryEntry entry = pgp.getInfo(); AdvancedPowerUsageDetail.startBatteryDetailPage(mActivity, mFragment, entry, pgp.getPercent()); mFragment, entry, pgp.getPercent(), /*isValidToShowSummary=*/ true); return true; } return false; Loading tests/robotests/src/com/android/settings/applications/appinfo/AppBatteryPreferenceControllerTest.java +27 −1 Original line number Diff line number Diff line Loading @@ -39,6 +39,7 @@ import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import com.android.settings.SettingsActivity; import com.android.settings.fuelgauge.BatteryDiffEntry; import com.android.settings.fuelgauge.BatteryUtils; import org.junit.Before; Loading Loading @@ -76,6 +77,8 @@ public class AppBatteryPreferenceControllerTest { private PackageManager mPackageManager; @Mock private LoaderManager mLoaderManager; @Mock private BatteryDiffEntry mBatteryDiffEntry; private Context mContext; private AppInfoDashboardFragment mFragment; Loading Loading @@ -134,7 +137,7 @@ public class AppBatteryPreferenceControllerTest { mController.updateBattery(); assertThat(mBatteryPreference.getSummary()) .isEqualTo("No battery use for past 24 hours"); .isEqualTo("No battery use since last full charge"); } @Test Loading @@ -147,6 +150,29 @@ public class AppBatteryPreferenceControllerTest { mController.updateBattery(); assertThat(mBatteryPreference.getSummary()).isEqualTo("60% use since last full charge"); } @Test public void updateBatteryWithDiffEntry_noConsumePower_summaryNo() { mController.displayPreference(mScreen); mController.mIsChartGraphEnabled = true; mController.updateBatteryWithDiffEntry(); assertThat(mBatteryPreference.getSummary()).isEqualTo("No battery use for past 24 hours"); } @Test public void updateBatteryWithDiffEntry_withConsumePower_summaryPercent() { mController.displayPreference(mScreen); mController.mIsChartGraphEnabled = true; mBatteryDiffEntry.mConsumePower = 1; mController.mBatteryDiffEntry = mBatteryDiffEntry; when(mBatteryDiffEntry.getPercentOfTotal()).thenReturn(60.0); mController.updateBatteryWithDiffEntry(); assertThat(mBatteryPreference.getSummary()).isEqualTo("60% use for past 24 hours"); } Loading Loading
res/values/strings.xml +7 −5 Original line number Diff line number Diff line Loading @@ -10479,13 +10479,15 @@ Allowing <xliff:g id="app_name" example="Settings">%1$s</xliff:g> to always run in the background may reduce battery life. \n\nYou can change this later from Settings > Apps & notifications.</string> <!-- Summary of power usage for an app [CHAR LIMIT=NONE] --> <string name="battery_summary"><xliff:g id="percentage" example="2">%1$s</xliff:g> use for past 24 hours</string> <!-- Title of a group of settings that let you manage settings that affect battery life [CHAR LIMIT=60] --> <string name="battery_power_management">Power management</string> <string name="battery_summary"><xliff:g id="percentage" example="2">%1$s</xliff:g> use since last full charge</string> <!-- Summary of power usage for an app within past 24 hr[CHAR LIMIT=NONE] --> <string name="battery_summary_24hr"><xliff:g id="percentage" example="2">%1$s</xliff:g> use for past 24 hours</string> <!-- Summary for app with no battery usage [CHAR LIMIT=NONE] --> <string name="no_battery_summary">No battery use for past 24 hours</string> <string name="no_battery_summary">No battery use since last full charge</string> <!-- Summary for app with no battery usage for past 24 hours [CHAR LIMIT=NONE] --> <string name="no_battery_summary_24hr">No battery use for past 24 hours</string> <!-- Link to an apps notification settings [CHAR LIMIT=50] --> <string name="app_notification_preferences">App settings</string>
src/com/android/settings/applications/appinfo/AppBatteryPreferenceController.java +58 −6 Original line number Diff line number Diff line Loading @@ -18,11 +18,14 @@ package com.android.settings.applications.appinfo; import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.AsyncTask; import android.os.BatteryUsageStats; import android.os.Bundle; import android.os.UidBatteryConsumer; import android.os.UserHandle; import android.os.UserManager; import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; Loading @@ -40,6 +43,8 @@ import com.android.settings.fuelgauge.BatteryDiffEntry; import com.android.settings.fuelgauge.BatteryEntry; import com.android.settings.fuelgauge.BatteryUsageStatsLoader; import com.android.settings.fuelgauge.BatteryUtils; import com.android.settings.fuelgauge.PowerUsageFeatureProvider; import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.events.OnPause; Loading @@ -50,6 +55,7 @@ import java.util.List; public class AppBatteryPreferenceController extends BasePreferenceController implements LifecycleObserver, OnResume, OnPause { private static final String TAG = "AppBatteryPreferenceController"; private static final String KEY_BATTERY = "battery"; @VisibleForTesting Loading @@ -61,13 +67,16 @@ public class AppBatteryPreferenceController extends BasePreferenceController BatteryUsageStats mBatteryUsageStats; @VisibleForTesting UidBatteryConsumer mUidBatteryConsumer; @VisibleForTesting BatteryDiffEntry mBatteryDiffEntry; @VisibleForTesting boolean mIsChartGraphEnabled; private Preference mPreference; private final AppInfoDashboardFragment mParent; private String mBatteryPercent; private final String mPackageName; private final int mUid; private BatteryDiffEntry mBatteryDiffEntry; private boolean mBatteryUsageStatsLoaded = false; private boolean mBatteryDiffEntriesLoaded = false; Loading @@ -78,6 +87,7 @@ public class AppBatteryPreferenceController extends BasePreferenceController mBatteryUtils = BatteryUtils.getInstance(mContext); mPackageName = packageName; mUid = uid; refreshFeatureFlag(mContext); if (lifecycle != null) { lifecycle.addObserver(this); } Loading Loading @@ -108,7 +118,8 @@ public class AppBatteryPreferenceController extends BasePreferenceController mParent.getActivity(), mParent, mBatteryDiffEntry, mBatteryPercent, Utils.formatPercentage( mBatteryDiffEntry.getPercentOfTotal(), /* round */ true), /*isValidToShowSummary=*/ true, /*slotInformation=*/ null); return true; Loading @@ -120,8 +131,9 @@ public class AppBatteryPreferenceController extends BasePreferenceController final BatteryEntry entry = new BatteryEntry(mContext, /* handler */null, userManager, mUidBatteryConsumer, /* isHidden */ false, mUidBatteryConsumer.getUid(), /* packages */ null, mPackageName); AdvancedPowerUsageDetail.startBatteryDetailPage(mParent.getActivity(), mParent, entry, mBatteryPercent); AdvancedPowerUsageDetail.startBatteryDetailPage(mParent.getActivity(), mParent, entry, mIsChartGraphEnabled ? Utils.formatPercentage(0) : mBatteryPercent, !mIsChartGraphEnabled); } else { AdvancedPowerUsageDetail.startBatteryDetailPage(mParent.getActivity(), mParent, mPackageName); Loading Loading @@ -161,12 +173,29 @@ public class AppBatteryPreferenceController extends BasePreferenceController @Override protected void onPostExecute(BatteryDiffEntry batteryDiffEntry) { mBatteryDiffEntry = batteryDiffEntry; mBatteryDiffEntriesLoaded = true; mPreference.setEnabled(mBatteryUsageStatsLoaded); updateBatteryWithDiffEntry(); } }.execute(); } @VisibleForTesting void updateBatteryWithDiffEntry() { if (mIsChartGraphEnabled) { if (mBatteryDiffEntry != null && mBatteryDiffEntry.mConsumePower > 0) { mBatteryPercent = Utils.formatPercentage( mBatteryDiffEntry.getPercentOfTotal(), /* round */ true); mPreference.setSummary(mContext.getString( R.string.battery_summary_24hr, mBatteryPercent)); } else { mPreference.setSummary( mContext.getString(R.string.no_battery_summary_24hr)); } } mBatteryDiffEntriesLoaded = true; mPreference.setEnabled(mBatteryUsageStatsLoaded); } private void onLoadFinished() { if (mBatteryUsageStats == null) { return; Loading @@ -182,10 +211,33 @@ public class AppBatteryPreferenceController extends BasePreferenceController } } private void refreshFeatureFlag(Context context) { if (isWorkProfile(context)) { try { context = context.createPackageContextAsUser( context.getPackageName(), 0, UserHandle.OWNER); } catch (PackageManager.NameNotFoundException e) { Log.e(TAG, "context.createPackageContextAsUser() fail: " + e); } } final PowerUsageFeatureProvider powerUsageFeatureProvider = FeatureFactory.getFactory(context).getPowerUsageFeatureProvider(context); mIsChartGraphEnabled = powerUsageFeatureProvider.isChartGraphEnabled(context); } private boolean isWorkProfile(Context context) { final UserManager userManager = context.getSystemService(UserManager.class); return userManager.isManagedProfile() && !userManager.isSystemUser(); } @VisibleForTesting void updateBattery() { mBatteryUsageStatsLoaded = true; mPreference.setEnabled(mBatteryDiffEntriesLoaded); if (mIsChartGraphEnabled) { return; } if (isBatteryStatsAvailable()) { final int percentOfMax = (int) mBatteryUtils.calculateBatteryPercent( mUidBatteryConsumer.getConsumedPower(), mBatteryUsageStats.getConsumedPower(), Loading
src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java +4 −3 Original line number Diff line number Diff line Loading @@ -157,7 +157,8 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements /** Launches battery details page for an individual battery consumer. */ public static void startBatteryDetailPage(Activity caller, InstrumentedPreferenceFragment fragment, BatteryEntry entry, String usagePercent) { InstrumentedPreferenceFragment fragment, BatteryEntry entry, String usagePercent, boolean isValidToShowSummary) { final LaunchBatteryDetailPageArgs launchArgs = new LaunchBatteryDetailPageArgs(); // configure the launch argument. launchArgs.mUsagePercent = usagePercent; Loading @@ -166,8 +167,8 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements launchArgs.mUid = entry.getUid(); launchArgs.mIconId = entry.iconId; launchArgs.mConsumedPower = (int) entry.getConsumedPower(); launchArgs.mForegroundTimeMs = entry.getTimeInForegroundMs(); launchArgs.mBackgroundTimeMs = entry.getTimeInBackgroundMs(); launchArgs.mForegroundTimeMs = isValidToShowSummary ? entry.getTimeInForegroundMs() : 0; launchArgs.mBackgroundTimeMs = isValidToShowSummary ? entry.getTimeInBackgroundMs() : 0; launchArgs.mIsUserEntry = entry.isUserEntry(); startBatteryDetailPage(caller, fragment, launchArgs); } Loading
src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java +1 −1 Original line number Diff line number Diff line Loading @@ -188,7 +188,7 @@ public class BatteryAppListPreferenceController extends AbstractPreferenceContro PowerGaugePreference pgp = (PowerGaugePreference) preference; BatteryEntry entry = pgp.getInfo(); AdvancedPowerUsageDetail.startBatteryDetailPage(mActivity, mFragment, entry, pgp.getPercent()); mFragment, entry, pgp.getPercent(), /*isValidToShowSummary=*/ true); return true; } return false; Loading
tests/robotests/src/com/android/settings/applications/appinfo/AppBatteryPreferenceControllerTest.java +27 −1 Original line number Diff line number Diff line Loading @@ -39,6 +39,7 @@ import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import com.android.settings.SettingsActivity; import com.android.settings.fuelgauge.BatteryDiffEntry; import com.android.settings.fuelgauge.BatteryUtils; import org.junit.Before; Loading Loading @@ -76,6 +77,8 @@ public class AppBatteryPreferenceControllerTest { private PackageManager mPackageManager; @Mock private LoaderManager mLoaderManager; @Mock private BatteryDiffEntry mBatteryDiffEntry; private Context mContext; private AppInfoDashboardFragment mFragment; Loading Loading @@ -134,7 +137,7 @@ public class AppBatteryPreferenceControllerTest { mController.updateBattery(); assertThat(mBatteryPreference.getSummary()) .isEqualTo("No battery use for past 24 hours"); .isEqualTo("No battery use since last full charge"); } @Test Loading @@ -147,6 +150,29 @@ public class AppBatteryPreferenceControllerTest { mController.updateBattery(); assertThat(mBatteryPreference.getSummary()).isEqualTo("60% use since last full charge"); } @Test public void updateBatteryWithDiffEntry_noConsumePower_summaryNo() { mController.displayPreference(mScreen); mController.mIsChartGraphEnabled = true; mController.updateBatteryWithDiffEntry(); assertThat(mBatteryPreference.getSummary()).isEqualTo("No battery use for past 24 hours"); } @Test public void updateBatteryWithDiffEntry_withConsumePower_summaryPercent() { mController.displayPreference(mScreen); mController.mIsChartGraphEnabled = true; mBatteryDiffEntry.mConsumePower = 1; mController.mBatteryDiffEntry = mBatteryDiffEntry; when(mBatteryDiffEntry.getPercentOfTotal()).thenReturn(60.0); mController.updateBatteryWithDiffEntry(); assertThat(mBatteryPreference.getSummary()).isEqualTo("60% use for past 24 hours"); } Loading