Merge "Fix crash when opening battery page" into oc-dev

This commit is contained in:
TreeHugger Robot
2017-04-05 22:45:46 +00:00
committed by Android (Google) Code Review
3 changed files with 49 additions and 14 deletions

View File

@@ -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. 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 &amp; notifications.</string> \n\nYou can change this later from Settings > Apps &amp; notifications.</string>
<!-- Summary of power usage for an app [CHAR LIMIT=NONE] --> <!-- 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] --> <!-- 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> <string name="battery_power_management">Power management</string>

View File

@@ -89,6 +89,7 @@ import com.android.settings.applications.instantapps.InstantAppButtonsController
import com.android.settings.datausage.AppDataUsage; import com.android.settings.datausage.AppDataUsage;
import com.android.settings.datausage.DataUsageList; import com.android.settings.datausage.DataUsageList;
import com.android.settings.datausage.DataUsageSummary; import com.android.settings.datausage.DataUsageSummary;
import com.android.settings.fuelgauge.AdvancedPowerUsageDetail;
import com.android.settings.fuelgauge.BatteryEntry; import com.android.settings.fuelgauge.BatteryEntry;
import com.android.settings.fuelgauge.PowerUsageDetail; import com.android.settings.fuelgauge.PowerUsageDetail;
import com.android.settings.notification.AppNotificationSettings; import com.android.settings.notification.AppNotificationSettings;
@@ -183,10 +184,12 @@ public class InstalledAppDetails extends AppInfoBase
private ChartData mChartData; private ChartData mChartData;
private INetworkStatsSession mStatsSession; private INetworkStatsSession mStatsSession;
private Preference mBatteryPreference; @VisibleForTesting
Preference mBatteryPreference;
private BatteryStatsHelper mBatteryHelper; @VisibleForTesting
private BatterySipper mSipper; BatterySipper mSipper;
@VisibleForTesting
BatteryStatsHelper mBatteryHelper;
protected ProcStatsData mStatsManager; protected ProcStatsData mStatsManager;
protected ProcStatsPackageEntry mStats; protected ProcStatsPackageEntry mStats;
@@ -194,6 +197,7 @@ public class InstalledAppDetails extends AppInfoBase
private InstantAppButtonsController mInstantAppButtonsController; private InstantAppButtonsController mInstantAppButtonsController;
private AppStorageStats mLastResult; private AppStorageStats mLastResult;
private String mBatteryPercent;
private boolean handleDisableable(Button button) { private boolean handleDisableable(Button button) {
boolean disableable = false; boolean disableable = false;
@@ -686,7 +690,8 @@ public class InstalledAppDetails extends AppInfoBase
BatteryStats.STATS_SINCE_CHARGED); BatteryStats.STATS_SINCE_CHARGED);
final int percentOfMax = (int) ((mSipper.totalPowerMah) final int percentOfMax = (int) ((mSipper.totalPowerMah)
/ mBatteryHelper.getTotalPower() * dischargeAmount + .5f); / 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 { } else {
mBatteryPreference.setEnabled(false); mBatteryPreference.setEnabled(false);
mBatteryPreference.setSummary(getString(R.string.no_battery_summary)); mBatteryPreference.setSummary(getString(R.string.no_battery_summary));
@@ -960,9 +965,9 @@ public class InstalledAppDetails extends AppInfoBase
} else if (preference == mDataPreference) { } else if (preference == mDataPreference) {
startAppInfoFragment(AppDataUsage.class, getString(R.string.app_data_usage)); startAppInfoFragment(AppDataUsage.class, getString(R.string.app_data_usage));
} else if (preference == mBatteryPreference) { } else if (preference == mBatteryPreference) {
BatteryEntry entry = new BatteryEntry(getActivity(), null, mUserManager, mSipper); BatteryEntry entry = new BatteryEntry(getContext(), null, mUserManager, mSipper);
PowerUsageDetail.startBatteryDetailPage((SettingsActivity) getActivity(), this, AdvancedPowerUsageDetail.startBatteryDetailPage((SettingsActivity) getActivity(), this,
mBatteryHelper, BatteryStats.STATS_SINCE_CHARGED, entry, true, false); mBatteryHelper, BatteryStats.STATS_SINCE_CHARGED, entry, mBatteryPercent);
} else { } else {
return false; return false;
} }

View File

@@ -23,12 +23,16 @@ import android.app.admin.DevicePolicyManager;
import android.content.Context; import android.content.Context;
import android.content.pm.ApplicationInfo; import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo; import android.content.pm.PackageInfo;
import android.os.BatteryStats;
import android.os.UserManager; import android.os.UserManager;
import android.support.v7.preference.Preference; import android.support.v7.preference.Preference;
import android.view.View; import android.view.View;
import android.widget.Button; 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.R;
import com.android.settings.SettingsActivity;
import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig; import com.android.settings.TestConfig;
import com.android.settings.applications.instantapps.InstantAppButtonsController; 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.any;
import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
@@ -64,23 +70,37 @@ import static org.mockito.Mockito.when;
public final class InstalledAppDetailsTest { public final class InstalledAppDetailsTest {
@Mock(answer = Answers.RETURNS_DEEP_STUBS) @Mock(answer = Answers.RETURNS_DEEP_STUBS)
private Context mContext; private Context mContext;
@Mock @Mock
ApplicationFeatureProvider mApplicationFeatureProvider; ApplicationFeatureProvider mApplicationFeatureProvider;
@Mock(answer = Answers.RETURNS_DEEP_STUBS) @Mock(answer = Answers.RETURNS_DEEP_STUBS)
private UserManager mUserManager; private UserManager mUserManager;
@Mock @Mock
private Activity mActivity; private SettingsActivity mActivity;
@Mock @Mock
private DevicePolicyManager mDevicePolicyManager; private DevicePolicyManager mDevicePolicyManager;
@Mock
private Preference mBatteryPreference;
@Mock
private BatterySipper mBatterySipper;
@Mock
private BatteryStatsHelper mBatteryStatsHelper;
@Mock
private BatteryStats.Uid mUid;
private InstalledAppDetails mAppDetail; private InstalledAppDetails mAppDetail;
private Context mShadowContext;
@Before @Before
public void setUp() { public void setUp() {
MockitoAnnotations.initMocks(this); 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). // Default to not considering any apps to be instant (individual tests can override this).
ReflectionHelpers.setStaticField(AppUtils.class, "sInstantAppDataProvider", ReflectionHelpers.setStaticField(AppUtils.class, "sInstantAppDataProvider",
@@ -157,6 +177,16 @@ public final class InstalledAppDetailsTest {
verify(mActivity, never()).finishAndRemoveTask(); 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. // Tests that we don't show the "uninstall for all users" button for instant apps.
@Test @Test
public void instantApps_noUninstallForAllButton() { public void instantApps_noUninstallForAllButton() {
@@ -184,7 +214,7 @@ public final class InstalledAppDetailsTest {
public void instantApps_noUninstallButton() { public void instantApps_noUninstallButton() {
// Make this app appear to be instant. // Make this app appear to be instant.
ReflectionHelpers.setStaticField(AppUtils.class, "sInstantAppDataProvider", ReflectionHelpers.setStaticField(AppUtils.class, "sInstantAppDataProvider",
(InstantAppDataProvider) (i -> true)); (InstantAppDataProvider) (i -> true));
final ApplicationInfo info = new ApplicationInfo(); final ApplicationInfo info = new ApplicationInfo();
info.flags = ApplicationInfo.FLAG_INSTALLED; info.flags = ApplicationInfo.FLAG_INSTALLED;
info.enabled = true; info.enabled = true;