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.documentsui; 18 19 import static junit.framework.Assert.assertEquals; 20 21 import androidx.annotation.Nullable; 22 import androidx.fragment.app.FragmentActivity; 23 24 import android.app.ActivityManager; 25 import android.app.LoaderManager; 26 import android.content.ComponentName; 27 import android.content.ContentResolver; 28 import android.content.Context; 29 import android.content.Intent; 30 import android.content.IntentSender; 31 import android.content.pm.PackageManager; 32 import android.content.res.Resources; 33 import android.net.Uri; 34 import android.test.mock.MockContentResolver; 35 import android.util.Pair; 36 37 import com.android.documentsui.AbstractActionHandler.CommonAddons; 38 import com.android.documentsui.base.DocumentInfo; 39 import com.android.documentsui.base.RootInfo; 40 import com.android.documentsui.testing.TestEnv; 41 import com.android.documentsui.testing.TestEventHandler; 42 import com.android.documentsui.testing.TestEventListener; 43 import com.android.documentsui.testing.TestLoaderManager; 44 import com.android.documentsui.testing.TestPackageManager; 45 import com.android.documentsui.testing.TestResources; 46 import com.android.documentsui.testing.TestSupportLoaderManager; 47 48 import org.mockito.Mockito; 49 50 /** 51 * Abstract to avoid having to implement unnecessary Activity stuff. 52 * Instances are created using {@link #create()}. 53 */ 54 public abstract class TestActivity extends AbstractBase { 55 56 public TestResources resources; 57 public TestPackageManager packageMgr; 58 public Intent intent; 59 public RootInfo currentRoot; 60 public MockContentResolver contentResolver; 61 public TestLoaderManager loaderManager; 62 public TestSupportLoaderManager supportLoaderManager; 63 public ActivityManager activityManager; 64 65 public TestEventListener<Intent> startActivity; 66 public TestEventListener<Intent> startService; 67 public TestEventListener<Pair<IntentSender, Integer>> startIntentSender; 68 public TestEventListener<RootInfo> rootPicked; 69 public TestEventListener<Void> restoreRootAndDirectory; 70 public TestEventListener<Integer> refreshCurrentRootAndDirectory; 71 public TestEventListener<Boolean> setRootsDrawerOpen; 72 public TestEventListener<Uri> notifyDirectoryNavigated; 73 public TestEventHandler<Void> finishedHandler; 74 create(TestEnv env)75 public static TestActivity create(TestEnv env) { 76 TestActivity activity = Mockito.mock(TestActivity.class, Mockito.CALLS_REAL_METHODS); 77 activity.init(env); 78 return activity; 79 } 80 init(TestEnv env)81 public void init(TestEnv env) { 82 resources = TestResources.create(); 83 packageMgr = TestPackageManager.create(); 84 intent = new Intent(); 85 86 startActivity = new TestEventListener<>(); 87 startService = new TestEventListener<>(); 88 startIntentSender = new TestEventListener<>(); 89 rootPicked = new TestEventListener<>(); 90 restoreRootAndDirectory = new TestEventListener<>(); 91 refreshCurrentRootAndDirectory = new TestEventListener<>(); 92 setRootsDrawerOpen = new TestEventListener<>(); 93 notifyDirectoryNavigated = new TestEventListener<>(); 94 contentResolver = env.contentResolver; 95 loaderManager = new TestLoaderManager(); 96 supportLoaderManager = new TestSupportLoaderManager(); 97 finishedHandler = new TestEventHandler<>(); 98 } 99 100 @Override getPackageName()101 public final String getPackageName() { 102 return "Banarama"; 103 } 104 105 @Override startActivity(Intent intent)106 public final void startActivity(Intent intent) { 107 startActivity.accept(intent); 108 } 109 assertActivityStarted(String expectedAction)110 public final void assertActivityStarted(String expectedAction) { 111 assertEquals(expectedAction, startActivity.getLastValue().getAction()); 112 } 113 114 @Override startService(Intent intent)115 public final ComponentName startService(Intent intent) { 116 startService.accept(intent); 117 return null; 118 } 119 assertServiceStarted(String expectedAction)120 public final void assertServiceStarted(String expectedAction) { 121 assertEquals(expectedAction, startService.getLastValue().getAction()); 122 } 123 124 @Override getIntent()125 public final Intent getIntent() { 126 return intent; 127 } 128 129 @Override getResources()130 public final Resources getResources() { 131 return resources; 132 } 133 134 @Override getPackageManager()135 public final PackageManager getPackageManager() { 136 return packageMgr; 137 } 138 139 @Override startIntentSenderForResult(IntentSender intent, int requestCode, @Nullable Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)140 public final void startIntentSenderForResult(IntentSender intent, int requestCode, 141 @Nullable Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags) 142 throws IntentSender.SendIntentException { 143 startIntentSender.accept(new Pair<>(intent, requestCode)); 144 } 145 146 @Override onRootPicked(RootInfo root)147 public final void onRootPicked(RootInfo root) { 148 rootPicked.accept(root); 149 } 150 151 @Override onDocumentPicked(DocumentInfo doc)152 public final void onDocumentPicked(DocumentInfo doc) { 153 throw new UnsupportedOperationException(); 154 } 155 156 @Override notifyDirectoryNavigated(Uri uri)157 public final void notifyDirectoryNavigated(Uri uri) { 158 notifyDirectoryNavigated.accept(uri); 159 } 160 161 @Override restoreRootAndDirectory()162 public final void restoreRootAndDirectory() { 163 restoreRootAndDirectory.accept(null); 164 } 165 166 @Override refreshCurrentRootAndDirectory(int anim)167 public final void refreshCurrentRootAndDirectory(int anim) { 168 refreshCurrentRootAndDirectory.accept(anim); 169 } 170 171 @Override getCurrentRoot()172 public final RootInfo getCurrentRoot() { 173 return currentRoot; 174 } 175 176 @Override setRootsDrawerOpen(boolean open)177 public final void setRootsDrawerOpen(boolean open) { 178 setRootsDrawerOpen.accept(open); 179 } 180 181 @Override getContentResolver()182 public final ContentResolver getContentResolver() { 183 return contentResolver; 184 } 185 186 @Override getApplicationContext()187 public final Context getApplicationContext() { 188 return this; 189 } 190 191 @Override isDestroyed()192 public boolean isDestroyed() { 193 return false; 194 } 195 196 @Override updateNavigator()197 public final void updateNavigator() {} 198 199 @Override getLoaderManager()200 public final LoaderManager getLoaderManager() { 201 return loaderManager; 202 } 203 204 @Override getSupportLoaderManager()205 public final androidx.loader.app.LoaderManager getSupportLoaderManager() { 206 return supportLoaderManager; 207 } 208 209 @Override getSystemService(String service)210 public final Object getSystemService(String service) { 211 switch (service) { 212 case Context.ACTIVITY_SERVICE: 213 return activityManager; 214 } 215 216 throw new IllegalArgumentException("Unknown service " + service); 217 } 218 219 @Override finish()220 public final void finish() { 221 finishedHandler.accept(null); 222 } 223 } 224 225 // Trick Mockito into finding our Addons methods correctly. W/o this 226 // hack, Mockito thinks Addons methods are not implemented. 227 abstract class AbstractBase extends FragmentActivity implements CommonAddons {} 228