blob: 2506bdf9602d36edceb4cfd3ce131c4eec2512c5 [file] [log] [blame]
Steve McKay988d8a32016-09-27 09:41:17 -07001/*
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
17package com.android.documentsui;
18
Steve McKayeed2f4e2016-10-03 20:30:52 -070019import static junit.framework.Assert.assertEquals;
20
Kelvin Kwana649f542020-02-20 20:36:23 +000021import static org.mockito.ArgumentMatchers.any;
22import static org.mockito.ArgumentMatchers.anyInt;
23import static org.mockito.ArgumentMatchers.anyString;
24import static org.mockito.Mockito.doReturn;
25
Garfield Tan2e81db62017-04-27 15:06:49 -070026import android.app.ActivityManager;
Garfield Tane9670332017-03-06 18:33:23 -080027import android.app.LoaderManager;
Steve McKay988d8a32016-09-27 09:41:17 -070028import android.content.ComponentName;
Garfield Tan16868832016-09-26 10:01:45 -070029import android.content.ContentResolver;
Ben Line9abd2d2016-12-06 11:39:52 -080030import android.content.Context;
Steve McKay988d8a32016-09-27 09:41:17 -070031import android.content.Intent;
Ben Lin80030082017-05-01 18:50:05 -070032import android.content.IntentSender;
Steve McKay09404b32016-09-30 13:18:36 -070033import android.content.pm.PackageManager;
Steve McKay988d8a32016-09-27 09:41:17 -070034import android.content.res.Resources;
Steve McKay0f5ec832016-10-04 14:21:56 -070035import android.net.Uri;
Kelvin Kwana34bbd92020-02-10 23:49:21 +000036import android.os.UserHandle;
Kelvin Kwana649f542020-02-20 20:36:23 +000037import android.os.UserManager;
Ben Line9abd2d2016-12-06 11:39:52 -080038import android.test.mock.MockContentResolver;
Ben Lin80030082017-05-01 18:50:05 -070039import android.util.Pair;
Steve McKay988d8a32016-09-27 09:41:17 -070040
Kelvin Kwana34bbd92020-02-10 23:49:21 +000041import androidx.annotation.Nullable;
42import androidx.fragment.app.FragmentActivity;
43
Steve McKay988d8a32016-09-27 09:41:17 -070044import com.android.documentsui.AbstractActionHandler.CommonAddons;
Steve McKayeed2f4e2016-10-03 20:30:52 -070045import com.android.documentsui.base.DocumentInfo;
Steve McKay988d8a32016-09-27 09:41:17 -070046import com.android.documentsui.base.RootInfo;
Garfield Tane9670332017-03-06 18:33:23 -080047import com.android.documentsui.testing.TestEnv;
Garfield Tan894d4872017-03-17 12:23:22 -070048import com.android.documentsui.testing.TestEventHandler;
Steve McKay988d8a32016-09-27 09:41:17 -070049import com.android.documentsui.testing.TestEventListener;
Garfield Tane9670332017-03-06 18:33:23 -080050import com.android.documentsui.testing.TestLoaderManager;
Steve McKaybd9f05a2016-10-10 10:18:36 -070051import com.android.documentsui.testing.TestPackageManager;
52import com.android.documentsui.testing.TestResources;
Tony Huang8d8d92f2018-09-13 14:41:16 +080053import com.android.documentsui.testing.TestSupportLoaderManager;
Steve McKay988d8a32016-09-27 09:41:17 -070054
55import org.mockito.Mockito;
56
57/**
58 * Abstract to avoid having to implement unnecessary Activity stuff.
59 * Instances are created using {@link #create()}.
60 */
61public abstract class TestActivity extends AbstractBase {
62
63 public TestResources resources;
Steve McKay09404b32016-09-30 13:18:36 -070064 public TestPackageManager packageMgr;
Steve McKay988d8a32016-09-27 09:41:17 -070065 public Intent intent;
Steve McKayeed2f4e2016-10-03 20:30:52 -070066 public RootInfo currentRoot;
Kelvin Kwana34bbd92020-02-10 23:49:21 +000067 public UserHandle currentUserHandle;
Ben Line9abd2d2016-12-06 11:39:52 -080068 public MockContentResolver contentResolver;
Garfield Tane9670332017-03-06 18:33:23 -080069 public TestLoaderManager loaderManager;
Tony Huang8d8d92f2018-09-13 14:41:16 +080070 public TestSupportLoaderManager supportLoaderManager;
Garfield Tan2e81db62017-04-27 15:06:49 -070071 public ActivityManager activityManager;
Kelvin Kwana649f542020-02-20 20:36:23 +000072 public UserManager userManager;
Steve McKay988d8a32016-09-27 09:41:17 -070073
74 public TestEventListener<Intent> startActivity;
Kelvin Kwana34bbd92020-02-10 23:49:21 +000075 public TestEventListener<Pair<Intent, UserHandle>> startActivityAsUser;
Steve McKay988d8a32016-09-27 09:41:17 -070076 public TestEventListener<Intent> startService;
Ben Lin80030082017-05-01 18:50:05 -070077 public TestEventListener<Pair<IntentSender, Integer>> startIntentSender;
Steve McKay988d8a32016-09-27 09:41:17 -070078 public TestEventListener<RootInfo> rootPicked;
Garfield Tan5f2a9ba2017-05-26 14:35:44 -070079 public TestEventListener<Void> restoreRootAndDirectory;
Steve McKaydef48682016-10-03 09:07:38 -070080 public TestEventListener<Integer> refreshCurrentRootAndDirectory;
Garfield Tan208945c2016-10-04 14:36:38 -070081 public TestEventListener<Boolean> setRootsDrawerOpen;
Zemiao Zhu7da7b0f2020-02-18 17:15:28 -080082 public TestEventListener<Boolean> setRootsDrawerLocked;
Garfield Tan63bf8132016-10-11 11:00:49 -070083 public TestEventListener<Uri> notifyDirectoryNavigated;
Garfield Tan894d4872017-03-17 12:23:22 -070084 public TestEventHandler<Void> finishedHandler;
Steve McKay988d8a32016-09-27 09:41:17 -070085
Garfield Tane9670332017-03-06 18:33:23 -080086 public static TestActivity create(TestEnv env) {
Steve McKay988d8a32016-09-27 09:41:17 -070087 TestActivity activity = Mockito.mock(TestActivity.class, Mockito.CALLS_REAL_METHODS);
Garfield Tane9670332017-03-06 18:33:23 -080088 activity.init(env);
Steve McKay988d8a32016-09-27 09:41:17 -070089 return activity;
90 }
91
Garfield Tan894d4872017-03-17 12:23:22 -070092 public void init(TestEnv env) {
93 resources = TestResources.create();
94 packageMgr = TestPackageManager.create();
95 intent = new Intent();
Kelvin Kwana34bbd92020-02-10 23:49:21 +000096 currentUserHandle = env.userHandle;
Steve McKay988d8a32016-09-27 09:41:17 -070097
Garfield Tan894d4872017-03-17 12:23:22 -070098 startActivity = new TestEventListener<>();
Kelvin Kwana34bbd92020-02-10 23:49:21 +000099 startActivityAsUser = new TestEventListener<>();
Garfield Tan894d4872017-03-17 12:23:22 -0700100 startService = new TestEventListener<>();
Ben Lin80030082017-05-01 18:50:05 -0700101 startIntentSender = new TestEventListener<>();
Garfield Tan894d4872017-03-17 12:23:22 -0700102 rootPicked = new TestEventListener<>();
Garfield Tan5f2a9ba2017-05-26 14:35:44 -0700103 restoreRootAndDirectory = new TestEventListener<>();
Garfield Tan894d4872017-03-17 12:23:22 -0700104 refreshCurrentRootAndDirectory = new TestEventListener<>();
105 setRootsDrawerOpen = new TestEventListener<>();
Zemiao Zhu7da7b0f2020-02-18 17:15:28 -0800106 setRootsDrawerLocked = new TestEventListener<>();
Garfield Tan894d4872017-03-17 12:23:22 -0700107 notifyDirectoryNavigated = new TestEventListener<>();
108 contentResolver = env.contentResolver;
109 loaderManager = new TestLoaderManager();
Tony Huang8d8d92f2018-09-13 14:41:16 +0800110 supportLoaderManager = new TestSupportLoaderManager();
Garfield Tan894d4872017-03-17 12:23:22 -0700111 finishedHandler = new TestEventHandler<>();
Kelvin Kwana649f542020-02-20 20:36:23 +0000112
113 // Setup some methods which cannot be overridden.
114 try {
115 doReturn(this).when(this).createPackageContextAsUser(anyString(), anyInt(),
116 any());
117 } catch (PackageManager.NameNotFoundException e) {
118 }
Garfield Tan894d4872017-03-17 12:23:22 -0700119 }
Steve McKay988d8a32016-09-27 09:41:17 -0700120
121 @Override
122 public final String getPackageName() {
123 return "Banarama";
124 }
125
126 @Override
127 public final void startActivity(Intent intent) {
128 startActivity.accept(intent);
129 }
130
Kelvin Kwana34bbd92020-02-10 23:49:21 +0000131 @Override
132 public final void startActivityAsUser(Intent intent, UserHandle userHandle) {
133 if (userHandle.equals(currentUserHandle)) {
134 startActivity(intent);
135 } else {
136 startActivityAsUser.accept(new Pair<>(intent, userHandle));
137 }
138 }
139
Steve McKayeed2f4e2016-10-03 20:30:52 -0700140 public final void assertActivityStarted(String expectedAction) {
141 assertEquals(expectedAction, startActivity.getLastValue().getAction());
142 }
143
Kelvin Kwana34bbd92020-02-10 23:49:21 +0000144 public final void assertActivityAsUserStarted(String expectedAction, UserHandle userHandle) {
145 Pair<Intent, UserHandle> intentUserHandle = startActivityAsUser.getLastValue();
146 assertEquals(expectedAction, intentUserHandle.first.getAction());
147 assertEquals(intentUserHandle.second, userHandle);
148 }
149
Steve McKay988d8a32016-09-27 09:41:17 -0700150 @Override
151 public final ComponentName startService(Intent intent) {
152 startService.accept(intent);
153 return null;
154 }
155
Steve McKayeed2f4e2016-10-03 20:30:52 -0700156 public final void assertServiceStarted(String expectedAction) {
157 assertEquals(expectedAction, startService.getLastValue().getAction());
158 }
159
Steve McKay988d8a32016-09-27 09:41:17 -0700160 @Override
161 public final Intent getIntent() {
162 return intent;
163 }
164
165 @Override
166 public final Resources getResources() {
167 return resources;
168 }
169
170 @Override
Steve McKayeed2f4e2016-10-03 20:30:52 -0700171 public final PackageManager getPackageManager() {
Steve McKay09404b32016-09-30 13:18:36 -0700172 return packageMgr;
173 }
174
175 @Override
Ben Lin80030082017-05-01 18:50:05 -0700176 public final void startIntentSenderForResult(IntentSender intent, int requestCode,
177 @Nullable Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)
178 throws IntentSender.SendIntentException {
179 startIntentSender.accept(new Pair<>(intent, requestCode));
180 }
181
182 @Override
Steve McKay988d8a32016-09-27 09:41:17 -0700183 public final void onRootPicked(RootInfo root) {
184 rootPicked.accept(root);
185 }
Steve McKaydef48682016-10-03 09:07:38 -0700186
187 @Override
Steve McKayeed2f4e2016-10-03 20:30:52 -0700188 public final void onDocumentPicked(DocumentInfo doc) {
189 throw new UnsupportedOperationException();
190 }
191
192 @Override
Garfield Tan63bf8132016-10-11 11:00:49 -0700193 public final void notifyDirectoryNavigated(Uri uri) {
194 notifyDirectoryNavigated.accept(uri);
Steve McKayeed2f4e2016-10-03 20:30:52 -0700195 }
196
197 @Override
Garfield Tan5f2a9ba2017-05-26 14:35:44 -0700198 public final void restoreRootAndDirectory() {
199 restoreRootAndDirectory.accept(null);
200 }
201
202 @Override
Steve McKaydef48682016-10-03 09:07:38 -0700203 public final void refreshCurrentRootAndDirectory(int anim) {
204 refreshCurrentRootAndDirectory.accept(anim);
205 }
Steve McKayeed2f4e2016-10-03 20:30:52 -0700206
207 @Override
208 public final RootInfo getCurrentRoot() {
209 return currentRoot;
210 }
Garfield Tan208945c2016-10-04 14:36:38 -0700211
212 @Override
213 public final void setRootsDrawerOpen(boolean open) {
214 setRootsDrawerOpen.accept(open);
215 }
Garfield Tan16868832016-09-26 10:01:45 -0700216
217 @Override
Zemiao Zhu7da7b0f2020-02-18 17:15:28 -0800218 public final void setRootsDrawerLocked(boolean locked) {
219 setRootsDrawerLocked.accept(locked);
220 }
221
222 @Override
Garfield Tan16868832016-09-26 10:01:45 -0700223 public final ContentResolver getContentResolver() {
Ben Line9abd2d2016-12-06 11:39:52 -0800224 return contentResolver;
225 }
226
227 @Override
228 public final Context getApplicationContext() {
229 return this;
230 }
231
232 @Override
233 public boolean isDestroyed() {
234 return false;
Garfield Tan16868832016-09-26 10:01:45 -0700235 }
236
237 @Override
238 public final void updateNavigator() {}
Garfield Tane9670332017-03-06 18:33:23 -0800239
240 @Override
241 public final LoaderManager getLoaderManager() {
242 return loaderManager;
243 }
Garfield Tan894d4872017-03-17 12:23:22 -0700244
245 @Override
Tony Huang8d8d92f2018-09-13 14:41:16 +0800246 public final androidx.loader.app.LoaderManager getSupportLoaderManager() {
247 return supportLoaderManager;
248 }
249
250 @Override
Garfield Tan2e81db62017-04-27 15:06:49 -0700251 public final Object getSystemService(String service) {
252 switch (service) {
253 case Context.ACTIVITY_SERVICE:
254 return activityManager;
Kelvin Kwana649f542020-02-20 20:36:23 +0000255 case Context.USER_SERVICE:
256 return userManager;
Garfield Tan2e81db62017-04-27 15:06:49 -0700257 }
258
259 throw new IllegalArgumentException("Unknown service " + service);
260 }
261
262 @Override
Garfield Tan894d4872017-03-17 12:23:22 -0700263 public final void finish() {
264 finishedHandler.accept(null);
265 }
Steve McKay988d8a32016-09-27 09:41:17 -0700266}
267
268// Trick Mockito into finding our Addons methods correctly. W/o this
269// hack, Mockito thinks Addons methods are not implemented.
Tony Huang8d8d92f2018-09-13 14:41:16 +0800270abstract class AbstractBase extends FragmentActivity implements CommonAddons {}