AdvancedPowerUsageDetailTest.java revision 046400c2c407429da47e6b2230ba8bbd21c43e9b
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;
225ab93ad700b06cde50d052cdb70af4dad78bebaeTony Makimport static org.mockito.Matchers.anyInt;
235ab93ad700b06cde50d052cdb70af4dad78bebaeTony Makimport static org.mockito.Matchers.anyLong;
245ab93ad700b06cde50d052cdb70af4dad78bebaeTony Makimport static org.mockito.Matchers.eq;
255ab93ad700b06cde50d052cdb70af4dad78bebaeTony Makimport static org.mockito.Mockito.doAnswer;
265ab93ad700b06cde50d052cdb70af4dad78bebaeTony Makimport static org.mockito.Mockito.doReturn;
275ab93ad700b06cde50d052cdb70af4dad78bebaeTony Makimport static org.mockito.Mockito.mock;
285ab93ad700b06cde50d052cdb70af4dad78bebaeTony Makimport static org.mockito.Mockito.spy;
295ab93ad700b06cde50d052cdb70af4dad78bebaeTony Makimport static org.mockito.Mockito.verify;
305ab93ad700b06cde50d052cdb70af4dad78bebaeTony Mak
31be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhangimport android.app.Activity;
32046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lamimport android.app.Fragment;
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.stubbing.Answer;
65f4c1cef322f2c747b606ba0d78563bbb0e887c51jackqdyuleiimport org.robolectric.RuntimeEnvironment;
66ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleiimport org.robolectric.annotation.Config;
67ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleiimport org.robolectric.util.ReflectionHelpers;
68ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
69be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang@RunWith(SettingsRobolectricTestRunner.class)
70d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION,
71d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang        shadows = ShadowEntityHeaderController.class)
72ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyuleipublic class AdvancedPowerUsageDetailTest {
73ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private static final String APP_LABEL = "app label";
74ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private static final String SUMMARY = "summary";
75ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private static final String[] PACKAGE_NAME = {"com.android.app"};
76ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private static final String USAGE_PERCENT = "16";
77ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private static final int ICON_ID = 123;
78ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private static final int UID = 1;
79ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private static final long BACKGROUND_TIME_US = 100 * 1000;
80ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private static final long FOREGROUND_TIME_US = 200 * 1000;
81ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private static final long BACKGROUND_TIME_MS = 100;
82ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private static final long FOREGROUND_TIME_MS = 200;
8334145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei    private static final long PHONE_FOREGROUND_TIME_MS = 250 * 1000;
8434145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei    private static final long PHONE_BACKGROUND_TIME_MS = 0;
85ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
86ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
87ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private Context mContext;
88be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
89be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang    private Activity mActivity;
90ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    @Mock
91f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang    private EntityHeaderController mEntityHeaderController;
92ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    @Mock
93ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private LayoutPreference mHeaderPreference;
94ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    @Mock
95ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private ApplicationsState mState;
96ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    @Mock
97ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private ApplicationsState.AppEntry mAppEntry;
98ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    @Mock
99ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private Bundle mBundle;
100ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    @Mock
101ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private BatteryEntry mBatteryEntry;
102ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    @Mock
103ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private BatterySipper mBatterySipper;
104ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    @Mock
105ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private BatteryStatsHelper mBatteryStatsHelper;
106ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    @Mock
107ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private BatteryStats.Uid mUid;
1085d2918a6756cdb9890ffbddf0991426486d86213jackqdyulei    @Mock
1095d2918a6756cdb9890ffbddf0991426486d86213jackqdyulei    private PackageManager mPackageManager;
110ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private AdvancedPowerUsageDetail mFragment;
111ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private FakeFeatureFactory mFeatureFactory;
112ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    private SettingsActivity mTestActivity;
113ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
114ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    @Before
115ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    public void setUp() {
116ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        MockitoAnnotations.initMocks(this);
117ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        FakeFeatureFactory.setupForTest(mContext);
118ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        mFeatureFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext);
119ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
120ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        mFragment = spy(new AdvancedPowerUsageDetail());
121ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        doReturn(mContext).when(mFragment).getContext();
122be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang        doReturn(mActivity).when(mFragment).getActivity();
123ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        doReturn(SUMMARY).when(mFragment).getString(anyInt());
124046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam        doReturn(APP_LABEL).when(mBundle).getString(nullable(String.class));
125ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        doReturn(mBundle).when(mFragment).getArguments();
126ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
127d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang        ShadowEntityHeaderController.setUseMock(mEntityHeaderController);
128f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang        doReturn(mEntityHeaderController).when(mEntityHeaderController)
129046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam                .setRecyclerView(nullable(RecyclerView.class), nullable(Lifecycle.class));
130841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang        doReturn(mEntityHeaderController).when(mEntityHeaderController)
131f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang                .setButtonActions(anyInt(), anyInt());
132f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang        doReturn(mEntityHeaderController).when(mEntityHeaderController)
133046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam                .setIcon(nullable(Drawable.class));
134046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam        doReturn(mEntityHeaderController).when(mEntityHeaderController).setIcon(nullable(
135ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei                ApplicationsState.AppEntry.class));
136f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang        doReturn(mEntityHeaderController).when(mEntityHeaderController)
137046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam                .setLabel(nullable(String.class));
138046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam        doReturn(mEntityHeaderController).when(mEntityHeaderController)
139046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam                .setLabel(nullable(String.class));
140046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam        doReturn(mEntityHeaderController).when(mEntityHeaderController)
141046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam                .setLabel(nullable(ApplicationsState.AppEntry.class));
142046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam        doReturn(mEntityHeaderController).when(mEntityHeaderController)
143046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam                .setSummary(nullable(String.class));
144ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
145ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        doReturn(UID).when(mBatterySipper).getUid();
146ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        doReturn(APP_LABEL).when(mBatteryEntry).getLabel();
147ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        doReturn(BACKGROUND_TIME_US).when(mUid).getProcessStateTime(
148ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei                eq(BatteryStats.Uid.PROCESS_STATE_BACKGROUND), anyLong(), anyInt());
149ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        doReturn(FOREGROUND_TIME_US).when(mUid).getProcessStateTime(
15001e690e37781553bae0dea3f7208103bb5474970jackqdyulei                eq(BatteryStats.Uid.PROCESS_STATE_TOP), anyLong(), anyInt());
151ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        ReflectionHelpers.setField(mBatteryEntry, "sipper", mBatterySipper);
152ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        mBatteryEntry.iconId = ICON_ID;
153ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        mBatterySipper.uidObj = mUid;
15434145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei        mBatterySipper.drainType = BatterySipper.DrainType.APP;
155ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
156ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        mFragment.mHeaderPreference = mHeaderPreference;
157ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        mFragment.mState = mState;
158f4c1cef322f2c747b606ba0d78563bbb0e887c51jackqdyulei        mFragment.mBatteryUtils = new BatteryUtils(RuntimeEnvironment.application);
159ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        mAppEntry.info = mock(ApplicationInfo.class);
160ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
161ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        mTestActivity = spy(new SettingsActivity());
1625d2918a6756cdb9890ffbddf0991426486d86213jackqdyulei        doReturn(mPackageManager).when(mTestActivity).getPackageManager();
163ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
164ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        final ArgumentCaptor<Bundle> captor = ArgumentCaptor.forClass(Bundle.class);
165ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
166046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam        Answer<Void> callable = invocation -> {
167046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam            mBundle = captor.getValue();
168046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam            return null;
169ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        };
170046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam        doAnswer(callable).when(mTestActivity).startPreferencePanelAsUser(
171046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam                nullable(Fragment.class), nullable(String.class), captor.capture(), anyInt(),
172046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam                nullable(CharSequence.class), nullable(UserHandle.class));
173ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    }
174ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
175d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang    @After
176d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang    public void reset() {
177d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang        ShadowEntityHeaderController.reset();
178d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang    }
179d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang
180ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    @Test
181ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    public void testInitHeader_NoAppEntry_BuildByBundle() {
182ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        mFragment.mAppEntry = null;
183ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        mFragment.initHeader();
184ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
185046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam        verify(mEntityHeaderController).setIcon(nullable(Drawable.class));
186f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang        verify(mEntityHeaderController).setLabel(APP_LABEL);
187ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    }
188ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
189ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    @Test
190ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    public void testInitHeader_HasAppEntry_BuildByAppEntry() {
19178e3a051d8da845997590ca8e04215e43264aa3aJesse Evans        ReflectionHelpers.setStaticField(AppUtils.class, "sInstantAppDataProvider",
19278e3a051d8da845997590ca8e04215e43264aa3aJesse Evans                new InstantAppDataProvider() {
19378e3a051d8da845997590ca8e04215e43264aa3aJesse Evans                    @Override
19478e3a051d8da845997590ca8e04215e43264aa3aJesse Evans                    public boolean isInstantApp(ApplicationInfo info) {
19578e3a051d8da845997590ca8e04215e43264aa3aJesse Evans                        return false;
19678e3a051d8da845997590ca8e04215e43264aa3aJesse Evans                    }
19778e3a051d8da845997590ca8e04215e43264aa3aJesse Evans                });
19878e3a051d8da845997590ca8e04215e43264aa3aJesse Evans        mFragment.mAppEntry = mAppEntry;
19978e3a051d8da845997590ca8e04215e43264aa3aJesse Evans        mFragment.initHeader();
20078e3a051d8da845997590ca8e04215e43264aa3aJesse Evans
201f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang        verify(mEntityHeaderController).setIcon(mAppEntry);
202f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang        verify(mEntityHeaderController).setLabel(mAppEntry);
203f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang        verify(mEntityHeaderController).setIsInstantApp(false);
20478e3a051d8da845997590ca8e04215e43264aa3aJesse Evans    }
20578e3a051d8da845997590ca8e04215e43264aa3aJesse Evans
20678e3a051d8da845997590ca8e04215e43264aa3aJesse Evans    @Test
20778e3a051d8da845997590ca8e04215e43264aa3aJesse Evans    public void testInitHeader_HasAppEntry_InstantApp() {
20878e3a051d8da845997590ca8e04215e43264aa3aJesse Evans        ReflectionHelpers.setStaticField(AppUtils.class, "sInstantAppDataProvider",
20978e3a051d8da845997590ca8e04215e43264aa3aJesse Evans                new InstantAppDataProvider() {
21078e3a051d8da845997590ca8e04215e43264aa3aJesse Evans                    @Override
21178e3a051d8da845997590ca8e04215e43264aa3aJesse Evans                    public boolean isInstantApp(ApplicationInfo info) {
21278e3a051d8da845997590ca8e04215e43264aa3aJesse Evans                        return true;
21378e3a051d8da845997590ca8e04215e43264aa3aJesse Evans                    }
21478e3a051d8da845997590ca8e04215e43264aa3aJesse Evans                });
215ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        mFragment.mAppEntry = mAppEntry;
216ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        mFragment.initHeader();
217ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
218f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang        verify(mEntityHeaderController).setIcon(mAppEntry);
219f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang        verify(mEntityHeaderController).setLabel(mAppEntry);
220f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang        verify(mEntityHeaderController).setIsInstantApp(true);
221f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang        verify(mEntityHeaderController).setSummary((CharSequence) null);
222ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    }
223ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
224ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    @Test
225ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    public void testStartBatteryDetailPage_hasBasicData() {
226ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        AdvancedPowerUsageDetail.startBatteryDetailPage(mTestActivity, null, mBatteryStatsHelper, 0,
227ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei                mBatteryEntry, USAGE_PERCENT);
228ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
229ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        assertThat(mBundle.getInt(AdvancedPowerUsageDetail.EXTRA_UID)).isEqualTo(UID);
230ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        assertThat(mBundle.getLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME)).isEqualTo(
231ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei                BACKGROUND_TIME_MS);
232ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        assertThat(mBundle.getLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME)).isEqualTo(
233ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei                FOREGROUND_TIME_MS);
234ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        assertThat(mBundle.getString(AdvancedPowerUsageDetail.EXTRA_POWER_USAGE_PERCENT)).isEqualTo(
23534145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei                USAGE_PERCENT);
23634145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei    }
23734145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei
23834145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei    @Test
23934145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei    public void testStartBatteryDetailPage_typeNotApp_hasBasicData() {
24034145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei        mBatterySipper.drainType = BatterySipper.DrainType.PHONE;
24134145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei        mBatterySipper.usageTimeMs = PHONE_FOREGROUND_TIME_MS;
24234145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei
24334145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei        AdvancedPowerUsageDetail.startBatteryDetailPage(mTestActivity, null, mBatteryStatsHelper, 0,
24434145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei                mBatteryEntry, USAGE_PERCENT);
24534145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei
24634145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei        assertThat(mBundle.getInt(AdvancedPowerUsageDetail.EXTRA_UID)).isEqualTo(UID);
24734145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei        assertThat(mBundle.getLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME)).isEqualTo(
24834145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei                PHONE_FOREGROUND_TIME_MS);
24934145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei        assertThat(mBundle.getLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME)).isEqualTo(
25034145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei                PHONE_BACKGROUND_TIME_MS);
25134145705de97c99eb809aaa275480f7bfa45f1edjackqdyulei        assertThat(mBundle.getString(AdvancedPowerUsageDetail.EXTRA_POWER_USAGE_PERCENT)).isEqualTo(
252ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei                USAGE_PERCENT);
253ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    }
254ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
255ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    @Test
256ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    public void testStartBatteryDetailPage_NormalApp() {
257ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        mBatterySipper.mPackages = PACKAGE_NAME;
258ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        AdvancedPowerUsageDetail.startBatteryDetailPage(mTestActivity, null, mBatteryStatsHelper, 0,
259ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei                mBatteryEntry, USAGE_PERCENT);
260ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
261ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        assertThat(mBundle.getString(AdvancedPowerUsageDetail.EXTRA_PACKAGE_NAME)).isEqualTo(
262ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei                PACKAGE_NAME[0]);
263ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    }
264ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
265ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    @Test
266ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    public void testStartBatteryDetailPage_SystemApp() {
267ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        mBatterySipper.mPackages = null;
268ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        AdvancedPowerUsageDetail.startBatteryDetailPage(mTestActivity, null, mBatteryStatsHelper, 0,
269ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei                mBatteryEntry, USAGE_PERCENT);
270ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei
271ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        assertThat(mBundle.getString(AdvancedPowerUsageDetail.EXTRA_LABEL)).isEqualTo(APP_LABEL);
272ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        assertThat(mBundle.getInt(AdvancedPowerUsageDetail.EXTRA_ICON_ID)).isEqualTo(ICON_ID);
273ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei        assertThat(mBundle.getString(AdvancedPowerUsageDetail.EXTRA_PACKAGE_NAME)).isEqualTo(null);
274ddba96670048a07b98e5c1e0d9f3d9bd4ebe9b38jackqdyulei    }
2755ab93ad700b06cde50d052cdb70af4dad78bebaeTony Mak
2765ab93ad700b06cde50d052cdb70af4dad78bebaeTony Mak    @Test
2775ab93ad700b06cde50d052cdb70af4dad78bebaeTony Mak    public void testStartBatteryDetailPage_WorkApp() {
2785ab93ad700b06cde50d052cdb70af4dad78bebaeTony Mak        final int appUid = 1010019;
2795ab93ad700b06cde50d052cdb70af4dad78bebaeTony Mak        mBatterySipper.mPackages = PACKAGE_NAME;
2805ab93ad700b06cde50d052cdb70af4dad78bebaeTony Mak        doReturn(appUid).when(mBatterySipper).getUid();
2815ab93ad700b06cde50d052cdb70af4dad78bebaeTony Mak        AdvancedPowerUsageDetail.startBatteryDetailPage(mTestActivity, null, mBatteryStatsHelper, 0,
2825ab93ad700b06cde50d052cdb70af4dad78bebaeTony Mak                mBatteryEntry, USAGE_PERCENT);
2835ab93ad700b06cde50d052cdb70af4dad78bebaeTony Mak
2845ab93ad700b06cde50d052cdb70af4dad78bebaeTony Mak        verify(mTestActivity).startPreferencePanelAsUser(
285046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam                nullable(Fragment.class), nullable(String.class), nullable(Bundle.class), anyInt(),
286046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam                nullable(CharSequence.class), eq(new UserHandle(10)));
2875ab93ad700b06cde50d052cdb70af4dad78bebaeTony Mak    }
2882a95a634660199d6f1bd003f5fb6aba82e105810jackqdyulei
2892a95a634660199d6f1bd003f5fb6aba82e105810jackqdyulei    @Test
2902a95a634660199d6f1bd003f5fb6aba82e105810jackqdyulei    public void testStartBatteryDetailPage_noBatteryUsage_hasBasicData() {
2912a95a634660199d6f1bd003f5fb6aba82e105810jackqdyulei        final ArgumentCaptor<Bundle> captor = ArgumentCaptor.forClass(Bundle.class);
292046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam        Answer<Void> callable = invocation -> {
293046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam            mBundle = captor.getValue();
294046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam            return null;
2952a95a634660199d6f1bd003f5fb6aba82e105810jackqdyulei        };
296046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam        doAnswer(callable).when(mTestActivity).startPreferencePanelAsUser(nullable(Fragment.class),
297046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam                nullable(String.class), captor.capture(), anyInt(), nullable(CharSequence.class),
298046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam                nullable(UserHandle.class));
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