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