AdvancedPowerUsageDetailTest.java revision 2a95a634660199d6f1bd003f5fb6aba82e105810
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
215ab93ad700b06cde50d052cdb70af4dad78bebaeTony Makimport static org.mockito.Matchers.any;
225ab93ad700b06cde50d052cdb70af4dad78bebaeTony Makimport static org.mockito.Matchers.anyInt;
235ab93ad700b06cde50d052cdb70af4dad78bebaeTony Makimport static org.mockito.Matchers.anyLong;
245ab93ad700b06cde50d052cdb70af4dad78bebaeTony Makimport static org.mockito.Matchers.anyString;
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;
33ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleiimport android.content.Context;
34ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleiimport android.content.pm.ApplicationInfo;
355d2918a6756cdb9890ffbddf0991426486d86213jackqdyuleiimport android.content.pm.PackageManager;
36ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleiimport android.graphics.drawable.Drawable;
37ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleiimport android.os.BatteryStats;
38ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleiimport android.os.Bundle;
395ab93ad700b06cde50d052cdb70af4dad78bebaeTony Makimport android.os.UserHandle;
40841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhangimport android.support.v7.widget.RecyclerView;
41ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
42ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleiimport com.android.internal.os.BatterySipper;
43ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleiimport com.android.internal.os.BatteryStatsHelper;
44ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleiimport com.android.settings.SettingsActivity;
45be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhangimport com.android.settings.SettingsRobolectricTestRunner;
46ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleiimport com.android.settings.TestConfig;
47ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleiimport com.android.settings.applications.LayoutPreference;
48ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleiimport com.android.settings.testutils.FakeFeatureFactory;
49d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhangimport com.android.settings.testutils.shadow.ShadowEntityHeaderController;
50d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhangimport com.android.settings.widget.EntityHeaderController;
5178e3a051d8da845997590ca8e04215e43264aa3aJesse Evansimport com.android.settingslib.applications.AppUtils;
52ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleiimport com.android.settingslib.applications.ApplicationsState;
5378e3a051d8da845997590ca8e04215e43264aa3aJesse Evansimport com.android.settingslib.applications.instantapps.InstantAppDataProvider;
54841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhangimport com.android.settingslib.core.lifecycle.Lifecycle;
55ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
56d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhangimport org.junit.After;
57ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleiimport org.junit.Before;
58ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleiimport org.junit.Test;
59ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleiimport org.junit.runner.RunWith;
60ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleiimport org.mockito.Answers;
61ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleiimport org.mockito.ArgumentCaptor;
62ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleiimport org.mockito.Mock;
63ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleiimport org.mockito.MockitoAnnotations;
64ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleiimport org.mockito.invocation.InvocationOnMock;
65ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleiimport org.mockito.stubbing.Answer;
66f4c1cef322f2c747b606ba0d78563bbb0e887c51jackqdyuleiimport org.robolectric.RuntimeEnvironment;
67ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleiimport org.robolectric.annotation.Config;
68ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleiimport org.robolectric.util.ReflectionHelpers;
69ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
70be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang@RunWith(SettingsRobolectricTestRunner.class)
71d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION,
72d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang        shadows = ShadowEntityHeaderController.class)
73ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleipublic class AdvancedPowerUsageDetailTest {
74ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private static final String APP_LABEL = "app label";
75ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private static final String SUMMARY = "summary";
76ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private static final String[] PACKAGE_NAME = {"com.android.app"};
77ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private static final String USAGE_PERCENT = "16";
78ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private static final int ICON_ID = 123;
79ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private static final int UID = 1;
80ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private static final long BACKGROUND_TIME_US = 100 * 1000;
81ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private static final long FOREGROUND_TIME_US = 200 * 1000;
82ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private static final long BACKGROUND_TIME_MS = 100;
83ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private static final long FOREGROUND_TIME_MS = 200;
8434145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei    private static final long PHONE_FOREGROUND_TIME_MS = 250 * 1000;
8534145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei    private static final long PHONE_BACKGROUND_TIME_MS = 0;
86ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
87ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
88ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private Context mContext;
89be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
90be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang    private Activity mActivity;
91ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    @Mock
92f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang    private EntityHeaderController mEntityHeaderController;
93ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    @Mock
94ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private LayoutPreference mHeaderPreference;
95ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    @Mock
96ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private ApplicationsState mState;
97ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    @Mock
98ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private ApplicationsState.AppEntry mAppEntry;
99ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    @Mock
100ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private Bundle mBundle;
101ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    @Mock
102ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private BatteryEntry mBatteryEntry;
103ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    @Mock
104ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private BatterySipper mBatterySipper;
105ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    @Mock
106ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private BatteryStatsHelper mBatteryStatsHelper;
107ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    @Mock
108ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private BatteryStats.Uid mUid;
1095d2918a6756cdb9890ffbddf0991426486d86213jackqdyulei    @Mock
1105d2918a6756cdb9890ffbddf0991426486d86213jackqdyulei    private PackageManager mPackageManager;
111ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private AdvancedPowerUsageDetail mFragment;
112ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private FakeFeatureFactory mFeatureFactory;
113ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private SettingsActivity mTestActivity;
114ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
115ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    @Before
116ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    public void setUp() {
117ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        MockitoAnnotations.initMocks(this);
118ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        FakeFeatureFactory.setupForTest(mContext);
119ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        mFeatureFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext);
120ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
121ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        mFragment = spy(new AdvancedPowerUsageDetail());
122ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        doReturn(mContext).when(mFragment).getContext();
123be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang        doReturn(mActivity).when(mFragment).getActivity();
124ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        doReturn(SUMMARY).when(mFragment).getString(anyInt());
125ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        doReturn(APP_LABEL).when(mBundle).getString(anyString());
126ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        doReturn(mBundle).when(mFragment).getArguments();
127ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
128d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang        ShadowEntityHeaderController.setUseMock(mEntityHeaderController);
129f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang        doReturn(mEntityHeaderController).when(mEntityHeaderController)
130841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang                .setRecyclerView(any(RecyclerView.class), any(Lifecycle.class));
131841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang        doReturn(mEntityHeaderController).when(mEntityHeaderController)
132f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang                .setButtonActions(anyInt(), anyInt());
133f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang        doReturn(mEntityHeaderController).when(mEntityHeaderController)
134f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang                .setIcon(any(Drawable.class));
135f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang        doReturn(mEntityHeaderController).when(mEntityHeaderController).setIcon(any(
136ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei                ApplicationsState.AppEntry.class));
137f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang        doReturn(mEntityHeaderController).when(mEntityHeaderController).setLabel(anyString());
138f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang        doReturn(mEntityHeaderController).when(mEntityHeaderController)
139f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang                .setLabel(any(ApplicationsState.AppEntry.class));
140f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang        doReturn(mEntityHeaderController).when(mEntityHeaderController).setSummary(anyString());
141ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
142ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        doReturn(UID).when(mBatterySipper).getUid();
143ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        doReturn(APP_LABEL).when(mBatteryEntry).getLabel();
144ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        doReturn(BACKGROUND_TIME_US).when(mUid).getProcessStateTime(
145ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei                eq(BatteryStats.Uid.PROCESS_STATE_BACKGROUND), anyLong(), anyInt());
146ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        doReturn(FOREGROUND_TIME_US).when(mUid).getProcessStateTime(
14701e690e37781553bae0dea3f7208103bb5474970jackqdyulei                eq(BatteryStats.Uid.PROCESS_STATE_TOP), anyLong(), anyInt());
148ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        ReflectionHelpers.setField(mBatteryEntry, "sipper", mBatterySipper);
149ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        mBatteryEntry.iconId = ICON_ID;
150ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        mBatterySipper.uidObj = mUid;
15134145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei        mBatterySipper.drainType = BatterySipper.DrainType.APP;
152ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
153ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        mFragment.mHeaderPreference = mHeaderPreference;
154ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        mFragment.mState = mState;
155f4c1cef322f2c747b606ba0d78563bbb0e887c51jackqdyulei        mFragment.mBatteryUtils = new BatteryUtils(RuntimeEnvironment.application);
156ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        mAppEntry.info = mock(ApplicationInfo.class);
157ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
158ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        mTestActivity = spy(new SettingsActivity());
1595d2918a6756cdb9890ffbddf0991426486d86213jackqdyulei        doReturn(mPackageManager).when(mTestActivity).getPackageManager();
160ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
161ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        final ArgumentCaptor<Bundle> captor = ArgumentCaptor.forClass(Bundle.class);
162ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
163ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        Answer<Void> callable = new Answer<Void>() {
164ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei            @Override
165ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei            public Void answer(InvocationOnMock invocation) throws Exception {
166ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei                mBundle = captor.getValue();
167ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei                return null;
168ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei            }
169ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        };
170ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        doAnswer(callable).when(mTestActivity).startPreferencePanelAsUser(any(), anyString(),
171ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei                captor.capture(), anyInt(), any(), any());
172ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    }
173ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
174d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang    @After
175d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang    public void reset() {
176d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang        ShadowEntityHeaderController.reset();
177d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang    }
178d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang
179ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    @Test
180ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    public void testInitHeader_NoAppEntry_BuildByBundle() {
181ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        mFragment.mAppEntry = null;
182ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        mFragment.initHeader();
183ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
184f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang        verify(mEntityHeaderController).setIcon(any(Drawable.class));
185f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang        verify(mEntityHeaderController).setLabel(APP_LABEL);
186ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    }
187ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
188ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    @Test
189ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    public void testInitHeader_HasAppEntry_BuildByAppEntry() {
19078e3a051d8da845997590ca8e04215e43264aa3aJesse Evans        ReflectionHelpers.setStaticField(AppUtils.class, "sInstantAppDataProvider",
19178e3a051d8da845997590ca8e04215e43264aa3aJesse Evans                new InstantAppDataProvider() {
19278e3a051d8da845997590ca8e04215e43264aa3aJesse Evans                    @Override
19378e3a051d8da845997590ca8e04215e43264aa3aJesse Evans                    public boolean isInstantApp(ApplicationInfo info) {
19478e3a051d8da845997590ca8e04215e43264aa3aJesse Evans                        return false;
19578e3a051d8da845997590ca8e04215e43264aa3aJesse Evans                    }
19678e3a051d8da845997590ca8e04215e43264aa3aJesse Evans                });
19778e3a051d8da845997590ca8e04215e43264aa3aJesse Evans        mFragment.mAppEntry = mAppEntry;
19878e3a051d8da845997590ca8e04215e43264aa3aJesse Evans        mFragment.initHeader();
19978e3a051d8da845997590ca8e04215e43264aa3aJesse Evans
200f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang        verify(mEntityHeaderController).setIcon(mAppEntry);
201f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang        verify(mEntityHeaderController).setLabel(mAppEntry);
202f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang        verify(mEntityHeaderController).setIsInstantApp(false);
20378e3a051d8da845997590ca8e04215e43264aa3aJesse Evans    }
20478e3a051d8da845997590ca8e04215e43264aa3aJesse Evans
20578e3a051d8da845997590ca8e04215e43264aa3aJesse Evans    @Test
20678e3a051d8da845997590ca8e04215e43264aa3aJesse Evans    public void testInitHeader_HasAppEntry_InstantApp() {
20778e3a051d8da845997590ca8e04215e43264aa3aJesse Evans        ReflectionHelpers.setStaticField(AppUtils.class, "sInstantAppDataProvider",
20878e3a051d8da845997590ca8e04215e43264aa3aJesse Evans                new InstantAppDataProvider() {
20978e3a051d8da845997590ca8e04215e43264aa3aJesse Evans                    @Override
21078e3a051d8da845997590ca8e04215e43264aa3aJesse Evans                    public boolean isInstantApp(ApplicationInfo info) {
21178e3a051d8da845997590ca8e04215e43264aa3aJesse Evans                        return true;
21278e3a051d8da845997590ca8e04215e43264aa3aJesse Evans                    }
21378e3a051d8da845997590ca8e04215e43264aa3aJesse Evans                });
214ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        mFragment.mAppEntry = mAppEntry;
215ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        mFragment.initHeader();
216ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
217f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang        verify(mEntityHeaderController).setIcon(mAppEntry);
218f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang        verify(mEntityHeaderController).setLabel(mAppEntry);
219f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang        verify(mEntityHeaderController).setIsInstantApp(true);
220f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang        verify(mEntityHeaderController).setSummary((CharSequence) null);
221ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    }
222ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
223ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    @Test
224ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    public void testStartBatteryDetailPage_hasBasicData() {
225ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        AdvancedPowerUsageDetail.startBatteryDetailPage(mTestActivity, null, mBatteryStatsHelper, 0,
226ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei                mBatteryEntry, USAGE_PERCENT);
227ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
228ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        assertThat(mBundle.getInt(AdvancedPowerUsageDetail.EXTRA_UID)).isEqualTo(UID);
229ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        assertThat(mBundle.getLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME)).isEqualTo(
230ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei                BACKGROUND_TIME_MS);
231ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        assertThat(mBundle.getLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME)).isEqualTo(
232ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei                FOREGROUND_TIME_MS);
233ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        assertThat(mBundle.getString(AdvancedPowerUsageDetail.EXTRA_POWER_USAGE_PERCENT)).isEqualTo(
23434145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei                USAGE_PERCENT);
23534145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei    }
23634145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei
23734145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei    @Test
23834145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei    public void testStartBatteryDetailPage_typeNotApp_hasBasicData() {
23934145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei        mBatterySipper.drainType = BatterySipper.DrainType.PHONE;
24034145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei        mBatterySipper.usageTimeMs = PHONE_FOREGROUND_TIME_MS;
24134145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei
24234145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei        AdvancedPowerUsageDetail.startBatteryDetailPage(mTestActivity, null, mBatteryStatsHelper, 0,
24334145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei                mBatteryEntry, USAGE_PERCENT);
24434145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei
24534145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei        assertThat(mBundle.getInt(AdvancedPowerUsageDetail.EXTRA_UID)).isEqualTo(UID);
24634145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei        assertThat(mBundle.getLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME)).isEqualTo(
24734145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei                PHONE_FOREGROUND_TIME_MS);
24834145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei        assertThat(mBundle.getLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME)).isEqualTo(
24934145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei                PHONE_BACKGROUND_TIME_MS);
25034145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei        assertThat(mBundle.getString(AdvancedPowerUsageDetail.EXTRA_POWER_USAGE_PERCENT)).isEqualTo(
251ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei                USAGE_PERCENT);
252ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    }
253ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
254ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    @Test
255ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    public void testStartBatteryDetailPage_NormalApp() {
256ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        mBatterySipper.mPackages = PACKAGE_NAME;
257ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        AdvancedPowerUsageDetail.startBatteryDetailPage(mTestActivity, null, mBatteryStatsHelper, 0,
258ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei                mBatteryEntry, USAGE_PERCENT);
259ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
260ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        assertThat(mBundle.getString(AdvancedPowerUsageDetail.EXTRA_PACKAGE_NAME)).isEqualTo(
261ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei                PACKAGE_NAME[0]);
262ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    }
263ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
264ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    @Test
265ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    public void testStartBatteryDetailPage_SystemApp() {
266ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        mBatterySipper.mPackages = null;
267ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        AdvancedPowerUsageDetail.startBatteryDetailPage(mTestActivity, null, mBatteryStatsHelper, 0,
268ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei                mBatteryEntry, USAGE_PERCENT);
269ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
270ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        assertThat(mBundle.getString(AdvancedPowerUsageDetail.EXTRA_LABEL)).isEqualTo(APP_LABEL);
271ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        assertThat(mBundle.getInt(AdvancedPowerUsageDetail.EXTRA_ICON_ID)).isEqualTo(ICON_ID);
272ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        assertThat(mBundle.getString(AdvancedPowerUsageDetail.EXTRA_PACKAGE_NAME)).isEqualTo(null);
273ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    }
2745ab93ad700b06cde50d052cdb70af4dad78bebaeTony Mak
2755ab93ad700b06cde50d052cdb70af4dad78bebaeTony Mak    @Test
2765ab93ad700b06cde50d052cdb70af4dad78bebaeTony Mak    public void testStartBatteryDetailPage_WorkApp() {
2775ab93ad700b06cde50d052cdb70af4dad78bebaeTony Mak        final int appUid = 1010019;
2785ab93ad700b06cde50d052cdb70af4dad78bebaeTony Mak        mBatterySipper.mPackages = PACKAGE_NAME;
2795ab93ad700b06cde50d052cdb70af4dad78bebaeTony Mak        doReturn(appUid).when(mBatterySipper).getUid();
2805ab93ad700b06cde50d052cdb70af4dad78bebaeTony Mak        AdvancedPowerUsageDetail.startBatteryDetailPage(mTestActivity, null, mBatteryStatsHelper, 0,
2815ab93ad700b06cde50d052cdb70af4dad78bebaeTony Mak                mBatteryEntry, USAGE_PERCENT);
2825ab93ad700b06cde50d052cdb70af4dad78bebaeTony Mak
2835ab93ad700b06cde50d052cdb70af4dad78bebaeTony Mak        verify(mTestActivity).startPreferencePanelAsUser(
2845ab93ad700b06cde50d052cdb70af4dad78bebaeTony Mak                any(), anyString(), any(), anyInt(), any(), eq(new UserHandle(10)));
2855ab93ad700b06cde50d052cdb70af4dad78bebaeTony Mak    }
2862a95a634660199d6f1bd003f5fb6aba82e105810jackqdyulei
2872a95a634660199d6f1bd003f5fb6aba82e105810jackqdyulei    @Test
2882a95a634660199d6f1bd003f5fb6aba82e105810jackqdyulei    public void testStartBatteryDetailPage_noBatteryUsage_hasBasicData() {
2892a95a634660199d6f1bd003f5fb6aba82e105810jackqdyulei        final ArgumentCaptor<Bundle> captor = ArgumentCaptor.forClass(Bundle.class);
2902a95a634660199d6f1bd003f5fb6aba82e105810jackqdyulei        Answer<Void> callable = new Answer<Void>() {
2912a95a634660199d6f1bd003f5fb6aba82e105810jackqdyulei            @Override
2922a95a634660199d6f1bd003f5fb6aba82e105810jackqdyulei            public Void answer(InvocationOnMock invocation) throws Exception {
2932a95a634660199d6f1bd003f5fb6aba82e105810jackqdyulei                mBundle = captor.getValue();
2942a95a634660199d6f1bd003f5fb6aba82e105810jackqdyulei                return null;
2952a95a634660199d6f1bd003f5fb6aba82e105810jackqdyulei            }
2962a95a634660199d6f1bd003f5fb6aba82e105810jackqdyulei        };
2972a95a634660199d6f1bd003f5fb6aba82e105810jackqdyulei        doAnswer(callable).when(mTestActivity).startPreferencePanelAsUser(any(), anyString(),
2982a95a634660199d6f1bd003f5fb6aba82e105810jackqdyulei                captor.capture(), anyInt(), any(), any());
2992a95a634660199d6f1bd003f5fb6aba82e105810jackqdyulei
3002a95a634660199d6f1bd003f5fb6aba82e105810jackqdyulei        AdvancedPowerUsageDetail.startBatteryDetailPage(mTestActivity, null, PACKAGE_NAME[0]);
3012a95a634660199d6f1bd003f5fb6aba82e105810jackqdyulei
3022a95a634660199d6f1bd003f5fb6aba82e105810jackqdyulei        assertThat(mBundle.getString(AdvancedPowerUsageDetail.EXTRA_PACKAGE_NAME)).isEqualTo(
3032a95a634660199d6f1bd003f5fb6aba82e105810jackqdyulei                PACKAGE_NAME[0]);
3042a95a634660199d6f1bd003f5fb6aba82e105810jackqdyulei        assertThat(mBundle.getString(AdvancedPowerUsageDetail.EXTRA_POWER_USAGE_PERCENT)).isEqualTo(
3052a95a634660199d6f1bd003f5fb6aba82e105810jackqdyulei                "0%");
3062a95a634660199d6f1bd003f5fb6aba82e105810jackqdyulei    }
3072a95a634660199d6f1bd003f5fb6aba82e105810jackqdyulei
308ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei}
309