diff --git a/res/values/strings.xml b/res/values/strings.xml index 90708da8871..edc1ae5c473 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -10479,13 +10479,15 @@ Allowing %1$s to always run in the background may reduce battery life. \n\nYou can change this later from Settings > Apps & notifications. - %1$s use for past 24 hours - - - Power management + %1$s use since last full charge + + %1$s use for past 24 hours - No battery use for past 24 hours + No battery use since last full charge + + + No battery use for past 24 hours App settings diff --git a/src/com/android/settings/applications/appinfo/AppBatteryPreferenceController.java b/src/com/android/settings/applications/appinfo/AppBatteryPreferenceController.java index 1f0777a5ff4..d83f5d147dd 100644 --- a/src/com/android/settings/applications/appinfo/AppBatteryPreferenceController.java +++ b/src/com/android/settings/applications/appinfo/AppBatteryPreferenceController.java @@ -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; @@ -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; @@ -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 @@ -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; @@ -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); } @@ -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; @@ -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); @@ -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; @@ -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(), diff --git a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java index ca228e68218..3319e1b1492 100644 --- a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java +++ b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java @@ -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; @@ -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); } diff --git a/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java index 1dc572d91af..a6269bf42ea 100644 --- a/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java +++ b/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java @@ -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; diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/AppBatteryPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/AppBatteryPreferenceControllerTest.java index 21159475a1a..bcca0f20b6f 100644 --- a/tests/robotests/src/com/android/settings/applications/appinfo/AppBatteryPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/applications/appinfo/AppBatteryPreferenceControllerTest.java @@ -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; @@ -76,6 +77,8 @@ public class AppBatteryPreferenceControllerTest { private PackageManager mPackageManager; @Mock private LoaderManager mLoaderManager; + @Mock + private BatteryDiffEntry mBatteryDiffEntry; private Context mContext; private AppInfoDashboardFragment mFragment; @@ -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 @@ -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"); } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java index 014ce2921ff..b50e0832ec0 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java @@ -611,7 +611,7 @@ public class AdvancedPowerUsageDetailTest { @Test public void testStartBatteryDetailPage_hasBasicData() { AdvancedPowerUsageDetail.startBatteryDetailPage(mActivity, mFragment, - mBatteryEntry, USAGE_PERCENT); + mBatteryEntry, USAGE_PERCENT, /*isValidToShowSummary=*/ true); assertThat(mBundle.getInt(AdvancedPowerUsageDetail.EXTRA_UID)).isEqualTo(UID); assertThat(mBundle.getLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME)) @@ -622,12 +622,26 @@ public class AdvancedPowerUsageDetailTest { .isEqualTo(USAGE_PERCENT); } + @Test + public void testStartBatteryDetailPage_invalidToShowSummary_noFGBDData() { + AdvancedPowerUsageDetail.startBatteryDetailPage(mActivity, mFragment, + mBatteryEntry, USAGE_PERCENT, /*isValidToShowSummary=*/ false); + + assertThat(mBundle.getInt(AdvancedPowerUsageDetail.EXTRA_UID)).isEqualTo(UID); + assertThat(mBundle.getLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME)) + .isEqualTo(0); + assertThat(mBundle.getLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME)) + .isEqualTo(0); + assertThat(mBundle.getString(AdvancedPowerUsageDetail.EXTRA_POWER_USAGE_PERCENT)) + .isEqualTo(USAGE_PERCENT); + } + @Test public void testStartBatteryDetailPage_NormalApp() { when(mBatteryEntry.getDefaultPackageName()).thenReturn(PACKAGE_NAME[0]); AdvancedPowerUsageDetail.startBatteryDetailPage(mActivity, mFragment, - mBatteryEntry, USAGE_PERCENT); + mBatteryEntry, USAGE_PERCENT, /*isValidToShowSummary=*/ true); assertThat(mBundle.getString(AdvancedPowerUsageDetail.EXTRA_PACKAGE_NAME)).isEqualTo( PACKAGE_NAME[0]); @@ -638,7 +652,7 @@ public class AdvancedPowerUsageDetailTest { when(mBatteryEntry.getDefaultPackageName()).thenReturn(null); AdvancedPowerUsageDetail.startBatteryDetailPage(mActivity, mFragment, - mBatteryEntry, USAGE_PERCENT); + mBatteryEntry, USAGE_PERCENT, /*isValidToShowSummary=*/ true); assertThat(mBundle.getString(AdvancedPowerUsageDetail.EXTRA_LABEL)).isEqualTo(APP_LABEL); assertThat(mBundle.getInt(AdvancedPowerUsageDetail.EXTRA_ICON_ID)).isEqualTo(ICON_ID); @@ -651,7 +665,7 @@ public class AdvancedPowerUsageDetailTest { doReturn(appUid).when(mBatteryEntry).getUid(); AdvancedPowerUsageDetail.startBatteryDetailPage(mActivity, mFragment, - mBatteryEntry, USAGE_PERCENT); + mBatteryEntry, USAGE_PERCENT, /*isValidToShowSummary=*/ true); verify(mActivity).startActivityAsUser(any(Intent.class), eq(new UserHandle(10))); } @@ -663,7 +677,7 @@ public class AdvancedPowerUsageDetailTest { final int currentUser = 20; ShadowActivityManager.setCurrentUser(currentUser); AdvancedPowerUsageDetail.startBatteryDetailPage(mActivity, mFragment, - mBatteryEntry, USAGE_PERCENT); + mBatteryEntry, USAGE_PERCENT, /*isValidToShowSummary=*/ true); verify(mActivity).startActivityAsUser(any(Intent.class), eq(new UserHandle(currentUser))); }