1ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei/*
2ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei * Copyright (C) 2017 The Android Open Source Project
3ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei *
4ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei * Licensed under the Apache License, Version 2.0 (the "License");
5ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei * you may not use this file except in compliance with the License.
6ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei * You may obtain a copy of the License at
7ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei *
8ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei *      http://www.apache.org/licenses/LICENSE-2.0
9ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei *
10ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei * Unless required by applicable law or agreed to in writing, software
11ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei * distributed under the License is distributed on an "AS IS" BASIS,
12ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei * See the License for the specific language governing permissions and
14ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei * limitations under the License.
15ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei */
16ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
17ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleipackage com.android.settings.fuelgauge;
18ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
195ab93ad700b06cde50d052cdb70af4dad78bebaeTony Makimport static com.google.common.truth.Truth.assertThat;
205ab93ad700b06cde50d052cdb70af4dad78bebaeTony Mak
21046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lamimport static org.mockito.ArgumentMatchers.nullable;
223fb054f3d3df6ed3ca07036720116f9eae4098b7jackqdyuleiimport static org.mockito.Matchers.any;
235ab93ad700b06cde50d052cdb70af4dad78bebaeTony Makimport static org.mockito.Matchers.anyInt;
245ab93ad700b06cde50d052cdb70af4dad78bebaeTony Makimport static org.mockito.Matchers.anyLong;
255ab93ad700b06cde50d052cdb70af4dad78bebaeTony Makimport static org.mockito.Matchers.eq;
265ab93ad700b06cde50d052cdb70af4dad78bebaeTony Makimport static org.mockito.Mockito.doAnswer;
275ab93ad700b06cde50d052cdb70af4dad78bebaeTony Makimport static org.mockito.Mockito.doReturn;
285ab93ad700b06cde50d052cdb70af4dad78bebaeTony Makimport static org.mockito.Mockito.mock;
295ab93ad700b06cde50d052cdb70af4dad78bebaeTony Makimport static org.mockito.Mockito.spy;
305ab93ad700b06cde50d052cdb70af4dad78bebaeTony Makimport static org.mockito.Mockito.verify;
315ab93ad700b06cde50d052cdb70af4dad78bebaeTony Mak
32be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhangimport android.app.Activity;
33bfc2b11b9357c4508756243f540760458611b3b8jackqdyuleiimport android.app.AppOpsManager;
34046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lamimport android.app.Fragment;
353fb054f3d3df6ed3ca07036720116f9eae4098b7jackqdyuleiimport android.app.LoaderManager;
36ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleiimport android.content.Context;
37ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleiimport android.content.pm.ApplicationInfo;
385d2918a6756cdb9890ffbddf0991426486d86213jackqdyuleiimport android.content.pm.PackageManager;
39ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleiimport android.graphics.drawable.Drawable;
40ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleiimport android.os.BatteryStats;
41ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleiimport android.os.Bundle;
425ab93ad700b06cde50d052cdb70af4dad78bebaeTony Makimport android.os.UserHandle;
43040c21bcb50bbaf550fa1473ee062cfc75b5e30bjackqdyuleiimport android.support.v7.preference.Preference;
44841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhangimport android.support.v7.widget.RecyclerView;
45ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
46ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleiimport com.android.internal.os.BatterySipper;
47ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleiimport com.android.internal.os.BatteryStatsHelper;
48ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleiimport com.android.settings.SettingsActivity;
493fb054f3d3df6ed3ca07036720116f9eae4098b7jackqdyuleiimport com.android.settings.fuelgauge.anomaly.Anomaly;
503fb054f3d3df6ed3ca07036720116f9eae4098b7jackqdyuleiimport com.android.settings.fuelgauge.anomaly.AnomalySummaryPreferenceController;
519f1e911759dc6fedaac9fa65afb79f6a93022bf4Andrew Sappersteinimport com.android.settings.testutils.SettingsRobolectricTestRunner;
52ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleiimport com.android.settings.TestConfig;
53ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleiimport com.android.settings.applications.LayoutPreference;
54040c21bcb50bbaf550fa1473ee062cfc75b5e30bjackqdyuleiimport com.android.settings.R;
55ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleiimport com.android.settings.testutils.FakeFeatureFactory;
56d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhangimport com.android.settings.testutils.shadow.ShadowEntityHeaderController;
57d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhangimport com.android.settings.widget.EntityHeaderController;
5878e3a051d8da845997590ca8e04215e43264aa3aJesse Evansimport com.android.settingslib.applications.AppUtils;
59ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleiimport com.android.settingslib.applications.ApplicationsState;
6078e3a051d8da845997590ca8e04215e43264aa3aJesse Evansimport com.android.settingslib.applications.instantapps.InstantAppDataProvider;
61841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhangimport com.android.settingslib.core.lifecycle.Lifecycle;
62ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
63d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhangimport org.junit.After;
64ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleiimport org.junit.Before;
65ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleiimport org.junit.Test;
66ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleiimport org.junit.runner.RunWith;
67ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleiimport org.mockito.Answers;
68ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleiimport org.mockito.ArgumentCaptor;
69ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleiimport org.mockito.Mock;
70ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleiimport org.mockito.MockitoAnnotations;
71ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleiimport org.mockito.stubbing.Answer;
72f4c1cef322f2c747b606ba0d78563bbb0e887c51jackqdyuleiimport org.robolectric.RuntimeEnvironment;
73ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleiimport org.robolectric.annotation.Config;
74ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleiimport org.robolectric.util.ReflectionHelpers;
75ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
763fb054f3d3df6ed3ca07036720116f9eae4098b7jackqdyuleiimport java.util.ArrayList;
773fb054f3d3df6ed3ca07036720116f9eae4098b7jackqdyuleiimport java.util.List;
783fb054f3d3df6ed3ca07036720116f9eae4098b7jackqdyulei
79be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang@RunWith(SettingsRobolectricTestRunner.class)
80d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION,
81d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang        shadows = ShadowEntityHeaderController.class)
82ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleipublic class AdvancedPowerUsageDetailTest {
83ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private static final String APP_LABEL = "app label";
84ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private static final String SUMMARY = "summary";
85ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private static final String[] PACKAGE_NAME = {"com.android.app"};
86040c21bcb50bbaf550fa1473ee062cfc75b5e30bjackqdyulei    private static final String USAGE_PERCENT = "16%";
87ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private static final int ICON_ID = 123;
88ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private static final int UID = 1;
89040c21bcb50bbaf550fa1473ee062cfc75b5e30bjackqdyulei    private static final int POWER_MAH = 150;
90ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private static final long BACKGROUND_TIME_MS = 100;
91987711712cf9677bb24686df3a03a6f78adbdc85Michael Wachenschwanz    private static final long FOREGROUND_ACTIVITY_TIME_MS = 123;
92987711712cf9677bb24686df3a03a6f78adbdc85Michael Wachenschwanz    private static final long FOREGROUND_SERVICE_TIME_MS = 444;
93987711712cf9677bb24686df3a03a6f78adbdc85Michael Wachenschwanz    private static final long FOREGROUND_TIME_MS =
94987711712cf9677bb24686df3a03a6f78adbdc85Michael Wachenschwanz            FOREGROUND_ACTIVITY_TIME_MS + FOREGROUND_SERVICE_TIME_MS;
95987711712cf9677bb24686df3a03a6f78adbdc85Michael Wachenschwanz    private static final long PROCSTATE_TOP_TIME_MS = FOREGROUND_ACTIVITY_TIME_MS;
96987711712cf9677bb24686df3a03a6f78adbdc85Michael Wachenschwanz    private static final long BACKGROUND_TIME_US = BACKGROUND_TIME_MS * 1000;
97987711712cf9677bb24686df3a03a6f78adbdc85Michael Wachenschwanz    private static final long FOREGROUND_ACTIVITY_TIME_US = FOREGROUND_ACTIVITY_TIME_MS * 1000;
98987711712cf9677bb24686df3a03a6f78adbdc85Michael Wachenschwanz    private static final long FOREGROUND_SERVICE_TIME_US = FOREGROUND_SERVICE_TIME_MS * 1000;
99987711712cf9677bb24686df3a03a6f78adbdc85Michael Wachenschwanz    private static final long FOREGROUND_TIME_US = FOREGROUND_TIME_MS * 1000;
100987711712cf9677bb24686df3a03a6f78adbdc85Michael Wachenschwanz    private static final long PROCSTATE_TOP_TIME_US = PROCSTATE_TOP_TIME_MS * 1000;
10134145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei    private static final long PHONE_FOREGROUND_TIME_MS = 250 * 1000;
10234145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei    private static final long PHONE_BACKGROUND_TIME_MS = 0;
103ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
104ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
105be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang    private Activity mActivity;
106ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    @Mock
107f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang    private EntityHeaderController mEntityHeaderController;
108ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    @Mock
109ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private LayoutPreference mHeaderPreference;
110ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    @Mock
111ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private ApplicationsState mState;
112ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    @Mock
113ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private ApplicationsState.AppEntry mAppEntry;
114ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    @Mock
115ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private Bundle mBundle;
116ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    @Mock
117ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private BatteryEntry mBatteryEntry;
118ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    @Mock
119ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private BatterySipper mBatterySipper;
120ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    @Mock
121ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private BatteryStatsHelper mBatteryStatsHelper;
122ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    @Mock
123ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private BatteryStats.Uid mUid;
1245d2918a6756cdb9890ffbddf0991426486d86213jackqdyulei    @Mock
1255d2918a6756cdb9890ffbddf0991426486d86213jackqdyulei    private PackageManager mPackageManager;
1263fb054f3d3df6ed3ca07036720116f9eae4098b7jackqdyulei    @Mock
127bfc2b11b9357c4508756243f540760458611b3b8jackqdyulei    private AppOpsManager mAppOpsManager;
128bfc2b11b9357c4508756243f540760458611b3b8jackqdyulei    @Mock
1293fb054f3d3df6ed3ca07036720116f9eae4098b7jackqdyulei    private LoaderManager mLoaderManager;
1303fb054f3d3df6ed3ca07036720116f9eae4098b7jackqdyulei    @Mock
1313fb054f3d3df6ed3ca07036720116f9eae4098b7jackqdyulei    private AnomalySummaryPreferenceController mAnomalySummaryPreferenceController;
13243cbee69144b685fad373be43a35a884a0c4f3f3jackqdyulei    @Mock
133987711712cf9677bb24686df3a03a6f78adbdc85Michael Wachenschwanz    private BatteryStats.Timer mForegroundActivityTimer;
134987711712cf9677bb24686df3a03a6f78adbdc85Michael Wachenschwanz    @Mock
135987711712cf9677bb24686df3a03a6f78adbdc85Michael Wachenschwanz    private BatteryUtils mBatteryUtils;
136040c21bcb50bbaf550fa1473ee062cfc75b5e30bjackqdyulei    private Context mContext;
137040c21bcb50bbaf550fa1473ee062cfc75b5e30bjackqdyulei    private Preference mForegroundPreference;
138040c21bcb50bbaf550fa1473ee062cfc75b5e30bjackqdyulei    private Preference mBackgroundPreference;
139040c21bcb50bbaf550fa1473ee062cfc75b5e30bjackqdyulei    private Preference mPowerUsagePreference;
140ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private AdvancedPowerUsageDetail mFragment;
141ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private FakeFeatureFactory mFeatureFactory;
142ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private SettingsActivity mTestActivity;
1433fb054f3d3df6ed3ca07036720116f9eae4098b7jackqdyulei    private List<Anomaly> mAnomalies;
144ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
145ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    @Before
146ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    public void setUp() {
147ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        MockitoAnnotations.initMocks(this);
148040c21bcb50bbaf550fa1473ee062cfc75b5e30bjackqdyulei
149040c21bcb50bbaf550fa1473ee062cfc75b5e30bjackqdyulei        mContext = spy(RuntimeEnvironment.application);
150ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        FakeFeatureFactory.setupForTest(mContext);
151ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        mFeatureFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext);
152ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
153ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        mFragment = spy(new AdvancedPowerUsageDetail());
154ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        doReturn(mContext).when(mFragment).getContext();
155be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang        doReturn(mActivity).when(mFragment).getActivity();
156ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        doReturn(SUMMARY).when(mFragment).getString(anyInt());
157046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam        doReturn(APP_LABEL).when(mBundle).getString(nullable(String.class));
158ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        doReturn(mBundle).when(mFragment).getArguments();
1593fb054f3d3df6ed3ca07036720116f9eae4098b7jackqdyulei        doReturn(mLoaderManager).when(mFragment).getLoaderManager();
160ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
161d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang        ShadowEntityHeaderController.setUseMock(mEntityHeaderController);
162f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang        doReturn(mEntityHeaderController).when(mEntityHeaderController)
163046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam                .setRecyclerView(nullable(RecyclerView.class), nullable(Lifecycle.class));
164841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang        doReturn(mEntityHeaderController).when(mEntityHeaderController)
165f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang                .setButtonActions(anyInt(), anyInt());
166f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang        doReturn(mEntityHeaderController).when(mEntityHeaderController)
167046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam                .setIcon(nullable(Drawable.class));
168046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam        doReturn(mEntityHeaderController).when(mEntityHeaderController).setIcon(nullable(
169ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei                ApplicationsState.AppEntry.class));
170f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang        doReturn(mEntityHeaderController).when(mEntityHeaderController)
171046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam                .setLabel(nullable(String.class));
172046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam        doReturn(mEntityHeaderController).when(mEntityHeaderController)
173046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam                .setLabel(nullable(String.class));
174046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam        doReturn(mEntityHeaderController).when(mEntityHeaderController)
175046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam                .setLabel(nullable(ApplicationsState.AppEntry.class));
176046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam        doReturn(mEntityHeaderController).when(mEntityHeaderController)
177046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam                .setSummary(nullable(String.class));
178ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
179ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        doReturn(UID).when(mBatterySipper).getUid();
180ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        doReturn(APP_LABEL).when(mBatteryEntry).getLabel();
181ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        doReturn(BACKGROUND_TIME_US).when(mUid).getProcessStateTime(
182ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei                eq(BatteryStats.Uid.PROCESS_STATE_BACKGROUND), anyLong(), anyInt());
183987711712cf9677bb24686df3a03a6f78adbdc85Michael Wachenschwanz        doReturn(PROCSTATE_TOP_TIME_US).when(mUid).getProcessStateTime(
18401e690e37781553bae0dea3f7208103bb5474970jackqdyulei                eq(BatteryStats.Uid.PROCESS_STATE_TOP), anyLong(), anyInt());
185987711712cf9677bb24686df3a03a6f78adbdc85Michael Wachenschwanz        doReturn(mForegroundActivityTimer).when(mUid).getForegroundActivityTimer();
186987711712cf9677bb24686df3a03a6f78adbdc85Michael Wachenschwanz        doReturn(FOREGROUND_ACTIVITY_TIME_US).when(mForegroundActivityTimer)
187987711712cf9677bb24686df3a03a6f78adbdc85Michael Wachenschwanz                .getTotalTimeLocked(anyLong(), anyInt());
188ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        ReflectionHelpers.setField(mBatteryEntry, "sipper", mBatterySipper);
189ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        mBatteryEntry.iconId = ICON_ID;
190ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        mBatterySipper.uidObj = mUid;
19134145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei        mBatterySipper.drainType = BatterySipper.DrainType.APP;
192ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
193ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        mFragment.mHeaderPreference = mHeaderPreference;
194ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        mFragment.mState = mState;
195f4c1cef322f2c747b606ba0d78563bbb0e887c51jackqdyulei        mFragment.mBatteryUtils = new BatteryUtils(RuntimeEnvironment.application);
196ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        mAppEntry.info = mock(ApplicationInfo.class);
197ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
198ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        mTestActivity = spy(new SettingsActivity());
1995d2918a6756cdb9890ffbddf0991426486d86213jackqdyulei        doReturn(mPackageManager).when(mTestActivity).getPackageManager();
200bfc2b11b9357c4508756243f540760458611b3b8jackqdyulei        doReturn(mAppOpsManager).when(mTestActivity).getSystemService(Context.APP_OPS_SERVICE);
201ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
202987711712cf9677bb24686df3a03a6f78adbdc85Michael Wachenschwanz        mBatteryUtils = spy(BatteryUtils.getInstance(mTestActivity));
203987711712cf9677bb24686df3a03a6f78adbdc85Michael Wachenschwanz        doReturn(FOREGROUND_SERVICE_TIME_US).when(mBatteryUtils).getForegroundServiceTotalTimeUs(
204987711712cf9677bb24686df3a03a6f78adbdc85Michael Wachenschwanz                any(BatteryStats.Uid.class), anyLong());
205987711712cf9677bb24686df3a03a6f78adbdc85Michael Wachenschwanz
206ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        final ArgumentCaptor<Bundle> captor = ArgumentCaptor.forClass(Bundle.class);
207ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
208046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam        Answer<Void> callable = invocation -> {
209046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam            mBundle = captor.getValue();
210046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam            return null;
211ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        };
212046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam        doAnswer(callable).when(mTestActivity).startPreferencePanelAsUser(
213046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam                nullable(Fragment.class), nullable(String.class), captor.capture(), anyInt(),
214046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam                nullable(CharSequence.class), nullable(UserHandle.class));
215040c21bcb50bbaf550fa1473ee062cfc75b5e30bjackqdyulei
216040c21bcb50bbaf550fa1473ee062cfc75b5e30bjackqdyulei        mForegroundPreference = new Preference(mContext);
217040c21bcb50bbaf550fa1473ee062cfc75b5e30bjackqdyulei        mBackgroundPreference = new Preference(mContext);
218040c21bcb50bbaf550fa1473ee062cfc75b5e30bjackqdyulei        mPowerUsagePreference = new Preference(mContext);
219040c21bcb50bbaf550fa1473ee062cfc75b5e30bjackqdyulei        mFragment.mForegroundPreference = mForegroundPreference;
220040c21bcb50bbaf550fa1473ee062cfc75b5e30bjackqdyulei        mFragment.mBackgroundPreference = mBackgroundPreference;
221040c21bcb50bbaf550fa1473ee062cfc75b5e30bjackqdyulei        mFragment.mPowerUsagePreference = mPowerUsagePreference;
2223fb054f3d3df6ed3ca07036720116f9eae4098b7jackqdyulei        mFragment.mAnomalySummaryPreferenceController = mAnomalySummaryPreferenceController;
2233fb054f3d3df6ed3ca07036720116f9eae4098b7jackqdyulei
2243fb054f3d3df6ed3ca07036720116f9eae4098b7jackqdyulei        mAnomalies = new ArrayList<>();
2253fb054f3d3df6ed3ca07036720116f9eae4098b7jackqdyulei        mAnomalies.add(new Anomaly.Builder().setUid(UID).setType(
2263fb054f3d3df6ed3ca07036720116f9eae4098b7jackqdyulei                Anomaly.AnomalyType.WAKE_LOCK).build());
227ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    }
228ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
229d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang    @After
230d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang    public void reset() {
231d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang        ShadowEntityHeaderController.reset();
232d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang    }
233d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang
234ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    @Test
235ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    public void testInitHeader_NoAppEntry_BuildByBundle() {
236ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        mFragment.mAppEntry = null;
237ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        mFragment.initHeader();
238ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
239046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam        verify(mEntityHeaderController).setIcon(nullable(Drawable.class));
240f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang        verify(mEntityHeaderController).setLabel(APP_LABEL);
241ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    }
242ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
243ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    @Test
244ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    public void testInitHeader_HasAppEntry_BuildByAppEntry() {
24578e3a051d8da845997590ca8e04215e43264aa3aJesse Evans        ReflectionHelpers.setStaticField(AppUtils.class, "sInstantAppDataProvider",
24678e3a051d8da845997590ca8e04215e43264aa3aJesse Evans                new InstantAppDataProvider() {
24778e3a051d8da845997590ca8e04215e43264aa3aJesse Evans                    @Override
24878e3a051d8da845997590ca8e04215e43264aa3aJesse Evans                    public boolean isInstantApp(ApplicationInfo info) {
24978e3a051d8da845997590ca8e04215e43264aa3aJesse Evans                        return false;
25078e3a051d8da845997590ca8e04215e43264aa3aJesse Evans                    }
25178e3a051d8da845997590ca8e04215e43264aa3aJesse Evans                });
25278e3a051d8da845997590ca8e04215e43264aa3aJesse Evans        mFragment.mAppEntry = mAppEntry;
25378e3a051d8da845997590ca8e04215e43264aa3aJesse Evans        mFragment.initHeader();
25478e3a051d8da845997590ca8e04215e43264aa3aJesse Evans
255f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang        verify(mEntityHeaderController).setIcon(mAppEntry);
256f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang        verify(mEntityHeaderController).setLabel(mAppEntry);
257f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang        verify(mEntityHeaderController).setIsInstantApp(false);
25878e3a051d8da845997590ca8e04215e43264aa3aJesse Evans    }
25978e3a051d8da845997590ca8e04215e43264aa3aJesse Evans
26078e3a051d8da845997590ca8e04215e43264aa3aJesse Evans    @Test
26178e3a051d8da845997590ca8e04215e43264aa3aJesse Evans    public void testInitHeader_HasAppEntry_InstantApp() {
26278e3a051d8da845997590ca8e04215e43264aa3aJesse Evans        ReflectionHelpers.setStaticField(AppUtils.class, "sInstantAppDataProvider",
26378e3a051d8da845997590ca8e04215e43264aa3aJesse Evans                new InstantAppDataProvider() {
26478e3a051d8da845997590ca8e04215e43264aa3aJesse Evans                    @Override
26578e3a051d8da845997590ca8e04215e43264aa3aJesse Evans                    public boolean isInstantApp(ApplicationInfo info) {
26678e3a051d8da845997590ca8e04215e43264aa3aJesse Evans                        return true;
26778e3a051d8da845997590ca8e04215e43264aa3aJesse Evans                    }
26878e3a051d8da845997590ca8e04215e43264aa3aJesse Evans                });
269ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        mFragment.mAppEntry = mAppEntry;
270ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        mFragment.initHeader();
271ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
272f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang        verify(mEntityHeaderController).setIcon(mAppEntry);
273f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang        verify(mEntityHeaderController).setLabel(mAppEntry);
274f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang        verify(mEntityHeaderController).setIsInstantApp(true);
275f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang        verify(mEntityHeaderController).setSummary((CharSequence) null);
276ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    }
277ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
278ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    @Test
279ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    public void testStartBatteryDetailPage_hasBasicData() {
280987711712cf9677bb24686df3a03a6f78adbdc85Michael Wachenschwanz        AdvancedPowerUsageDetail.startBatteryDetailPage(mTestActivity, mBatteryUtils, null,
281987711712cf9677bb24686df3a03a6f78adbdc85Michael Wachenschwanz                mBatteryStatsHelper, 0, mBatteryEntry, USAGE_PERCENT, mAnomalies);
282ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
283ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        assertThat(mBundle.getInt(AdvancedPowerUsageDetail.EXTRA_UID)).isEqualTo(UID);
284ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        assertThat(mBundle.getLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME)).isEqualTo(
285ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei                BACKGROUND_TIME_MS);
286ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        assertThat(mBundle.getLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME)).isEqualTo(
287ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei                FOREGROUND_TIME_MS);
288ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        assertThat(mBundle.getString(AdvancedPowerUsageDetail.EXTRA_POWER_USAGE_PERCENT)).isEqualTo(
28934145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei                USAGE_PERCENT);
2903fb054f3d3df6ed3ca07036720116f9eae4098b7jackqdyulei        assertThat(mBundle.getParcelableArrayList(
2913fb054f3d3df6ed3ca07036720116f9eae4098b7jackqdyulei                AdvancedPowerUsageDetail.EXTRA_ANOMALY_LIST)).isEqualTo(mAnomalies);
29234145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei    }
29334145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei
29434145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei    @Test
29534145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei    public void testStartBatteryDetailPage_typeNotApp_hasBasicData() {
29634145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei        mBatterySipper.drainType = BatterySipper.DrainType.PHONE;
29734145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei        mBatterySipper.usageTimeMs = PHONE_FOREGROUND_TIME_MS;
29834145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei
299987711712cf9677bb24686df3a03a6f78adbdc85Michael Wachenschwanz        AdvancedPowerUsageDetail.startBatteryDetailPage(mTestActivity, mBatteryUtils, null,
300987711712cf9677bb24686df3a03a6f78adbdc85Michael Wachenschwanz                mBatteryStatsHelper, 0, mBatteryEntry, USAGE_PERCENT, null);
30134145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei
30234145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei        assertThat(mBundle.getInt(AdvancedPowerUsageDetail.EXTRA_UID)).isEqualTo(UID);
30334145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei        assertThat(mBundle.getLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME)).isEqualTo(
30434145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei                PHONE_FOREGROUND_TIME_MS);
30534145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei        assertThat(mBundle.getLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME)).isEqualTo(
30634145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei                PHONE_BACKGROUND_TIME_MS);
30734145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei        assertThat(mBundle.getString(AdvancedPowerUsageDetail.EXTRA_POWER_USAGE_PERCENT)).isEqualTo(
308ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei                USAGE_PERCENT);
3093fb054f3d3df6ed3ca07036720116f9eae4098b7jackqdyulei        assertThat(mBundle.getParcelableArrayList(
3103fb054f3d3df6ed3ca07036720116f9eae4098b7jackqdyulei                AdvancedPowerUsageDetail.EXTRA_ANOMALY_LIST)).isNull();
311ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    }
312ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
313ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    @Test
314ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    public void testStartBatteryDetailPage_NormalApp() {
315ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        mBatterySipper.mPackages = PACKAGE_NAME;
316a64839b59d4aaa21ffb83bba6f0321db2f386e96jackqdyulei        mBatteryEntry.defaultPackageName = PACKAGE_NAME[0];
317987711712cf9677bb24686df3a03a6f78adbdc85Michael Wachenschwanz        AdvancedPowerUsageDetail.startBatteryDetailPage(mTestActivity, mBatteryUtils, null,
318987711712cf9677bb24686df3a03a6f78adbdc85Michael Wachenschwanz                mBatteryStatsHelper, 0, mBatteryEntry, USAGE_PERCENT, mAnomalies);
319ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
320ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        assertThat(mBundle.getString(AdvancedPowerUsageDetail.EXTRA_PACKAGE_NAME)).isEqualTo(
321ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei                PACKAGE_NAME[0]);
3223fb054f3d3df6ed3ca07036720116f9eae4098b7jackqdyulei        assertThat(mBundle.getParcelableArrayList(
3233fb054f3d3df6ed3ca07036720116f9eae4098b7jackqdyulei                AdvancedPowerUsageDetail.EXTRA_ANOMALY_LIST)).isEqualTo(mAnomalies);
324ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    }
325ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
326ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    @Test
327ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    public void testStartBatteryDetailPage_SystemApp() {
328ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        mBatterySipper.mPackages = null;
329987711712cf9677bb24686df3a03a6f78adbdc85Michael Wachenschwanz        AdvancedPowerUsageDetail.startBatteryDetailPage(mTestActivity, mBatteryUtils, null,
330987711712cf9677bb24686df3a03a6f78adbdc85Michael Wachenschwanz                mBatteryStatsHelper, 0, mBatteryEntry, USAGE_PERCENT, null);
331ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
332ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        assertThat(mBundle.getString(AdvancedPowerUsageDetail.EXTRA_LABEL)).isEqualTo(APP_LABEL);
333ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        assertThat(mBundle.getInt(AdvancedPowerUsageDetail.EXTRA_ICON_ID)).isEqualTo(ICON_ID);
3343fb054f3d3df6ed3ca07036720116f9eae4098b7jackqdyulei        assertThat(mBundle.getString(AdvancedPowerUsageDetail.EXTRA_PACKAGE_NAME)).isNull();
3353fb054f3d3df6ed3ca07036720116f9eae4098b7jackqdyulei        assertThat(mBundle.getParcelableArrayList(
3363fb054f3d3df6ed3ca07036720116f9eae4098b7jackqdyulei                AdvancedPowerUsageDetail.EXTRA_ANOMALY_LIST)).isNull();
337ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    }
3385ab93ad700b06cde50d052cdb70af4dad78bebaeTony Mak
3395ab93ad700b06cde50d052cdb70af4dad78bebaeTony Mak    @Test
3405ab93ad700b06cde50d052cdb70af4dad78bebaeTony Mak    public void testStartBatteryDetailPage_WorkApp() {
3415ab93ad700b06cde50d052cdb70af4dad78bebaeTony Mak        final int appUid = 1010019;
3425ab93ad700b06cde50d052cdb70af4dad78bebaeTony Mak        mBatterySipper.mPackages = PACKAGE_NAME;
3435ab93ad700b06cde50d052cdb70af4dad78bebaeTony Mak        doReturn(appUid).when(mBatterySipper).getUid();
344987711712cf9677bb24686df3a03a6f78adbdc85Michael Wachenschwanz        AdvancedPowerUsageDetail.startBatteryDetailPage(mTestActivity, mBatteryUtils, null,
345987711712cf9677bb24686df3a03a6f78adbdc85Michael Wachenschwanz                mBatteryStatsHelper, 0, mBatteryEntry, USAGE_PERCENT, null);
3465ab93ad700b06cde50d052cdb70af4dad78bebaeTony Mak
3475ab93ad700b06cde50d052cdb70af4dad78bebaeTony Mak        verify(mTestActivity).startPreferencePanelAsUser(
348046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam                nullable(Fragment.class), nullable(String.class), nullable(Bundle.class), anyInt(),
349046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam                nullable(CharSequence.class), eq(new UserHandle(10)));
3505ab93ad700b06cde50d052cdb70af4dad78bebaeTony Mak    }
3512a95a634660199d6f1bd003f5fb6aba82e105810jackqdyulei
3522a95a634660199d6f1bd003f5fb6aba82e105810jackqdyulei    @Test
3532a95a634660199d6f1bd003f5fb6aba82e105810jackqdyulei    public void testStartBatteryDetailPage_noBatteryUsage_hasBasicData() {
3542a95a634660199d6f1bd003f5fb6aba82e105810jackqdyulei        final ArgumentCaptor<Bundle> captor = ArgumentCaptor.forClass(Bundle.class);
355046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam        Answer<Void> callable = invocation -> {
356046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam            mBundle = captor.getValue();
357046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam            return null;
3582a95a634660199d6f1bd003f5fb6aba82e105810jackqdyulei        };
359046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam        doAnswer(callable).when(mTestActivity).startPreferencePanelAsUser(nullable(Fragment.class),
360046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam                nullable(String.class), captor.capture(), anyInt(), nullable(CharSequence.class),
361046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam                nullable(UserHandle.class));
3622a95a634660199d6f1bd003f5fb6aba82e105810jackqdyulei
3632a95a634660199d6f1bd003f5fb6aba82e105810jackqdyulei        AdvancedPowerUsageDetail.startBatteryDetailPage(mTestActivity, null, PACKAGE_NAME[0]);
3642a95a634660199d6f1bd003f5fb6aba82e105810jackqdyulei
3652a95a634660199d6f1bd003f5fb6aba82e105810jackqdyulei        assertThat(mBundle.getString(AdvancedPowerUsageDetail.EXTRA_PACKAGE_NAME)).isEqualTo(
3662a95a634660199d6f1bd003f5fb6aba82e105810jackqdyulei                PACKAGE_NAME[0]);
3672a95a634660199d6f1bd003f5fb6aba82e105810jackqdyulei        assertThat(mBundle.getString(AdvancedPowerUsageDetail.EXTRA_POWER_USAGE_PERCENT)).isEqualTo(
3682a95a634660199d6f1bd003f5fb6aba82e105810jackqdyulei                "0%");
3692a95a634660199d6f1bd003f5fb6aba82e105810jackqdyulei    }
3702a95a634660199d6f1bd003f5fb6aba82e105810jackqdyulei
371040c21bcb50bbaf550fa1473ee062cfc75b5e30bjackqdyulei    @Test
372fe5a771e92cb22631e688403cce45c826bbda044jackqdyulei    public void testStartBatteryDetailPage_batteryEntryNotExisted_extractUidFromPackageName() throws
373fe5a771e92cb22631e688403cce45c826bbda044jackqdyulei            PackageManager.NameNotFoundException{
374fe5a771e92cb22631e688403cce45c826bbda044jackqdyulei        doReturn(UID).when(mPackageManager).getPackageUid(PACKAGE_NAME[0], 0 /* no flag */);
375fe5a771e92cb22631e688403cce45c826bbda044jackqdyulei
376fe5a771e92cb22631e688403cce45c826bbda044jackqdyulei        AdvancedPowerUsageDetail.startBatteryDetailPage(mTestActivity, null, PACKAGE_NAME[0]);
377fe5a771e92cb22631e688403cce45c826bbda044jackqdyulei
378fe5a771e92cb22631e688403cce45c826bbda044jackqdyulei        assertThat(mBundle.getInt(AdvancedPowerUsageDetail.EXTRA_UID)).isEqualTo(UID);
379fe5a771e92cb22631e688403cce45c826bbda044jackqdyulei    }
380fe5a771e92cb22631e688403cce45c826bbda044jackqdyulei
381fe5a771e92cb22631e688403cce45c826bbda044jackqdyulei    @Test
38251872ed3456582533585d229d83d4df3ff4c0cb7jackqdyulei    public void testStartBatteryDetailPage_defaultPackageNull_chooseFromBatterySipper() {
38351872ed3456582533585d229d83d4df3ff4c0cb7jackqdyulei        mBatteryEntry.defaultPackageName = null;
38451872ed3456582533585d229d83d4df3ff4c0cb7jackqdyulei        mBatteryEntry.sipper.mPackages = PACKAGE_NAME;
38551872ed3456582533585d229d83d4df3ff4c0cb7jackqdyulei
38651872ed3456582533585d229d83d4df3ff4c0cb7jackqdyulei        AdvancedPowerUsageDetail.startBatteryDetailPage(mTestActivity, mBatteryUtils, null,
38751872ed3456582533585d229d83d4df3ff4c0cb7jackqdyulei                mBatteryStatsHelper, 0, mBatteryEntry, USAGE_PERCENT, null);
38851872ed3456582533585d229d83d4df3ff4c0cb7jackqdyulei
38951872ed3456582533585d229d83d4df3ff4c0cb7jackqdyulei        assertThat(mBundle.getString(AdvancedPowerUsageDetail.EXTRA_PACKAGE_NAME)).isEqualTo(
39051872ed3456582533585d229d83d4df3ff4c0cb7jackqdyulei                PACKAGE_NAME[0]);
39151872ed3456582533585d229d83d4df3ff4c0cb7jackqdyulei    }
39251872ed3456582533585d229d83d4df3ff4c0cb7jackqdyulei
39351872ed3456582533585d229d83d4df3ff4c0cb7jackqdyulei    @Test
394040c21bcb50bbaf550fa1473ee062cfc75b5e30bjackqdyulei    public void testInitPreference_hasCorrectSummary() {
395040c21bcb50bbaf550fa1473ee062cfc75b5e30bjackqdyulei        Bundle bundle = new Bundle(4);
396040c21bcb50bbaf550fa1473ee062cfc75b5e30bjackqdyulei        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, BACKGROUND_TIME_MS);
397040c21bcb50bbaf550fa1473ee062cfc75b5e30bjackqdyulei        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, FOREGROUND_TIME_MS);
398040c21bcb50bbaf550fa1473ee062cfc75b5e30bjackqdyulei        bundle.putString(AdvancedPowerUsageDetail.EXTRA_POWER_USAGE_PERCENT, USAGE_PERCENT);
399040c21bcb50bbaf550fa1473ee062cfc75b5e30bjackqdyulei        bundle.putInt(AdvancedPowerUsageDetail.EXTRA_POWER_USAGE_AMOUNT, POWER_MAH);
400040c21bcb50bbaf550fa1473ee062cfc75b5e30bjackqdyulei        doReturn(bundle).when(mFragment).getArguments();
401040c21bcb50bbaf550fa1473ee062cfc75b5e30bjackqdyulei
402040c21bcb50bbaf550fa1473ee062cfc75b5e30bjackqdyulei        doReturn(mContext.getText(R.string.battery_used_for)).when(mFragment).getText(
403040c21bcb50bbaf550fa1473ee062cfc75b5e30bjackqdyulei                R.string.battery_used_for);
404040c21bcb50bbaf550fa1473ee062cfc75b5e30bjackqdyulei        doReturn(mContext.getText(R.string.battery_active_for)).when(mFragment).getText(
405040c21bcb50bbaf550fa1473ee062cfc75b5e30bjackqdyulei                R.string.battery_active_for);
406040c21bcb50bbaf550fa1473ee062cfc75b5e30bjackqdyulei        doReturn(mContext.getString(R.string.battery_detail_power_percentage, USAGE_PERCENT,
407040c21bcb50bbaf550fa1473ee062cfc75b5e30bjackqdyulei                POWER_MAH)).when(mFragment)
408040c21bcb50bbaf550fa1473ee062cfc75b5e30bjackqdyulei                .getString(R.string.battery_detail_power_percentage, USAGE_PERCENT, POWER_MAH);
409040c21bcb50bbaf550fa1473ee062cfc75b5e30bjackqdyulei
410040c21bcb50bbaf550fa1473ee062cfc75b5e30bjackqdyulei        mFragment.initPreference();
411040c21bcb50bbaf550fa1473ee062cfc75b5e30bjackqdyulei
412040c21bcb50bbaf550fa1473ee062cfc75b5e30bjackqdyulei        assertThat(mForegroundPreference.getSummary().toString()).isEqualTo("Used for 0m");
413040c21bcb50bbaf550fa1473ee062cfc75b5e30bjackqdyulei        assertThat(mBackgroundPreference.getSummary().toString()).isEqualTo("Active for 0m");
414040c21bcb50bbaf550fa1473ee062cfc75b5e30bjackqdyulei        assertThat(mPowerUsagePreference.getSummary()).isEqualTo("16% of total app usage (150mAh)");
415040c21bcb50bbaf550fa1473ee062cfc75b5e30bjackqdyulei    }
416040c21bcb50bbaf550fa1473ee062cfc75b5e30bjackqdyulei
4173fb054f3d3df6ed3ca07036720116f9eae4098b7jackqdyulei    @Test
4183fb054f3d3df6ed3ca07036720116f9eae4098b7jackqdyulei    public void testInitAnomalyInfo_anomalyNull_startAnomalyLoader() {
4193fb054f3d3df6ed3ca07036720116f9eae4098b7jackqdyulei        doReturn(null).when(mBundle).getParcelableArrayList(
4203fb054f3d3df6ed3ca07036720116f9eae4098b7jackqdyulei                AdvancedPowerUsageDetail.EXTRA_ANOMALY_LIST);
4213fb054f3d3df6ed3ca07036720116f9eae4098b7jackqdyulei
4223fb054f3d3df6ed3ca07036720116f9eae4098b7jackqdyulei        mFragment.initAnomalyInfo();
4233fb054f3d3df6ed3ca07036720116f9eae4098b7jackqdyulei
4243fb054f3d3df6ed3ca07036720116f9eae4098b7jackqdyulei        verify(mLoaderManager).initLoader(eq(0), eq(Bundle.EMPTY), any());
4253fb054f3d3df6ed3ca07036720116f9eae4098b7jackqdyulei    }
4263fb054f3d3df6ed3ca07036720116f9eae4098b7jackqdyulei
4273fb054f3d3df6ed3ca07036720116f9eae4098b7jackqdyulei    @Test
4283fb054f3d3df6ed3ca07036720116f9eae4098b7jackqdyulei    public void testInitAnomalyInfo_anomalyExisted_updateAnomaly() {
4293fb054f3d3df6ed3ca07036720116f9eae4098b7jackqdyulei        doReturn(mAnomalies).when(mBundle).getParcelableArrayList(
4303fb054f3d3df6ed3ca07036720116f9eae4098b7jackqdyulei                AdvancedPowerUsageDetail.EXTRA_ANOMALY_LIST);
4313fb054f3d3df6ed3ca07036720116f9eae4098b7jackqdyulei
4323fb054f3d3df6ed3ca07036720116f9eae4098b7jackqdyulei        mFragment.initAnomalyInfo();
4333fb054f3d3df6ed3ca07036720116f9eae4098b7jackqdyulei
4343fb054f3d3df6ed3ca07036720116f9eae4098b7jackqdyulei        verify(mAnomalySummaryPreferenceController).updateAnomalySummaryPreference(mAnomalies);
4353fb054f3d3df6ed3ca07036720116f9eae4098b7jackqdyulei    }
4363fb054f3d3df6ed3ca07036720116f9eae4098b7jackqdyulei
437ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei}
438