271 lines
8.6 KiB
Java
271 lines
8.6 KiB
Java
/*
|
|
* Copyright (C) 2016 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package com.android.documentsui;
|
|
|
|
import static junit.framework.Assert.assertEquals;
|
|
|
|
import static org.mockito.ArgumentMatchers.any;
|
|
import static org.mockito.ArgumentMatchers.anyInt;
|
|
import static org.mockito.ArgumentMatchers.anyString;
|
|
import static org.mockito.Mockito.doReturn;
|
|
|
|
import android.app.ActivityManager;
|
|
import android.app.LoaderManager;
|
|
import android.content.ComponentName;
|
|
import android.content.ContentResolver;
|
|
import android.content.Context;
|
|
import android.content.Intent;
|
|
import android.content.IntentSender;
|
|
import android.content.pm.PackageManager;
|
|
import android.content.res.Resources;
|
|
import android.net.Uri;
|
|
import android.os.UserHandle;
|
|
import android.os.UserManager;
|
|
import android.test.mock.MockContentResolver;
|
|
import android.util.Pair;
|
|
|
|
import androidx.annotation.Nullable;
|
|
import androidx.fragment.app.FragmentActivity;
|
|
|
|
import com.android.documentsui.AbstractActionHandler.CommonAddons;
|
|
import com.android.documentsui.base.DocumentInfo;
|
|
import com.android.documentsui.base.RootInfo;
|
|
import com.android.documentsui.testing.TestEnv;
|
|
import com.android.documentsui.testing.TestEventHandler;
|
|
import com.android.documentsui.testing.TestEventListener;
|
|
import com.android.documentsui.testing.TestLoaderManager;
|
|
import com.android.documentsui.testing.TestPackageManager;
|
|
import com.android.documentsui.testing.TestResources;
|
|
import com.android.documentsui.testing.TestSupportLoaderManager;
|
|
|
|
import org.mockito.Mockito;
|
|
|
|
/**
|
|
* Abstract to avoid having to implement unnecessary Activity stuff.
|
|
* Instances are created using {@link #create()}.
|
|
*/
|
|
public abstract class TestActivity extends AbstractBase {
|
|
|
|
public TestResources resources;
|
|
public TestPackageManager packageMgr;
|
|
public Intent intent;
|
|
public RootInfo currentRoot;
|
|
public UserHandle currentUserHandle;
|
|
public MockContentResolver contentResolver;
|
|
public TestLoaderManager loaderManager;
|
|
public TestSupportLoaderManager supportLoaderManager;
|
|
public ActivityManager activityManager;
|
|
public UserManager userManager;
|
|
|
|
public TestEventListener<Intent> startActivity;
|
|
public TestEventListener<Pair<Intent, UserHandle>> startActivityAsUser;
|
|
public TestEventListener<Intent> startService;
|
|
public TestEventListener<Pair<IntentSender, Integer>> startIntentSender;
|
|
public TestEventListener<RootInfo> rootPicked;
|
|
public TestEventListener<Void> restoreRootAndDirectory;
|
|
public TestEventListener<Integer> refreshCurrentRootAndDirectory;
|
|
public TestEventListener<Boolean> setRootsDrawerOpen;
|
|
public TestEventListener<Boolean> setRootsDrawerLocked;
|
|
public TestEventListener<Uri> notifyDirectoryNavigated;
|
|
public TestEventHandler<Void> finishedHandler;
|
|
|
|
public static TestActivity create(TestEnv env) {
|
|
TestActivity activity = Mockito.mock(TestActivity.class, Mockito.CALLS_REAL_METHODS);
|
|
activity.init(env);
|
|
return activity;
|
|
}
|
|
|
|
public void init(TestEnv env) {
|
|
resources = TestResources.create();
|
|
packageMgr = TestPackageManager.create();
|
|
intent = new Intent();
|
|
currentUserHandle = env.userHandle;
|
|
|
|
startActivity = new TestEventListener<>();
|
|
startActivityAsUser = new TestEventListener<>();
|
|
startService = new TestEventListener<>();
|
|
startIntentSender = new TestEventListener<>();
|
|
rootPicked = new TestEventListener<>();
|
|
restoreRootAndDirectory = new TestEventListener<>();
|
|
refreshCurrentRootAndDirectory = new TestEventListener<>();
|
|
setRootsDrawerOpen = new TestEventListener<>();
|
|
setRootsDrawerLocked = new TestEventListener<>();
|
|
notifyDirectoryNavigated = new TestEventListener<>();
|
|
contentResolver = env.contentResolver;
|
|
loaderManager = new TestLoaderManager();
|
|
supportLoaderManager = new TestSupportLoaderManager();
|
|
finishedHandler = new TestEventHandler<>();
|
|
|
|
// Setup some methods which cannot be overridden.
|
|
try {
|
|
doReturn(this).when(this).createPackageContextAsUser(anyString(), anyInt(),
|
|
any());
|
|
} catch (PackageManager.NameNotFoundException e) {
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public final String getPackageName() {
|
|
return "Banarama";
|
|
}
|
|
|
|
@Override
|
|
public final void startActivity(Intent intent) {
|
|
startActivity.accept(intent);
|
|
}
|
|
|
|
@Override
|
|
public final void startActivityAsUser(Intent intent, UserHandle userHandle) {
|
|
if (userHandle.equals(currentUserHandle)) {
|
|
startActivity(intent);
|
|
} else {
|
|
startActivityAsUser.accept(new Pair<>(intent, userHandle));
|
|
}
|
|
}
|
|
|
|
public final void assertActivityStarted(String expectedAction) {
|
|
assertEquals(expectedAction, startActivity.getLastValue().getAction());
|
|
}
|
|
|
|
public final void assertActivityAsUserStarted(String expectedAction, UserHandle userHandle) {
|
|
Pair<Intent, UserHandle> intentUserHandle = startActivityAsUser.getLastValue();
|
|
assertEquals(expectedAction, intentUserHandle.first.getAction());
|
|
assertEquals(intentUserHandle.second, userHandle);
|
|
}
|
|
|
|
@Override
|
|
public final ComponentName startService(Intent intent) {
|
|
startService.accept(intent);
|
|
return null;
|
|
}
|
|
|
|
public final void assertServiceStarted(String expectedAction) {
|
|
assertEquals(expectedAction, startService.getLastValue().getAction());
|
|
}
|
|
|
|
@Override
|
|
public final Intent getIntent() {
|
|
return intent;
|
|
}
|
|
|
|
@Override
|
|
public final Resources getResources() {
|
|
return resources;
|
|
}
|
|
|
|
@Override
|
|
public final PackageManager getPackageManager() {
|
|
return packageMgr;
|
|
}
|
|
|
|
@Override
|
|
public final void startIntentSenderForResult(IntentSender intent, int requestCode,
|
|
@Nullable Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)
|
|
throws IntentSender.SendIntentException {
|
|
startIntentSender.accept(new Pair<>(intent, requestCode));
|
|
}
|
|
|
|
@Override
|
|
public final void onRootPicked(RootInfo root) {
|
|
rootPicked.accept(root);
|
|
}
|
|
|
|
@Override
|
|
public final void onDocumentPicked(DocumentInfo doc) {
|
|
throw new UnsupportedOperationException();
|
|
}
|
|
|
|
@Override
|
|
public final void notifyDirectoryNavigated(Uri uri) {
|
|
notifyDirectoryNavigated.accept(uri);
|
|
}
|
|
|
|
@Override
|
|
public final void restoreRootAndDirectory() {
|
|
restoreRootAndDirectory.accept(null);
|
|
}
|
|
|
|
@Override
|
|
public final void refreshCurrentRootAndDirectory(int anim) {
|
|
refreshCurrentRootAndDirectory.accept(anim);
|
|
}
|
|
|
|
@Override
|
|
public final RootInfo getCurrentRoot() {
|
|
return currentRoot;
|
|
}
|
|
|
|
@Override
|
|
public final void setRootsDrawerOpen(boolean open) {
|
|
setRootsDrawerOpen.accept(open);
|
|
}
|
|
|
|
@Override
|
|
public final void setRootsDrawerLocked(boolean locked) {
|
|
setRootsDrawerLocked.accept(locked);
|
|
}
|
|
|
|
@Override
|
|
public final ContentResolver getContentResolver() {
|
|
return contentResolver;
|
|
}
|
|
|
|
@Override
|
|
public final Context getApplicationContext() {
|
|
return this;
|
|
}
|
|
|
|
@Override
|
|
public boolean isDestroyed() {
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public final void updateNavigator() {}
|
|
|
|
@Override
|
|
public final LoaderManager getLoaderManager() {
|
|
return loaderManager;
|
|
}
|
|
|
|
@Override
|
|
public final androidx.loader.app.LoaderManager getSupportLoaderManager() {
|
|
return supportLoaderManager;
|
|
}
|
|
|
|
@Override
|
|
public final Object getSystemService(String service) {
|
|
switch (service) {
|
|
case Context.ACTIVITY_SERVICE:
|
|
return activityManager;
|
|
case Context.USER_SERVICE:
|
|
return userManager;
|
|
}
|
|
|
|
throw new IllegalArgumentException("Unknown service " + service);
|
|
}
|
|
|
|
@Override
|
|
public final void finish() {
|
|
finishedHandler.accept(null);
|
|
}
|
|
}
|
|
|
|
// Trick Mockito into finding our Addons methods correctly. W/o this
|
|
// hack, Mockito thinks Addons methods are not implemented.
|
|
abstract class AbstractBase extends FragmentActivity implements CommonAddons {}
|