Loading res/values/strings.xml +1 −1 Original line number Diff line number Diff line Loading @@ -7390,7 +7390,7 @@ 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$d</xliff:g>%% use since last full charge</string> <string name="battery_summary"><xliff:g id="percentage" example="2">%1$s</xliff:g> use since last full charge</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> src/com/android/settings/applications/InstalledAppDetails.java +13 −8 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading @@ -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; Loading Loading @@ -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)); Loading Loading @@ -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; } Loading tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java +35 −5 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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", Loading Loading @@ -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() { Loading Loading
res/values/strings.xml +1 −1 Original line number Diff line number Diff line Loading @@ -7390,7 +7390,7 @@ 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$d</xliff:g>%% use since last full charge</string> <string name="battery_summary"><xliff:g id="percentage" example="2">%1$s</xliff:g> use since last full charge</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>
src/com/android/settings/applications/InstalledAppDetails.java +13 −8 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading @@ -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; Loading Loading @@ -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)); Loading Loading @@ -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; } Loading
tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java +35 −5 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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", Loading Loading @@ -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() { Loading