summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Kelvin Kwan <kelvinkwan@google.com> 2020-02-10 23:49:21 +0000
committer Kelvin Kwan <kelvinkwan@google.com> 2020-02-14 21:44:07 +0000
commita34bbd9167774e796c1e3b717e1d78ae7a5cc1bb (patch)
treea3d080159c62ba05d6751d73e52d545c8d54de5f
parent28fb87ee2f4b71e3bab308d37d9975630f60263b (diff)
startActivity with proper user and uri according to the attached userId
Now we should able to preview document across user and return correct uri to ACTION_GET_CONTENT Bug: 148264890 Test: manual Test: atest DocumentsUIGoogleTests Change-Id: I231e996244cce455a3be7a9b7569bba286da005d
-rw-r--r--src/com/android/documentsui/AbstractActionHandler.java8
-rw-r--r--src/com/android/documentsui/ActionHandler.java3
-rw-r--r--src/com/android/documentsui/UserIdManager.java5
-rw-r--r--src/com/android/documentsui/base/DocumentInfo.java12
-rw-r--r--src/com/android/documentsui/base/UserId.java16
-rw-r--r--src/com/android/documentsui/files/ActionHandler.java10
-rw-r--r--src/com/android/documentsui/files/QuickViewIntentBuilder.java10
-rw-r--r--src/com/android/documentsui/inspector/InspectorController.java2
-rw-r--r--src/com/android/documentsui/inspector/actions/ShowInProviderAction.java3
-rw-r--r--src/com/android/documentsui/picker/ActionHandler.java5
-rw-r--r--src/com/android/documentsui/picker/PickActivity.java4
-rw-r--r--src/com/android/documentsui/sidebar/AppItem.java2
-rw-r--r--src/com/android/documentsui/sidebar/RootAndAppItem.java2
-rw-r--r--tests/common/com/android/documentsui/TestActivity.java26
-rw-r--r--tests/common/com/android/documentsui/testing/TestEnv.java20
-rw-r--r--tests/common/com/android/documentsui/testing/TestProvidersAccess.java10
-rw-r--r--tests/unit/com/android/documentsui/inspector/InspectorControllerTest.java14
-rw-r--r--tests/unit/com/android/documentsui/picker/ActionHandlerTest.java11
18 files changed, 126 insertions, 37 deletions
diff --git a/src/com/android/documentsui/AbstractActionHandler.java b/src/com/android/documentsui/AbstractActionHandler.java
index bee4aac5a..b18fabbaf 100644
--- a/src/com/android/documentsui/AbstractActionHandler.java
+++ b/src/com/android/documentsui/AbstractActionHandler.java
@@ -264,7 +264,7 @@ public abstract class AbstractActionHandler<T extends FragmentActivity & CommonA
}
@Override
- public void showAppDetails(ResolveInfo info) {
+ public void showAppDetails(ResolveInfo info, UserId userId) {
throw new UnsupportedOperationException("Can't show app details.");
}
@@ -455,7 +455,7 @@ public abstract class AbstractActionHandler<T extends FragmentActivity & CommonA
}
try {
- mActivity.startActivity(intent);
+ doc.userId.startActivityAsUser(mActivity, intent);
return true;
} catch (ActivityNotFoundException e) {
mDialogs.showNoApplicationFound();
@@ -479,7 +479,7 @@ public abstract class AbstractActionHandler<T extends FragmentActivity & CommonA
if (intent != null) {
// TODO: un-work around issue b/24963914. Should be fixed soon.
try {
- mActivity.startActivity(intent);
+ doc.userId.startActivityAsUser(mActivity, intent);
return true;
} catch (SecurityException e) {
// Carry on to regular view mode.
@@ -498,7 +498,7 @@ public abstract class AbstractActionHandler<T extends FragmentActivity & CommonA
Intent manage = new Intent(DocumentsContract.ACTION_MANAGE_DOCUMENT);
manage.setData(doc.derivedUri);
try {
- mActivity.startActivity(manage);
+ doc.userId.startActivityAsUser(mActivity, manage);
return true;
} catch (ActivityNotFoundException ex) {
// Fall back to regular handling.
diff --git a/src/com/android/documentsui/ActionHandler.java b/src/com/android/documentsui/ActionHandler.java
index a428df898..f3bd1fed9 100644
--- a/src/com/android/documentsui/ActionHandler.java
+++ b/src/com/android/documentsui/ActionHandler.java
@@ -30,6 +30,7 @@ import com.android.documentsui.base.BooleanConsumer;
import com.android.documentsui.base.DocumentInfo;
import com.android.documentsui.base.DocumentStack;
import com.android.documentsui.base.RootInfo;
+import com.android.documentsui.base.UserId;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -88,7 +89,7 @@ public interface ActionHandler {
*/
void startAuthentication(PendingIntent intent);
- void showAppDetails(ResolveInfo info);
+ void showAppDetails(ResolveInfo info, UserId userId);
void openRoot(RootInfo root);
diff --git a/src/com/android/documentsui/UserIdManager.java b/src/com/android/documentsui/UserIdManager.java
index 03fb73309..e73eda9df 100644
--- a/src/com/android/documentsui/UserIdManager.java
+++ b/src/com/android/documentsui/UserIdManager.java
@@ -32,6 +32,7 @@ import android.os.UserManager;
import android.util.Log;
import androidx.annotation.GuardedBy;
+import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.core.os.BuildCompat;
@@ -55,12 +56,14 @@ public interface UserIdManager {
* Returns the system user from {@link #getUserIds()} if the list at least 2 users. Otherwise,
* returns null.
*/
+ @Nullable
UserId getSystemUser();
/**
* Returns the managed user from {@link #getUserIds()} if the list at least 2 users. Otherwise,
* returns null.
*/
+ @Nullable
UserId getManagedUser();
/**
@@ -148,7 +151,7 @@ public interface UserIdManager {
return mManagedUser;
}
- public List<UserId> getUserIdsInternal() {
+ private List<UserId> getUserIdsInternal() {
final List<UserId> result = new ArrayList<>();
result.add(mCurrentUser);
diff --git a/src/com/android/documentsui/base/DocumentInfo.java b/src/com/android/documentsui/base/DocumentInfo.java
index db11933d8..e1d9234f3 100644
--- a/src/com/android/documentsui/base/DocumentInfo.java
+++ b/src/com/android/documentsui/base/DocumentInfo.java
@@ -325,6 +325,18 @@ public class DocumentInfo implements Durable, Parcelable {
return (flags & Document.FLAG_DIR_PREFERS_LAST_MODIFIED) != 0;
}
+ /**
+ * Returns a document uri representing this {@link DocumentInfo}. The URI contains user
+ * information. Use this when uri is needed externally. For usage within DocsUI, use
+ * {@link #derivedUri}.
+ */
+ public Uri getDocumentUri() {
+ if (UserId.CURRENT_USER.equals(userId)) {
+ return derivedUri;
+ }
+ return userId.buildDocumentUriAsUser(authority, documentId);
+ }
+
@Override
public int hashCode() {
return userId.hashCode() + derivedUri.hashCode() + mimeType.hashCode();
diff --git a/src/com/android/documentsui/base/UserId.java b/src/com/android/documentsui/base/UserId.java
index 89a38d26c..1b6b3182f 100644
--- a/src/com/android/documentsui/base/UserId.java
+++ b/src/com/android/documentsui/base/UserId.java
@@ -20,11 +20,13 @@ import static androidx.core.util.Preconditions.checkNotNull;
import android.content.ContentResolver;
import android.content.Context;
+import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Process;
import android.os.UserHandle;
import android.os.UserManager;
+import android.provider.DocumentsContract;
import androidx.annotation.VisibleForTesting;
import androidx.loader.content.CursorLoader;
@@ -119,6 +121,20 @@ public final class UserId {
}
/**
+ * Returns a document uri representing this user.
+ */
+ public Uri buildDocumentUriAsUser(String authority, String documentId) {
+ return DocumentsContract.buildDocumentUriAsUser(authority, documentId, mUserHandle);
+ }
+
+ /**
+ * Starts activity for this user
+ */
+ public void startActivityAsUser(Context context, Intent intent) {
+ context.startActivityAsUser(intent, mUserHandle);
+ }
+
+ /**
* Returns an identifier stored in this user id. This can be used to recreate the {@link UserId}
* by {@link UserId#of(int)}.
*/
diff --git a/src/com/android/documentsui/files/ActionHandler.java b/src/com/android/documentsui/files/ActionHandler.java
index 1a504ce8a..7b17246e2 100644
--- a/src/com/android/documentsui/files/ActionHandler.java
+++ b/src/com/android/documentsui/files/ActionHandler.java
@@ -154,7 +154,7 @@ public class ActionHandler<T extends FragmentActivity & AbstractActionHandler.Co
Metrics.logUserAction(MetricConsts.USER_ACTION_SETTINGS);
final Intent intent = new Intent(DocumentsContract.ACTION_DOCUMENT_ROOT_SETTINGS);
intent.setDataAndType(root.getUri(), DocumentsContract.Root.MIME_TYPE_ITEM);
- mActivity.startActivity(intent);
+ root.userId.startActivityAsUser(mActivity, intent);
}
@Override
@@ -289,7 +289,7 @@ public class ActionHandler<T extends FragmentActivity & AbstractActionHandler.Co
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.setData(doc.derivedUri);
try {
- mActivity.startActivity(intent);
+ doc.userId.startActivityAsUser(mActivity, intent);
} catch (ActivityNotFoundException e) {
Log.e(TAG, "Failed to view settings in application for " + doc.derivedUri, e);
mDialogs.showNoApplicationFound();
@@ -369,7 +369,7 @@ public class ActionHandler<T extends FragmentActivity & AbstractActionHandler.Co
intent = new Intent(Intent.ACTION_SEND);
DocumentInfo doc = docs.get(0);
intent.setType(doc.mimeType);
- intent.putExtra(Intent.EXTRA_STREAM, doc.derivedUri);
+ intent.putExtra(Intent.EXTRA_STREAM, doc.getDocumentUri());
} else if (docs.size() > 1) {
intent = new Intent(Intent.ACTION_SEND_MULTIPLE);
@@ -378,7 +378,7 @@ public class ActionHandler<T extends FragmentActivity & AbstractActionHandler.Co
final ArrayList<Uri> uris = new ArrayList<>();
for (DocumentInfo doc : docs) {
mimeTypes.add(doc.mimeType);
- uris.add(doc.derivedUri);
+ uris.add(doc.getDocumentUri());
}
intent.setType(MimeTypes.findCommonMimeType(mimeTypes));
@@ -546,7 +546,7 @@ public class ActionHandler<T extends FragmentActivity & AbstractActionHandler.Co
Intent intent = Intent.createChooser(buildViewIntent(doc), null);
intent.putExtra(Intent.EXTRA_AUTO_LAUNCH_SINGLE_CHOICE, false);
try {
- mActivity.startActivity(intent);
+ doc.userId.startActivityAsUser(mActivity, intent);
} catch (ActivityNotFoundException e) {
mDialogs.showNoApplicationFound();
}
diff --git a/src/com/android/documentsui/files/QuickViewIntentBuilder.java b/src/com/android/documentsui/files/QuickViewIntentBuilder.java
index 236a36c97..f399a2864 100644
--- a/src/com/android/documentsui/files/QuickViewIntentBuilder.java
+++ b/src/com/android/documentsui/files/QuickViewIntentBuilder.java
@@ -17,8 +17,8 @@
package com.android.documentsui.files;
import static com.android.documentsui.base.DocumentInfo.getCursorString;
-import static com.android.documentsui.base.SharedMinimal.DEBUG;
import static com.android.documentsui.base.Shared.MAX_DOCS_IN_INTENT;
+import static com.android.documentsui.base.SharedMinimal.DEBUG;
import android.content.ClipData;
import android.content.ClipDescription;
@@ -28,18 +28,18 @@ import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.database.Cursor;
import android.net.Uri;
-import android.os.Build;
import android.provider.DocumentsContract;
import android.provider.DocumentsContract.Document;
-import androidx.annotation.Nullable;
import android.text.TextUtils;
import android.util.Log;
import android.util.Range;
+import androidx.annotation.Nullable;
+
+import com.android.documentsui.Model;
import com.android.documentsui.R;
import com.android.documentsui.base.DebugFlags;
import com.android.documentsui.base.DocumentInfo;
-import com.android.documentsui.Model;
import com.android.documentsui.roots.RootCursorWrapper;
import java.util.ArrayList;
@@ -111,7 +111,7 @@ public final class QuickViewIntentBuilder {
if (!TextUtils.isEmpty(trustedPkg)) {
Intent intent = new Intent(Intent.ACTION_QUICK_VIEW);
- intent.setDataAndType(mDocument.derivedUri, mDocument.mimeType);
+ intent.setDataAndType(mDocument.getDocumentUri(), mDocument.mimeType);
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
intent.setPackage(trustedPkg);
diff --git a/src/com/android/documentsui/inspector/InspectorController.java b/src/com/android/documentsui/inspector/InspectorController.java
index 4a886066e..68c465dfe 100644
--- a/src/com/android/documentsui/inspector/InspectorController.java
+++ b/src/com/android/documentsui/inspector/InspectorController.java
@@ -269,7 +269,7 @@ public final class InspectorController {
intent.setPackage(mProviders.getPackageName(userId, uri.getAuthority()));
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.setData(uri);
- mContext.startActivity(intent);
+ userId.startActivityAsUser(mContext, intent);
}
/**
diff --git a/src/com/android/documentsui/inspector/actions/ShowInProviderAction.java b/src/com/android/documentsui/inspector/actions/ShowInProviderAction.java
index 441b7d4a7..447cc1885 100644
--- a/src/com/android/documentsui/inspector/actions/ShowInProviderAction.java
+++ b/src/com/android/documentsui/inspector/actions/ShowInProviderAction.java
@@ -24,7 +24,6 @@ import androidx.annotation.StringRes;
import com.android.documentsui.R;
import com.android.documentsui.base.DocumentInfo;
-import com.android.documentsui.base.UserId;
import com.android.documentsui.roots.ProvidersAccess;
/**
@@ -68,7 +67,7 @@ public final class ShowInProviderAction extends Action {
@Override
public String getPackageName() {
- return mProviders.getPackageName(UserId.DEFAULT_USER, mDoc.derivedUri.getAuthority());
+ return mProviders.getPackageName(mDoc.userId, mDoc.derivedUri.getAuthority());
}
public @StringRes int getButtonLabel() {
diff --git a/src/com/android/documentsui/picker/ActionHandler.java b/src/com/android/documentsui/picker/ActionHandler.java
index 554d182dc..fcc6e8945 100644
--- a/src/com/android/documentsui/picker/ActionHandler.java
+++ b/src/com/android/documentsui/picker/ActionHandler.java
@@ -54,6 +54,7 @@ import com.android.documentsui.base.Lookup;
import com.android.documentsui.base.RootInfo;
import com.android.documentsui.base.Shared;
import com.android.documentsui.base.State;
+import com.android.documentsui.base.UserId;
import com.android.documentsui.dirlist.AnimationView;
import com.android.documentsui.picker.ActionHandler.Addons;
import com.android.documentsui.queries.SearchViewManager;
@@ -232,12 +233,12 @@ class ActionHandler<T extends FragmentActivity & Addons> extends AbstractActionH
}
@Override
- public void showAppDetails(ResolveInfo info) {
+ public void showAppDetails(ResolveInfo info, UserId userId) {
mInjector.pickResult.increaseActionCount();
final Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.fromParts("package", info.activityInfo.packageName, null));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT);
- mActivity.startActivity(intent);
+ userId.startActivityAsUser(mActivity, intent);
}
@Override
diff --git a/src/com/android/documentsui/picker/PickActivity.java b/src/com/android/documentsui/picker/PickActivity.java
index f7f2ebe80..3666716a9 100644
--- a/src/com/android/documentsui/picker/PickActivity.java
+++ b/src/com/android/documentsui/picker/PickActivity.java
@@ -361,7 +361,7 @@ public class PickActivity extends BaseActivity implements ActionHandler.Addons {
mSearchManager.recordHistory();
} else if (mState.action == ACTION_OPEN || mState.action == ACTION_GET_CONTENT) {
// Explicit file picked, return
- mInjector.actions.finishPicking(doc.derivedUri);
+ mInjector.actions.finishPicking(doc.getDocumentUri());
mSearchManager.recordHistory();
} else if (mState.action == ACTION_CREATE) {
// Replace selected file
@@ -375,7 +375,7 @@ public class PickActivity extends BaseActivity implements ActionHandler.Addons {
final int size = docs.size();
final Uri[] uris = new Uri[size];
for (int i = 0; i < size; i++) {
- uris[i] = docs.get(i).derivedUri;
+ uris[i] = docs.get(i).getDocumentUri();
}
mInjector.actions.finishPicking(uris);
mSearchManager.recordHistory();
diff --git a/src/com/android/documentsui/sidebar/AppItem.java b/src/com/android/documentsui/sidebar/AppItem.java
index 0487aa02e..06fffaab1 100644
--- a/src/com/android/documentsui/sidebar/AppItem.java
+++ b/src/com/android/documentsui/sidebar/AppItem.java
@@ -71,7 +71,7 @@ public class AppItem extends Item {
@Override
boolean showAppDetails() {
- mActionHandler.showAppDetails(info);
+ mActionHandler.showAppDetails(info, userId);
return true;
}
diff --git a/src/com/android/documentsui/sidebar/RootAndAppItem.java b/src/com/android/documentsui/sidebar/RootAndAppItem.java
index c797febbb..6630d8bbd 100644
--- a/src/com/android/documentsui/sidebar/RootAndAppItem.java
+++ b/src/com/android/documentsui/sidebar/RootAndAppItem.java
@@ -41,7 +41,7 @@ class RootAndAppItem extends RootItem {
@Override
boolean showAppDetails() {
- mActionHandler.showAppDetails(resolveInfo);
+ mActionHandler.showAppDetails(resolveInfo, userId);
return true;
}
diff --git a/tests/common/com/android/documentsui/TestActivity.java b/tests/common/com/android/documentsui/TestActivity.java
index 103fb404b..53f0792df 100644
--- a/tests/common/com/android/documentsui/TestActivity.java
+++ b/tests/common/com/android/documentsui/TestActivity.java
@@ -18,9 +18,6 @@ package com.android.documentsui;
import static junit.framework.Assert.assertEquals;
-import androidx.annotation.Nullable;
-import androidx.fragment.app.FragmentActivity;
-
import android.app.ActivityManager;
import android.app.LoaderManager;
import android.content.ComponentName;
@@ -31,9 +28,13 @@ import android.content.IntentSender;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.net.Uri;
+import android.os.UserHandle;
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;
@@ -57,12 +58,14 @@ public abstract class TestActivity extends AbstractBase {
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 TestEventListener<Intent> startActivity;
+ public TestEventListener<Pair<Intent, UserHandle>> startActivityAsUser;
public TestEventListener<Intent> startService;
public TestEventListener<Pair<IntentSender, Integer>> startIntentSender;
public TestEventListener<RootInfo> rootPicked;
@@ -82,8 +85,10 @@ public abstract class TestActivity extends AbstractBase {
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<>();
@@ -107,10 +112,25 @@ public abstract class TestActivity extends AbstractBase {
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);
diff --git a/tests/common/com/android/documentsui/testing/TestEnv.java b/tests/common/com/android/documentsui/testing/TestEnv.java
index a75c0034c..b78d7316b 100644
--- a/tests/common/com/android/documentsui/testing/TestEnv.java
+++ b/tests/common/com/android/documentsui/testing/TestEnv.java
@@ -16,6 +16,7 @@
package com.android.documentsui.testing;
import android.content.Context;
+import android.os.UserHandle;
import android.provider.DocumentsContract.Document;
import android.test.mock.MockContentResolver;
@@ -60,6 +61,10 @@ public class TestEnv {
public static DocumentInfo FILE_VIRTUAL;
public static DocumentInfo FILE_READ_ONLY;
+ public static class OtherUser {
+ public static DocumentInfo FILE_PNG;
+ }
+
public final TestScheduledExecutorService mExecutor;
public final State state = new State();
public final TestProvidersAccess providers = new TestProvidersAccess();
@@ -72,16 +77,20 @@ public class TestEnv {
public final TestSearchViewManager searchViewManager;
public final Injector<?> injector;
public final Features features;
+ public final UserId userId;
+ public final UserHandle userHandle;
public final MockContentResolver contentResolver;
public final Map<String, TestDocumentsProvider> mockProviders;
- private TestEnv(Context context, Features features, String authority) {
+ private TestEnv(Context context, Features features, String authority, UserId userId) {
this.features = features;
+ this.userId = userId;
+ userHandle = UserHandle.of(userId.getIdentifier());
state.sortModel = SortModel.createModel();
mExecutor = new TestScheduledExecutorService();
- model = new TestModel(UserId.DEFAULT_USER, authority, features);
- archiveModel = new TestModel(UserId.DEFAULT_USER, ArchivesProvider.AUTHORITY, features);
+ model = new TestModel(userId, authority, features);
+ archiveModel = new TestModel(userId, ArchivesProvider.AUTHORITY, features);
selectionMgr = SelectionHelpers.createTestInstance();
searchViewManager = new TestSearchViewManager();
injector = new Injector(
@@ -134,7 +143,7 @@ public class TestEnv {
}
private static TestEnv create(Context context, Features features, String authority) {
- TestEnv env = new TestEnv(context, features, authority);
+ TestEnv env = new TestEnv(context, features, authority, TestProvidersAccess.USER_ID);
env.reset();
return env;
}
@@ -170,6 +179,9 @@ public class TestEnv {
| Document.FLAG_SUPPORTS_DELETE
| Document.FLAG_SUPPORTS_RENAME);
+ OtherUser.FILE_PNG = model.createFile("work.png");
+ OtherUser.FILE_PNG.userId = TestProvidersAccess.OtherUser.USER_ID;
+
archiveModel.update();
model.update();
}
diff --git a/tests/common/com/android/documentsui/testing/TestProvidersAccess.java b/tests/common/com/android/documentsui/testing/TestProvidersAccess.java
index 2ebbae0e5..6d7a1aca3 100644
--- a/tests/common/com/android/documentsui/testing/TestProvidersAccess.java
+++ b/tests/common/com/android/documentsui/testing/TestProvidersAccess.java
@@ -15,6 +15,7 @@
*/
package com.android.documentsui.testing;
+import android.os.UserHandle;
import android.provider.DocumentsContract.Root;
import com.android.documentsui.InspectorProvider;
@@ -34,6 +35,8 @@ import javax.annotation.Nullable;
public class TestProvidersAccess implements ProvidersAccess {
+ public static final UserId USER_ID = UserId.DEFAULT_USER;
+
public static final RootInfo DOWNLOADS;
public static final RootInfo HOME;
public static final RootInfo HAMMY;
@@ -48,8 +51,7 @@ public class TestProvidersAccess implements ProvidersAccess {
public static final RootInfo NO_TREE_ROOT;
static {
- UserId userId = UserId.DEFAULT_USER;
-
+ UserId userId = USER_ID;
DOWNLOADS = new RootInfo() {{
flags = Root.FLAG_SUPPORTS_CREATE;
}};
@@ -154,7 +156,9 @@ public class TestProvidersAccess implements ProvidersAccess {
}
public static class OtherUser {
- public static final UserId USER_ID = UserId.of(UserId.DEFAULT_USER.getIdentifier() + 1);
+ public static final UserHandle USER_HANDLE = UserHandle.of(
+ TestProvidersAccess.USER_ID.getIdentifier() + 1);
+ public static final UserId USER_ID = UserId.of(OtherUser.USER_HANDLE);
public static final RootInfo DOWNLOADS;
diff --git a/tests/unit/com/android/documentsui/inspector/InspectorControllerTest.java b/tests/unit/com/android/documentsui/inspector/InspectorControllerTest.java
index d35a6dedd..52d3c9061 100644
--- a/tests/unit/com/android/documentsui/inspector/InspectorControllerTest.java
+++ b/tests/unit/com/android/documentsui/inspector/InspectorControllerTest.java
@@ -26,6 +26,7 @@ import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.os.Looper;
+import android.os.UserHandle;
import android.provider.DocumentsContract;
import android.provider.DocumentsContract.Document;
import android.test.suitebuilder.annotation.SmallTest;
@@ -84,8 +85,8 @@ public class InspectorControllerTest {
@Before
public void setUp() throws Exception {
- mUserId = UserId.DEFAULT_USER;
mEnv = TestEnv.create();
+ mUserId = mEnv.userId;
mPm = TestPackageManager.create();
mLoaderManager = new TestLoaderManager();
mDataSupplier = new TestDataSupplier();
@@ -285,7 +286,7 @@ public class InspectorControllerTest {
assertTrue(strUri.contains(TestEnv.FILE_JPG.displayName));
}
- private static class TestActivity extends Activity {
+ private class TestActivity extends Activity {
private @Nullable Intent started;
@@ -293,6 +294,15 @@ public class InspectorControllerTest {
public void startActivity(Intent intent) {
started = intent;
}
+
+ @Override
+ public void startActivityAsUser(Intent intent, UserHandle user) {
+ if (user.equals(mEnv.userHandle)) {
+ startActivity(intent);
+ return;
+ }
+ throw new UnsupportedOperationException("not implemented");
+ }
}
private static class TestAction implements ActionDisplay {
diff --git a/tests/unit/com/android/documentsui/picker/ActionHandlerTest.java b/tests/unit/com/android/documentsui/picker/ActionHandlerTest.java
index abcc6333b..57d4df7f5 100644
--- a/tests/unit/com/android/documentsui/picker/ActionHandlerTest.java
+++ b/tests/unit/com/android/documentsui/picker/ActionHandlerTest.java
@@ -580,6 +580,17 @@ public class ActionHandlerTest {
}
@Test
+ public void testPreviewItem_onOtherUser() throws Exception {
+ mActivity.resources.setQuickViewerPackage("corptropolis.viewer");
+ mActivity.currentRoot = TestProvidersAccess.OtherUser.DOWNLOADS;
+
+ mHandler.onDocumentOpened(TestEnv.OtherUser.FILE_PNG, ActionHandler.VIEW_TYPE_PREVIEW,
+ ActionHandler.VIEW_TYPE_REGULAR, true);
+ mActivity.assertActivityAsUserStarted(Intent.ACTION_QUICK_VIEW,
+ TestProvidersAccess.OtherUser.USER_HANDLE);
+ }
+
+ @Test
public void testPreviewItem_archives() throws Exception {
mActivity.resources.setQuickViewerPackage("corptropolis.viewer");
mActivity.currentRoot = TestProvidersAccess.HOME;