• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.settings.applications;
18 
19 import static com.google.common.truth.Truth.assertThat;
20 import static org.mockito.Matchers.any;
21 import static org.mockito.Mockito.mock;
22 import static org.mockito.Mockito.verify;
23 import static org.mockito.Mockito.when;
24 
25 import android.app.AlertDialog;
26 import android.content.BroadcastReceiver;
27 import android.content.Context;
28 import android.content.Intent;
29 import android.content.pm.ApplicationInfo;
30 import android.content.pm.PackageInfo;
31 import android.content.pm.PackageManager;
32 import android.net.Uri;
33 import android.os.UserHandle;
34 import android.support.v7.preference.PreferenceManager;
35 import android.support.v7.preference.PreferenceScreen;
36 
37 import com.android.internal.logging.nano.MetricsProto;
38 import com.android.settings.testutils.FakeFeatureFactory;
39 import com.android.settings.testutils.SettingsRobolectricTestRunner;
40 import com.android.settings.testutils.shadow.ShadowEntityHeaderController;
41 import com.android.settings.widget.EntityHeaderController;
42 import com.android.settingslib.applications.AppUtils;
43 import com.android.settingslib.applications.ApplicationsState;
44 import com.android.settingslib.applications.instantapps.InstantAppDataProvider;
45 
46 import org.junit.After;
47 import org.junit.Before;
48 import org.junit.Test;
49 import org.junit.runner.RunWith;
50 import org.mockito.Answers;
51 import org.mockito.Mock;
52 import org.mockito.MockitoAnnotations;
53 import org.robolectric.RuntimeEnvironment;
54 import org.robolectric.annotation.Config;
55 import org.robolectric.util.ReflectionHelpers;
56 
57 @RunWith(SettingsRobolectricTestRunner.class)
58 @Config(shadows = ShadowEntityHeaderController.class)
59 public class AppInfoWithHeaderTest {
60 
61     @Mock(answer = Answers.RETURNS_DEEP_STUBS)
62     private EntityHeaderController mHeaderController;
63 
64     private FakeFeatureFactory mFactory;
65     private TestFragment mAppInfoWithHeader;
66 
67     @Before
setUp()68     public void setUp() {
69         MockitoAnnotations.initMocks(this);
70         mFactory = FakeFeatureFactory.setupForTest();
71         when(mFactory.metricsFeatureProvider.getMetricsCategory(any(Object.class)))
72                 .thenReturn(MetricsProto.MetricsEvent.SETTINGS_APP_NOTIF_CATEGORY);
73         mAppInfoWithHeader = new TestFragment();
74         ShadowEntityHeaderController.setUseMock(mHeaderController);
75     }
76 
77     @After
tearDown()78     public void tearDown() {
79         ShadowEntityHeaderController.reset();
80     }
81 
82     @Test
testAppHeaderIsAdded()83     public void testAppHeaderIsAdded() {
84         mAppInfoWithHeader.onActivityCreated(null);
85 
86         verify(mAppInfoWithHeader.mScreen).addPreference(any(LayoutPreference.class));
87     }
88 
89     @Test
packageRemoved_noAppEntry_shouldFinishActivity()90     public void packageRemoved_noAppEntry_shouldFinishActivity() {
91         BroadcastReceiver packageRemovedReceiver =
92                 ReflectionHelpers.getField(mAppInfoWithHeader, "mPackageRemovedReceiver");
93         ReflectionHelpers.setField(mAppInfoWithHeader, "mAppEntry", null);
94 
95         final Intent packageRemovedBroadcast = new Intent();
96         packageRemovedBroadcast.setData(Uri.parse("package:com.android.settings"));
97         packageRemovedReceiver.onReceive(RuntimeEnvironment.application, packageRemovedBroadcast);
98 
99         assertThat(mAppInfoWithHeader.mPackageRemovedCalled).isTrue();
100     }
101 
102     @Test
packageRemoved_appEntryMatchesPackageName_shouldFinishActivity()103     public void packageRemoved_appEntryMatchesPackageName_shouldFinishActivity() {
104         BroadcastReceiver packageRemovedReceiver =
105                 ReflectionHelpers.getField(mAppInfoWithHeader, "mPackageRemovedReceiver");
106         final ApplicationsState.AppEntry entry = mock(ApplicationsState.AppEntry.class);
107         entry.info = new ApplicationInfo();
108         entry.info.packageName = "com.android.settings";
109         ReflectionHelpers.setField(mAppInfoWithHeader, "mAppEntry", entry);
110 
111         final Intent packageRemovedBroadcast = new Intent();
112         packageRemovedBroadcast.setData(Uri.parse("package:" + entry.info.packageName));
113         packageRemovedReceiver.onReceive(RuntimeEnvironment.application, packageRemovedBroadcast);
114 
115         assertThat(mAppInfoWithHeader.mPackageRemovedCalled).isTrue();
116     }
117 
118     @Test
noExtraUserHandleInIntent_retrieveAppEntryWithMyUserId()119     public void noExtraUserHandleInIntent_retrieveAppEntryWithMyUserId()
120             throws PackageManager.NameNotFoundException {
121         final String packageName = "com.android.settings";
122 
123         mAppInfoWithHeader.mIntent.setData(Uri.fromParts("package", packageName, null));
124         final ApplicationsState.AppEntry entry = mock(ApplicationsState.AppEntry.class);
125         entry.info = new ApplicationInfo();
126         entry.info.packageName = packageName;
127 
128         when(mAppInfoWithHeader.mState.getEntry(packageName,
129                 UserHandle.myUserId())).thenReturn(entry);
130         when(mAppInfoWithHeader.mPm.getPackageInfoAsUser(entry.info.packageName,
131                 PackageManager.MATCH_DISABLED_COMPONENTS |
132                         PackageManager.GET_SIGNING_CERTIFICATES |
133                         PackageManager.GET_PERMISSIONS, UserHandle.myUserId())).thenReturn(
134                 mAppInfoWithHeader.mPackageInfo);
135 
136         mAppInfoWithHeader.retrieveAppEntry();
137 
138         assertThat(mAppInfoWithHeader.mUserId).isEqualTo(UserHandle.myUserId());
139         assertThat(mAppInfoWithHeader.mPackageInfo).isNotNull();
140         assertThat(mAppInfoWithHeader.mAppEntry).isNotNull();
141     }
142 
143     @Test
extraUserHandleInIntent_retrieveAppEntryWithMyUserId()144     public void extraUserHandleInIntent_retrieveAppEntryWithMyUserId()
145             throws PackageManager.NameNotFoundException {
146         final int USER_ID = 1002;
147         final String packageName = "com.android.settings";
148 
149         mAppInfoWithHeader.mIntent.putExtra(Intent.EXTRA_USER_HANDLE, new UserHandle(USER_ID));
150         mAppInfoWithHeader.mIntent.setData(Uri.fromParts("package",
151                 packageName, null));
152         final ApplicationsState.AppEntry entry = mock(ApplicationsState.AppEntry.class);
153         entry.info = new ApplicationInfo();
154         entry.info.packageName = packageName;
155 
156         when(mAppInfoWithHeader.mState.getEntry(packageName, USER_ID)).thenReturn(entry);
157         when(mAppInfoWithHeader.mPm.getPackageInfoAsUser(entry.info.packageName,
158                 PackageManager.MATCH_DISABLED_COMPONENTS |
159                         PackageManager.GET_SIGNING_CERTIFICATES |
160                         PackageManager.GET_PERMISSIONS, USER_ID)).thenReturn(
161                 mAppInfoWithHeader.mPackageInfo);
162 
163         mAppInfoWithHeader.retrieveAppEntry();
164 
165         assertThat(mAppInfoWithHeader.mUserId).isEqualTo(USER_ID);
166         assertThat(mAppInfoWithHeader.mPackageInfo).isNotNull();
167         assertThat(mAppInfoWithHeader.mAppEntry).isNotNull();
168     }
169 
170     public static class TestFragment extends AppInfoWithHeader {
171 
172         PreferenceManager mManager;
173         PreferenceScreen mScreen;
174         Context mShadowContext;
175         boolean mPackageRemovedCalled;
176         Intent mIntent;
177 
TestFragment()178         public TestFragment() {
179             mPm = mock(PackageManager.class);
180             mManager = mock(PreferenceManager.class);
181             mScreen = mock(PreferenceScreen.class);
182             mPackageInfo = new PackageInfo();
183             mPackageInfo.applicationInfo = new ApplicationInfo();
184             mState = mock(ApplicationsState.class);
185             mIntent = new Intent();
186             mShadowContext = RuntimeEnvironment.application;
187             ReflectionHelpers.setStaticField(AppUtils.class, "sInstantAppDataProvider",
188                     (InstantAppDataProvider) (info -> false));
189             when(mManager.getContext()).thenReturn(mShadowContext);
190         }
191 
192         @Override
getMetricsCategory()193         public int getMetricsCategory() {
194             return 0;
195         }
196 
197         @Override
refreshUi()198         protected boolean refreshUi() {
199             return false;
200         }
201 
202         @Override
createDialog(int id, int errorCode)203         protected AlertDialog createDialog(int id, int errorCode) {
204             return null;
205         }
206 
207         @Override
getPreferenceScreen()208         public PreferenceScreen getPreferenceScreen() {
209             return mScreen;
210         }
211 
212         @Override
getPreferenceManager()213         public PreferenceManager getPreferenceManager() {
214             return mManager;
215         }
216 
217         @Override
getContext()218         public Context getContext() {
219             return mShadowContext;
220         }
221 
222         @Override
onPackageRemoved()223         protected void onPackageRemoved() {
224             mPackageRemovedCalled = true;
225         }
226 
227         @Override
getIntent()228         protected Intent getIntent() { return mIntent; }
229     }
230 }
231