diff --git a/src/com/android/settings/applications/InstalledAppDetails.java b/src/com/android/settings/applications/InstalledAppDetails.java index ab9f3588c10..e88e3babfe7 100755 --- a/src/com/android/settings/applications/InstalledAppDetails.java +++ b/src/com/android/settings/applications/InstalledAppDetails.java @@ -196,6 +196,8 @@ public class InstalledAppDetails extends AppInfoBase BatterySipper mSipper; @VisibleForTesting BatteryStatsHelper mBatteryHelper; + @VisibleForTesting + BatteryUtils mBatteryUtils; protected ProcStatsData mStatsManager; protected ProcStatsPackageEntry mStats; @@ -204,7 +206,6 @@ public class InstalledAppDetails extends AppInfoBase private AppStorageStats mLastResult; private String mBatteryPercent; - private BatteryUtils mBatteryUtils; private final LoaderCallbacks mBatteryCallbacks = new LoaderCallbacks() { @@ -729,8 +730,6 @@ public class InstalledAppDetails extends AppInfoBase mDataPreference.setSummary(getDataSummary()); } - updateBattery(); - if (!mInitialized) { // First time init: are we displaying an uninstalled app? mInitialized = true; @@ -757,9 +756,10 @@ public class InstalledAppDetails extends AppInfoBase return true; } - private void updateBattery() { - if (mSipper != null && mBatteryHelper != null) { - mBatteryPreference.setEnabled(true); + @VisibleForTesting + void updateBattery() { + mBatteryPreference.setEnabled(true); + if (isBatteryStatsAvailable()) { final int dischargeAmount = mBatteryHelper.getStats().getDischargeAmount( BatteryStats.STATS_SINCE_CHARGED); @@ -771,7 +771,6 @@ public class InstalledAppDetails extends AppInfoBase mBatteryPercent = Utils.formatPercentage(percentOfMax); mBatteryPreference.setSummary(getString(R.string.battery_summary, mBatteryPercent)); } else { - mBatteryPreference.setEnabled(false); mBatteryPreference.setSummary(getString(R.string.no_battery_summary)); } } @@ -805,6 +804,11 @@ public class InstalledAppDetails extends AppInfoBase } } + @VisibleForTesting + boolean isBatteryStatsAvailable() { + return mBatteryHelper != null && mSipper != null; + } + private static CharSequence getSize(Context context, AppStorageStats stats) { return Formatter.formatFileSize(context, stats.getTotalBytes()); } @@ -1043,9 +1047,15 @@ public class InstalledAppDetails extends AppInfoBase } else if (preference == mDataPreference) { startAppInfoFragment(AppDataUsage.class, getString(R.string.app_data_usage)); } else if (preference == mBatteryPreference) { - BatteryEntry entry = new BatteryEntry(getContext(), null, mUserManager, mSipper); - AdvancedPowerUsageDetail.startBatteryDetailPage((SettingsActivity) getActivity(), this, - mBatteryHelper, BatteryStats.STATS_SINCE_CHARGED, entry, mBatteryPercent); + if (isBatteryStatsAvailable()) { + BatteryEntry entry = new BatteryEntry(getContext(), null, mUserManager, mSipper); + AdvancedPowerUsageDetail.startBatteryDetailPage((SettingsActivity) getActivity(), + this, mBatteryHelper, BatteryStats.STATS_SINCE_CHARGED, entry, + mBatteryPercent); + } else { + AdvancedPowerUsageDetail.startBatteryDetailPage((SettingsActivity) getActivity(), + this, mPackageName); + } } else { return false; } diff --git a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java index d4f96413714..580eb1bf953 100644 --- a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java +++ b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java @@ -133,6 +133,16 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements new UserHandle(UserHandle.getUserId(sipper.getUid()))); } + public static void startBatteryDetailPage(SettingsActivity caller, PreferenceFragment fragment, + String packageName) { + final Bundle args = new Bundle(2); + args.putString(EXTRA_PACKAGE_NAME, packageName); + args.putString(EXTRA_POWER_USAGE_PERCENT, Utils.formatPercentage(0)); + + caller.startPreferencePanelAsUser(fragment, AdvancedPowerUsageDetail.class.getName(), args, + R.string.battery_details_title, null, new UserHandle(UserHandle.myUserId())); + } + @Override public void onAttach(Activity activity) { super.onAttach(activity); diff --git a/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java b/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java index a09aeec1dad..f60223673a4 100644 --- a/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java +++ b/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java @@ -20,6 +20,8 @@ package com.android.settings.applications; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyDouble; +import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; @@ -46,10 +48,12 @@ import android.widget.Button; import com.android.internal.os.BatterySipper; import com.android.internal.os.BatteryStatsHelper; +import com.android.settings.R; import com.android.settings.SettingsActivity; import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; import com.android.settings.applications.instantapps.InstantAppButtonsController; +import com.android.settings.fuelgauge.BatteryUtils; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settingslib.applications.AppUtils; import com.android.settingslib.applications.ApplicationsState.AppEntry; @@ -77,6 +81,8 @@ public final class InstalledAppDetailsTest { private static final String PACKAGE_NAME = "test_package_name"; private static final int TARGET_UID = 111; private static final int OTHER_UID = 222; + private static final double BATTERY_LEVEL = 60; + private static final String BATTERY_LEVEL_STRING = "60%"; @Mock(answer = Answers.RETURNS_DEEP_STUBS) private Context mContext; @@ -89,20 +95,21 @@ public final class InstalledAppDetailsTest { @Mock private DevicePolicyManager mDevicePolicyManager; @Mock - private Preference mBatteryPreference; - @Mock private BatterySipper mBatterySipper; @Mock private BatterySipper mOtherBatterySipper; - @Mock + @Mock(answer = Answers.RETURNS_DEEP_STUBS) private BatteryStatsHelper mBatteryStatsHelper; @Mock private BatteryStats.Uid mUid; @Mock private PackageManager mPackageManager; + @Mock + private BatteryUtils mBatteryUtils; private InstalledAppDetails mAppDetail; private Context mShadowContext; + private Preference mBatteryPreference; @Before public void setUp() { @@ -110,6 +117,10 @@ public final class InstalledAppDetailsTest { mShadowContext = RuntimeEnvironment.application; mAppDetail = spy(new InstalledAppDetails()); + mAppDetail.mBatteryUtils = mBatteryUtils; + + mBatteryPreference = new Preference(mShadowContext); + mAppDetail.mBatteryPreference = mBatteryPreference; mBatterySipper.drainType = BatterySipper.DrainType.IDLE; mBatterySipper.uidObj = mUid; @@ -409,4 +420,42 @@ public final class InstalledAppDetailsTest { assertThat(mAppDetail.findTargetSipper(mBatteryStatsHelper, TARGET_UID)).isEqualTo( mBatterySipper); } + + @Test + public void updateBattery_noBatteryStats_summaryNo() { + doReturn(mShadowContext.getString(R.string.no_battery_summary)).when(mAppDetail).getString( + R.string.no_battery_summary); + mAppDetail.updateBattery(); + + assertThat(mBatteryPreference.getSummary()).isEqualTo( + "No battery use since last full charge"); + } + + @Test + public void updateBattery_hasBatteryStats_summaryPercent() { + mAppDetail.mBatteryHelper = mBatteryStatsHelper; + mAppDetail.mSipper = mBatterySipper; + doReturn(BATTERY_LEVEL).when(mBatteryUtils).calculateBatteryPercent(anyDouble(), + anyDouble(), anyDouble(), anyInt()); + doReturn(mShadowContext.getString(R.string.battery_summary, BATTERY_LEVEL_STRING)).when( + mAppDetail).getString(R.string.battery_summary, BATTERY_LEVEL_STRING); + doReturn(new ArrayList<>()).when(mBatteryStatsHelper).getUsageList(); + + mAppDetail.updateBattery(); + + assertThat(mBatteryPreference.getSummary()).isEqualTo("60% use since last full charge"); + } + + @Test + public void isBatteryStatsAvailable_hasBatteryStatsHelperAndSipper_returnTrue() { + mAppDetail.mBatteryHelper = mBatteryStatsHelper; + mAppDetail.mSipper = mBatterySipper; + + assertThat(mAppDetail.isBatteryStatsAvailable()).isTrue(); + } + + @Test + public void isBatteryStatsAvailable_parametersNull_returnFalse() { + assertThat(mAppDetail.isBatteryStatsAvailable()).isFalse(); + } } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java index fec9c5d69af..d6b758cc6ba 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java @@ -277,4 +277,25 @@ public class AdvancedPowerUsageDetailTest { verify(mTestActivity).startPreferencePanelAsUser( any(), anyString(), any(), anyInt(), any(), eq(new UserHandle(10))); } + + @Test + public void testStartBatteryDetailPage_noBatteryUsage_hasBasicData() { + final ArgumentCaptor captor = ArgumentCaptor.forClass(Bundle.class); + Answer callable = new Answer() { + @Override + public Void answer(InvocationOnMock invocation) throws Exception { + mBundle = captor.getValue(); + return null; + } + }; + doAnswer(callable).when(mTestActivity).startPreferencePanelAsUser(any(), anyString(), + captor.capture(), anyInt(), any(), any()); + + AdvancedPowerUsageDetail.startBatteryDetailPage(mTestActivity, null, PACKAGE_NAME[0]); + + assertThat(mBundle.getString(AdvancedPowerUsageDetail.EXTRA_PACKAGE_NAME)).isEqualTo( + PACKAGE_NAME[0]); + assertThat(mBundle.getString(AdvancedPowerUsageDetail.EXTRA_POWER_USAGE_PERCENT)).isEqualTo( + "0%"); + } }