Loading src/com/android/settings/applications/InstalledAppDetails.java +20 −10 Original line number Diff line number Diff line Loading @@ -196,6 +196,8 @@ public class InstalledAppDetails extends AppInfoBase BatterySipper mSipper; @VisibleForTesting BatteryStatsHelper mBatteryHelper; @VisibleForTesting BatteryUtils mBatteryUtils; protected ProcStatsData mStatsManager; protected ProcStatsPackageEntry mStats; Loading @@ -204,7 +206,6 @@ public class InstalledAppDetails extends AppInfoBase private AppStorageStats mLastResult; private String mBatteryPercent; private BatteryUtils mBatteryUtils; private final LoaderCallbacks<BatteryStatsHelper> mBatteryCallbacks = new LoaderCallbacks<BatteryStatsHelper>() { Loading Loading @@ -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; Loading @@ -757,9 +756,10 @@ public class InstalledAppDetails extends AppInfoBase return true; } private void updateBattery() { if (mSipper != null && mBatteryHelper != null) { @VisibleForTesting void updateBattery() { mBatteryPreference.setEnabled(true); if (isBatteryStatsAvailable()) { final int dischargeAmount = mBatteryHelper.getStats().getDischargeAmount( BatteryStats.STATS_SINCE_CHARGED); Loading @@ -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)); } } Loading Loading @@ -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()); } Loading Loading @@ -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) { if (isBatteryStatsAvailable()) { BatteryEntry entry = new BatteryEntry(getContext(), null, mUserManager, mSipper); AdvancedPowerUsageDetail.startBatteryDetailPage((SettingsActivity) getActivity(), this, mBatteryHelper, BatteryStats.STATS_SINCE_CHARGED, entry, mBatteryPercent); AdvancedPowerUsageDetail.startBatteryDetailPage((SettingsActivity) getActivity(), this, mBatteryHelper, BatteryStats.STATS_SINCE_CHARGED, entry, mBatteryPercent); } else { AdvancedPowerUsageDetail.startBatteryDetailPage((SettingsActivity) getActivity(), this, mPackageName); } } else { return false; } Loading src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java +10 −0 Original line number Diff line number Diff line Loading @@ -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); Loading tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java +52 −3 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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; Loading @@ -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() { Loading @@ -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; Loading Loading @@ -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(); } } tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java +21 −0 Original line number Diff line number Diff line Loading @@ -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<Bundle> captor = ArgumentCaptor.forClass(Bundle.class); Answer<Void> callable = new Answer<Void>() { @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%"); } } Loading
src/com/android/settings/applications/InstalledAppDetails.java +20 −10 Original line number Diff line number Diff line Loading @@ -196,6 +196,8 @@ public class InstalledAppDetails extends AppInfoBase BatterySipper mSipper; @VisibleForTesting BatteryStatsHelper mBatteryHelper; @VisibleForTesting BatteryUtils mBatteryUtils; protected ProcStatsData mStatsManager; protected ProcStatsPackageEntry mStats; Loading @@ -204,7 +206,6 @@ public class InstalledAppDetails extends AppInfoBase private AppStorageStats mLastResult; private String mBatteryPercent; private BatteryUtils mBatteryUtils; private final LoaderCallbacks<BatteryStatsHelper> mBatteryCallbacks = new LoaderCallbacks<BatteryStatsHelper>() { Loading Loading @@ -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; Loading @@ -757,9 +756,10 @@ public class InstalledAppDetails extends AppInfoBase return true; } private void updateBattery() { if (mSipper != null && mBatteryHelper != null) { @VisibleForTesting void updateBattery() { mBatteryPreference.setEnabled(true); if (isBatteryStatsAvailable()) { final int dischargeAmount = mBatteryHelper.getStats().getDischargeAmount( BatteryStats.STATS_SINCE_CHARGED); Loading @@ -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)); } } Loading Loading @@ -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()); } Loading Loading @@ -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) { if (isBatteryStatsAvailable()) { BatteryEntry entry = new BatteryEntry(getContext(), null, mUserManager, mSipper); AdvancedPowerUsageDetail.startBatteryDetailPage((SettingsActivity) getActivity(), this, mBatteryHelper, BatteryStats.STATS_SINCE_CHARGED, entry, mBatteryPercent); AdvancedPowerUsageDetail.startBatteryDetailPage((SettingsActivity) getActivity(), this, mBatteryHelper, BatteryStats.STATS_SINCE_CHARGED, entry, mBatteryPercent); } else { AdvancedPowerUsageDetail.startBatteryDetailPage((SettingsActivity) getActivity(), this, mPackageName); } } else { return false; } Loading
src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java +10 −0 Original line number Diff line number Diff line Loading @@ -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); Loading
tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java +52 −3 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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; Loading @@ -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() { Loading @@ -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; Loading Loading @@ -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(); } }
tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java +21 −0 Original line number Diff line number Diff line Loading @@ -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<Bundle> captor = ArgumentCaptor.forClass(Bundle.class); Answer<Void> callable = new Answer<Void>() { @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%"); } }