diff --git a/res/values/strings.xml b/res/values/strings.xml index 4ebc07b50ca..e4fa50e6ddd 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -7390,7 +7390,7 @@ Allowing %1$s to always run in the background may reduce battery life. \n\nYou can change this later from Settings > Apps & notifications. - %1$d%% use since last full charge + %1$s use since last full charge Power management diff --git a/src/com/android/settings/applications/InstalledAppDetails.java b/src/com/android/settings/applications/InstalledAppDetails.java index c662c4acc60..9967918faf9 100755 --- a/src/com/android/settings/applications/InstalledAppDetails.java +++ b/src/com/android/settings/applications/InstalledAppDetails.java @@ -89,6 +89,7 @@ import com.android.settings.applications.instantapps.InstantAppButtonsController import com.android.settings.datausage.AppDataUsage; import com.android.settings.datausage.DataUsageList; import com.android.settings.datausage.DataUsageSummary; +import com.android.settings.fuelgauge.AdvancedPowerUsageDetail; import com.android.settings.fuelgauge.BatteryEntry; import com.android.settings.fuelgauge.PowerUsageDetail; import com.android.settings.notification.AppNotificationSettings; @@ -183,10 +184,12 @@ public class InstalledAppDetails extends AppInfoBase private ChartData mChartData; private INetworkStatsSession mStatsSession; - private Preference mBatteryPreference; - - private BatteryStatsHelper mBatteryHelper; - private BatterySipper mSipper; + @VisibleForTesting + Preference mBatteryPreference; + @VisibleForTesting + BatterySipper mSipper; + @VisibleForTesting + BatteryStatsHelper mBatteryHelper; protected ProcStatsData mStatsManager; protected ProcStatsPackageEntry mStats; @@ -194,6 +197,7 @@ public class InstalledAppDetails extends AppInfoBase private InstantAppButtonsController mInstantAppButtonsController; private AppStorageStats mLastResult; + private String mBatteryPercent; private boolean handleDisableable(Button button) { boolean disableable = false; @@ -686,7 +690,8 @@ public class InstalledAppDetails extends AppInfoBase BatteryStats.STATS_SINCE_CHARGED); final int percentOfMax = (int) ((mSipper.totalPowerMah) / mBatteryHelper.getTotalPower() * dischargeAmount + .5f); - mBatteryPreference.setSummary(getString(R.string.battery_summary, percentOfMax)); + mBatteryPercent = Utils.formatPercentage(percentOfMax); + mBatteryPreference.setSummary(getString(R.string.battery_summary, mBatteryPercent)); } else { mBatteryPreference.setEnabled(false); mBatteryPreference.setSummary(getString(R.string.no_battery_summary)); @@ -960,9 +965,9 @@ 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(getActivity(), null, mUserManager, mSipper); - PowerUsageDetail.startBatteryDetailPage((SettingsActivity) getActivity(), this, - mBatteryHelper, BatteryStats.STATS_SINCE_CHARGED, entry, true, false); + BatteryEntry entry = new BatteryEntry(getContext(), null, mUserManager, mSipper); + AdvancedPowerUsageDetail.startBatteryDetailPage((SettingsActivity) getActivity(), this, + mBatteryHelper, BatteryStats.STATS_SINCE_CHARGED, entry, mBatteryPercent); } else { return false; } diff --git a/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java b/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java index f02f58c5fb9..a33a8c81c6f 100644 --- a/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java +++ b/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java @@ -23,12 +23,16 @@ import android.app.admin.DevicePolicyManager; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; +import android.os.BatteryStats; import android.os.UserManager; import android.support.v7.preference.Preference; import android.view.View; 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; @@ -53,8 +57,10 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyString; +import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -64,23 +70,37 @@ import static org.mockito.Mockito.when; public final class InstalledAppDetailsTest { @Mock(answer = Answers.RETURNS_DEEP_STUBS) private Context mContext; - @Mock ApplicationFeatureProvider mApplicationFeatureProvider; - @Mock(answer = Answers.RETURNS_DEEP_STUBS) private UserManager mUserManager; @Mock - private Activity mActivity; + private SettingsActivity mActivity; @Mock private DevicePolicyManager mDevicePolicyManager; + @Mock + private Preference mBatteryPreference; + @Mock + private BatterySipper mBatterySipper; + @Mock + private BatteryStatsHelper mBatteryStatsHelper; + @Mock + private BatteryStats.Uid mUid; private InstalledAppDetails mAppDetail; + private Context mShadowContext; @Before public void setUp() { MockitoAnnotations.initMocks(this); - mAppDetail = new InstalledAppDetails(); + mShadowContext = RuntimeEnvironment.application; + + mAppDetail = spy(new InstalledAppDetails()); + + mBatterySipper.drainType = BatterySipper.DrainType.IDLE; + mBatterySipper.uidObj = mUid; + doReturn(mActivity).when(mAppDetail).getActivity(); + doReturn(mShadowContext).when(mAppDetail).getContext(); // Default to not considering any apps to be instant (individual tests can override this). ReflectionHelpers.setStaticField(AppUtils.class, "sInstantAppDataProvider", @@ -157,6 +177,16 @@ public final class InstalledAppDetailsTest { verify(mActivity, never()).finishAndRemoveTask(); } + @Test + public void launchPowerUsageDetailFragment_shouldNotCrash() { + mAppDetail.mBatteryPreference = mBatteryPreference; + mAppDetail.mSipper = mBatterySipper; + mAppDetail.mBatteryHelper = mBatteryStatsHelper; + + // Should not crash + mAppDetail.onPreferenceClick(mBatteryPreference); + } + // Tests that we don't show the "uninstall for all users" button for instant apps. @Test public void instantApps_noUninstallForAllButton() { @@ -184,7 +214,7 @@ public final class InstalledAppDetailsTest { public void instantApps_noUninstallButton() { // Make this app appear to be instant. ReflectionHelpers.setStaticField(AppUtils.class, "sInstantAppDataProvider", - (InstantAppDataProvider) (i -> true)); + (InstantAppDataProvider) (i -> true)); final ApplicationInfo info = new ApplicationInfo(); info.flags = ApplicationInfo.FLAG_INSTALLED; info.enabled = true;