diff options
-rw-r--r-- | AndroidManifest.xml | 8 | ||||
-rw-r--r-- | src/com/android/documentsui/AbstractActionHandler.java | 2 | ||||
-rw-r--r-- | src/com/android/documentsui/ForResultForwarderActivity.java | 69 | ||||
-rw-r--r-- | src/com/android/documentsui/picker/ActionHandler.java | 58 | ||||
-rw-r--r-- | tests/AndroidManifest.xml | 7 | ||||
-rw-r--r-- | tests/unit/com/android/documentsui/ForResultForwarderActivityTest.java | 55 | ||||
-rw-r--r-- | tests/unit/com/android/documentsui/PickActivityTest.java | 40 | ||||
-rw-r--r-- | tests/unit/com/android/documentsui/picker/ActionHandlerTest.java | 141 |
8 files changed, 42 insertions, 338 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 89ccd9732..ba0556628 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -91,14 +91,6 @@ android:theme="@style/DocumentsTheme"> </activity> - <activity - android:name=".ForResultForwarderActivity" - android:theme="@android:style/Theme.NoDisplay" - android:excludeFromRecents="true" - android:finishOnCloseSystemDialogs="true" - android:exported="false"> - </activity> - <!-- Preserve original launcher activity from Nougat. --> <activity-alias android:name=".LauncherActivity" diff --git a/src/com/android/documentsui/AbstractActionHandler.java b/src/com/android/documentsui/AbstractActionHandler.java index 53c507ef3..0c612eddd 100644 --- a/src/com/android/documentsui/AbstractActionHandler.java +++ b/src/com/android/documentsui/AbstractActionHandler.java @@ -87,9 +87,7 @@ public abstract class AbstractActionHandler<T extends FragmentActivity & CommonA implements ActionHandler { @VisibleForTesting - public static final int CODE_FORWARD = 42; public static final int CODE_AUTHENTICATION = 43; - public static final int CODE_FORWARD_CROSS_PROFILE = 44; @VisibleForTesting static final int LOADER_ID = 42; diff --git a/src/com/android/documentsui/ForResultForwarderActivity.java b/src/com/android/documentsui/ForResultForwarderActivity.java deleted file mode 100644 index 61cee71dc..000000000 --- a/src/com/android/documentsui/ForResultForwarderActivity.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (C) 2020 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 android.app.Activity; -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; -import android.util.Log; - -import com.android.documentsui.base.UserId; - -/** - * Forwards a cross-profile startActivityForResult intent. - */ -public class ForResultForwarderActivity extends Activity { - - private static final String TAG = "ForResultForwarderActiv"; - private static final String EXTRA_INTENT = "EXTRA_INTENT"; - private static final String EXTRA_USER = "EXTRA_USER"; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - final Intent intent = getIntent(); - - if (!intent.hasExtra(EXTRA_INTENT) || !intent.hasExtra(EXTRA_USER)) { - Log.e(TAG, "Missing intent or user"); - setResult(Activity.RESULT_CANCELED); - finish(); - return; - } - - Intent targetIntent = intent.getParcelableExtra(EXTRA_INTENT); - // We should never have the default value because of the above check - UserId targetUserId = UserId.of(intent.getIntExtra(EXTRA_USER, /* defaultValue= */ -1)); - - targetIntent.addFlags( - Intent.FLAG_ACTIVITY_FORWARD_RESULT | Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP); - try { - targetUserId.startActivityAsUser(this, targetIntent); - } catch (RuntimeException e) { - Log.e(TAG, "Failed to forward activity"); - setResult(Activity.RESULT_CANCELED); - } - finish(); - } - - public static Intent getIntent(Context context, Intent intent, UserId targetUserId) { - Intent forwarder = new Intent(context, ForResultForwarderActivity.class); - forwarder.putExtra(EXTRA_INTENT, intent); - forwarder.putExtra(EXTRA_USER, targetUserId.getIdentifier()); - return forwarder; - } -} diff --git a/src/com/android/documentsui/picker/ActionHandler.java b/src/com/android/documentsui/picker/ActionHandler.java index c58927dc7..18a1487ca 100644 --- a/src/com/android/documentsui/picker/ActionHandler.java +++ b/src/com/android/documentsui/picker/ActionHandler.java @@ -43,7 +43,6 @@ import androidx.recyclerview.selection.ItemDetailsLookup.ItemDetails; import com.android.documentsui.AbstractActionHandler; import com.android.documentsui.ActivityConfig; import com.android.documentsui.DocumentsAccess; -import com.android.documentsui.ForResultForwarderActivity; import com.android.documentsui.Injector; import com.android.documentsui.MetricConsts; import com.android.documentsui.Metrics; @@ -243,46 +242,6 @@ class ActionHandler<T extends FragmentActivity & Addons> extends AbstractActionH } @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - if (DEBUG) { - Log.d(TAG, "onActivityResult() code=" + resultCode); - } - - // Only relay back results when not canceled; otherwise stick around to - // let the user pick another app/backend. - switch (requestCode) { - case CODE_FORWARD: - case CODE_FORWARD_CROSS_PROFILE: - onExternalAppResult(requestCode, resultCode, data); - break; - default: - super.onActivityResult(requestCode, resultCode, data); - } - } - - private void onExternalAppResult(int requestCode, int resultCode, Intent data) { - if (resultCode != FragmentActivity.RESULT_CANCELED) { - if (requestCode == CODE_FORWARD_CROSS_PROFILE) { - UserId otherUser = UserId.CURRENT_USER.equals(mUserIdManager.getSystemUser()) - ? mUserIdManager.getManagedUser() - : mUserIdManager.getSystemUser(); - if (!mState.canInteractWith(otherUser)) { - mDialogs.showActionNotAllowed(); - return; - } - } - // Remember that we last picked via external app - mLastAccessed.setLastAccessedToExternalApp(mActivity); - - updatePickResult(data, false, MetricConsts.ROOT_THIRD_PARTY_APP); - - // Pass back result to original caller - mActivity.setResult(resultCode, data, 0); - mActivity.finish(); - } - } - - @Override public void openInNewWindow(DocumentStack path) { // Open new window support only depends on vanilla Activity, so it is // implemented in our parent class. But we don't support that in @@ -311,27 +270,30 @@ class ActionHandler<T extends FragmentActivity & Addons> extends AbstractActionH } Intent intent = new Intent(mActivity.getIntent()); - final int flagsRemoved = Intent.FLAG_ACTIVITY_FORWARD_RESULT - | Intent.FLAG_GRANT_READ_URI_PERMISSION + final int flagsRemoved = Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION | Intent.FLAG_GRANT_PREFIX_URI_PERMISSION; intent.setFlags(intent.getFlags() & ~flagsRemoved); + intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT); + intent.addFlags(Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP); intent.setComponent(new ComponentName( info.activityInfo.applicationInfo.packageName, info.activityInfo.name)); - if (!UserId.CURRENT_USER.equals(userId)) { - intent = ForResultForwarderActivity.getIntent(mActivity, intent, userId); - } try { boolean isCurrentUser = UserId.CURRENT_USER.equals(userId); - mActivity.startActivityForResult(intent, - isCurrentUser ? CODE_FORWARD : CODE_FORWARD_CROSS_PROFILE); + if (isCurrentUser) { + mActivity.startActivity(intent); + } else { + userId.startActivityAsUser(mActivity, intent); + } + mActivity.finish(); } catch (SecurityException | ActivityNotFoundException e) { Log.e(TAG, "Caught error: " + e.getLocalizedMessage()); mInjector.dialogs.showNoApplicationFound(); } } + @Override public void springOpenDirectory(DocumentInfo doc) { } diff --git a/tests/AndroidManifest.xml b/tests/AndroidManifest.xml index 1fd1b7908..cb43811d4 100644 --- a/tests/AndroidManifest.xml +++ b/tests/AndroidManifest.xml @@ -37,13 +37,6 @@ </intent-filter> </activity> - <activity android:name="com.android.documentsui.PickActivityTest$ReturnResultActivity"> - <intent-filter> - <action android:name="com.android.documentsui.test.action.RETURN_RESULT" /> - <category android:name="android.intent.category.DEFAULT" /> - </intent-filter> - </activity> - <provider android:name="com.android.documentsui.StubProvider" diff --git a/tests/unit/com/android/documentsui/ForResultForwarderActivityTest.java b/tests/unit/com/android/documentsui/ForResultForwarderActivityTest.java deleted file mode 100644 index 56e549afa..000000000 --- a/tests/unit/com/android/documentsui/ForResultForwarderActivityTest.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2020 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 com.google.common.truth.Truth.assertThat; - -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.pm.ResolveInfo; - -import androidx.test.filters.SmallTest; -import androidx.test.platform.app.InstrumentationRegistry; - -import com.android.documentsui.testing.TestProvidersAccess; - -import org.junit.Before; -import org.junit.Test; - -@SmallTest -public class ForResultForwarderActivityTest { - - private Context mTargetContext; - - @Before - public void setUp() throws Exception { - mTargetContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); - } - - @Test - public void testActivityNotExported() { - Intent originalIntent = new Intent("some_action"); - Intent intent = ForResultForwarderActivity.getIntent(mTargetContext, originalIntent, - TestProvidersAccess.USER_ID); - - ResolveInfo info = mTargetContext.getPackageManager().resolveActivity(intent, 0); - assertThat(info.activityInfo.getComponentName()) - .isEqualTo(new ComponentName(mTargetContext, ForResultForwarderActivity.class)); - assertThat(info.activityInfo.exported).isFalse(); - } -} diff --git a/tests/unit/com/android/documentsui/PickActivityTest.java b/tests/unit/com/android/documentsui/PickActivityTest.java index 9311822f7..1fbc20d9b 100644 --- a/tests/unit/com/android/documentsui/PickActivityTest.java +++ b/tests/unit/com/android/documentsui/PickActivityTest.java @@ -25,7 +25,6 @@ import android.app.Instrumentation; import android.content.Context; import android.content.Intent; import android.net.Uri; -import android.os.Bundle; import android.os.SystemClock; import android.provider.DocumentsContract; @@ -123,43 +122,4 @@ public class PickActivityTest { assertThat(pickActivity.isFinishing()).isFalse(); testDialogs.assertActionNotAllowedShown(); } - - @Test - public void testStartForResultForwarderActivity() { - Intent originalIntent = new Intent("com.android.documentsui.test.action.RETURN_RESULT"); - Intent intent = ForResultForwarderActivity.getIntent(mTargetContext, originalIntent, - TestProvidersAccess.USER_ID); - - PickActivity pickActivity = mRule.launchActivity(intentGetContent); - pickActivity.startActivityForResult(intent, AbstractActionHandler.CODE_FORWARD); - SystemClock.sleep(3000); - - Instrumentation.ActivityResult result = mRule.getActivityResult(); - assertThat(result.getResultCode()).isEqualTo(Activity.RESULT_OK); - assertThat(result.getResultData().getStringExtra(RESULT_EXTRA)).isEqualTo(RESULT_DATA); - } - - @Test - public void testStartForResultForwarderActivity_noActivity() { - Intent originalIntent = new Intent("no_app_handles_this_intent_action"); - Intent intent = ForResultForwarderActivity.getIntent(mTargetContext, originalIntent, - TestProvidersAccess.USER_ID); - - PickActivity pickActivity = mRule.launchActivity(intentGetContent); - pickActivity.startActivityForResult(intent, AbstractActionHandler.CODE_FORWARD); - SystemClock.sleep(3000); - - assertThat(pickActivity.isFinishing()).isFalse(); - } - - public static class ReturnResultActivity extends Activity { - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - Intent data = new Intent(); - data.putExtra(RESULT_EXTRA, RESULT_DATA); - setResult(Activity.RESULT_OK, data); - finish(); - } - } } diff --git a/tests/unit/com/android/documentsui/picker/ActionHandlerTest.java b/tests/unit/com/android/documentsui/picker/ActionHandlerTest.java index db0922994..3601bf541 100644 --- a/tests/unit/com/android/documentsui/picker/ActionHandlerTest.java +++ b/tests/unit/com/android/documentsui/picker/ActionHandlerTest.java @@ -27,6 +27,7 @@ import android.app.Activity; import android.content.ClipData; import android.content.ComponentName; import android.content.Intent; +import android.content.pm.ResolveInfo; import android.net.Uri; import android.os.AsyncTask; import android.provider.DocumentsContract; @@ -36,9 +37,7 @@ import androidx.fragment.app.FragmentActivity; import androidx.test.filters.MediumTest; import androidx.test.runner.AndroidJUnit4; -import com.android.documentsui.AbstractActionHandler; import com.android.documentsui.DocumentsAccess; -import com.android.documentsui.ForResultForwarderActivity; import com.android.documentsui.Injector; import com.android.documentsui.R; import com.android.documentsui.TestUserIdManager; @@ -523,113 +522,57 @@ public class ActionHandlerTest { mActivity.finishedHandler.assertCalled(); } - @Test - public void testOnAppPickedResult_OnOK() throws Exception { - Intent intent = new Intent(); - mHandler.onActivityResult(AbstractActionHandler.CODE_FORWARD, Activity.RESULT_OK, intent); - mActivity.finishedHandler.assertCalled(); - mActivity.setResult.assertCalled(); - - assertEquals(Activity.RESULT_OK, (long) mActivity.setResult.getLastValue().first); - assertEquals(intent, mActivity.setResult.getLastValue().second); - } - - @Test - public void testOnAppPickedResult_OnOK_crossProfile() throws Exception { - mEnv.state.canShareAcrossProfile = true; - mTestUserIdManager.managedUser = TestProvidersAccess.OtherUser.USER_ID; - mTestUserIdManager.systemUser = TestProvidersAccess.USER_ID; - - Intent intent = new Intent(); - mHandler.onActivityResult(AbstractActionHandler.CODE_FORWARD_CROSS_PROFILE, - Activity.RESULT_OK, intent); - mActivity.finishedHandler.assertCalled(); - mActivity.setResult.assertCalled(); - - assertEquals(Activity.RESULT_OK, (long) mActivity.setResult.getLastValue().first); - assertEquals(intent, mActivity.setResult.getLastValue().second); - mEnv.dialogs.assertActionNotAllowedNotShown(); - } - - @Test - public void testOnAppPickedResult_OnOK_crossProfile_withoutPermission() throws Exception { - mEnv.state.canShareAcrossProfile = false; - mTestUserIdManager.managedUser = TestProvidersAccess.OtherUser.USER_ID; - mTestUserIdManager.systemUser = TestProvidersAccess.USER_ID; - - Intent intent = new Intent(); - mHandler.onActivityResult(AbstractActionHandler.CODE_FORWARD_CROSS_PROFILE, - Activity.RESULT_OK, intent); - mActivity.finishedHandler.assertNotCalled(); - mActivity.setResult.assertNotCalled(); - mEnv.dialogs.assertActionNotAllowedShown(); - } - - @Test - public void testOnAppPickedResult_OnNotOK() throws Exception { - Intent intent = new Intent(); - mHandler.onActivityResult(0, Activity.RESULT_OK, intent); - mActivity.finishedHandler.assertNotCalled(); - mActivity.setResult.assertNotCalled(); - - mHandler.onActivityResult(AbstractActionHandler.CODE_FORWARD, Activity.RESULT_CANCELED, - intent); - mActivity.finishedHandler.assertNotCalled(); - mActivity.setResult.assertNotCalled(); - } - - @Test - public void testOnAppPickedResult_OnNotOK_crossProfile() throws Exception { - Intent intent = new Intent(); - mHandler.onActivityResult(AbstractActionHandler.CODE_FORWARD_CROSS_PROFILE, - Activity.RESULT_CANCELED, - intent); - mActivity.finishedHandler.assertNotCalled(); - mActivity.setResult.assertNotCalled(); - } @Test public void testOpenAppRoot() throws Exception { mHandler.openRoot(TestResolveInfo.create(), TestProvidersAccess.USER_ID); - assertEquals((long) mActivity.startActivityForResult.getLastValue().second, - AbstractActionHandler.CODE_FORWARD); - assertNotNull(mActivity.startActivityForResult.getLastValue().first); + assertNotNull(mActivity.startActivity.getLastValue()); } @Test public void testOpenAppRoot_otherUser() throws Exception { + ResolveInfo info = TestResolveInfo.create(); mEnv.state.canShareAcrossProfile = true; - mHandler.openRoot(TestResolveInfo.create(), TestProvidersAccess.OtherUser.USER_ID); - assertEquals((long) mActivity.startActivityForResult.getLastValue().second, - AbstractActionHandler.CODE_FORWARD_CROSS_PROFILE); - Intent forwarderIntent = mActivity.startActivityForResult.getLastValue().first; - assertThat(forwarderIntent.getComponent()).isEqualTo( - new ComponentName(mActivity.getPackageName(), - ForResultForwarderActivity.class.getName())); - Intent originalIntent = forwarderIntent.getParcelableExtra(EXTRA_INTENT); - assertThat(originalIntent).isNotNull(); - assertThat(forwarderIntent.getIntExtra(EXTRA_USER, -1)) - .isEqualTo(TestProvidersAccess.OtherUser.USER_ID.getIdentifier()); + mHandler.openRoot(info, TestProvidersAccess.OtherUser.USER_ID); + assertThat(mActivity.startActivityAsUser.getLastValue().first.getComponent()).isEqualTo( + new ComponentName(info.activityInfo.applicationInfo.packageName, + info.activityInfo.name)); + assertThat(mActivity.startActivityAsUser.getLastValue().second) + .isEqualTo(TestProvidersAccess.OtherUser.USER_HANDLE); + + int flags = mActivity.startActivityAsUser.getLastValue().first.getFlags(); + assertEquals(0, flags & Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION); + assertEquals(0, flags & Intent.FLAG_GRANT_PREFIX_URI_PERMISSION); + assertEquals(0, flags & Intent.FLAG_GRANT_WRITE_URI_PERMISSION); + assertEquals(0, flags & Intent.FLAG_GRANT_READ_URI_PERMISSION); + assertEquals(Intent.FLAG_ACTIVITY_FORWARD_RESULT, + flags & Intent.FLAG_ACTIVITY_FORWARD_RESULT); + assertEquals(Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP, + flags & Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP); } @Test - public void testOpenAppRoot_removeFlags() throws Exception { + public void testOpenAppRoot_removeFlagsAddForwardResult() throws Exception { + ResolveInfo info = TestResolveInfo.create(); mActivity.intent.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION | Intent.FLAG_GRANT_PREFIX_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); - mHandler.openRoot(TestResolveInfo.create(), TestProvidersAccess.USER_ID); - assertEquals((long) mActivity.startActivityForResult.getLastValue().second, - AbstractActionHandler.CODE_FORWARD); - assertNotNull(mActivity.startActivityForResult.getLastValue().first); + mHandler.openRoot(info, TestProvidersAccess.USER_ID); + assertThat(mActivity.startActivity.getLastValue().getComponent()).isEqualTo( + new ComponentName(info.activityInfo.applicationInfo.packageName, + info.activityInfo.name)); - int flags = mActivity.startActivityForResult.getLastValue().first.getFlags(); - assertEquals(0, flags & Intent.FLAG_ACTIVITY_FORWARD_RESULT); + int flags = mActivity.startActivity.getLastValue().getFlags(); assertEquals(0, flags & Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION); assertEquals(0, flags & Intent.FLAG_GRANT_PREFIX_URI_PERMISSION); assertEquals(0, flags & Intent.FLAG_GRANT_WRITE_URI_PERMISSION); assertEquals(0, flags & Intent.FLAG_GRANT_READ_URI_PERMISSION); + assertEquals(Intent.FLAG_ACTIVITY_FORWARD_RESULT, + flags & Intent.FLAG_ACTIVITY_FORWARD_RESULT); + assertEquals(Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP, + flags & Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP); } @Test @@ -638,8 +581,8 @@ public class ActionHandlerTest { mActivity.intent.putExtra(Intent.EXTRA_CONTENT_QUERY, queryContent); mHandler.openRoot(TestResolveInfo.create(), TestProvidersAccess.USER_ID); assertEquals(queryContent, - mActivity.startActivityForResult.getLastValue().first.getStringExtra( - Intent.EXTRA_CONTENT_QUERY)); + mActivity.startActivity.getLastValue().getStringExtra( + Intent.EXTRA_CONTENT_QUERY)); } @Test @@ -652,26 +595,6 @@ public class ActionHandlerTest { } @Test - public void testOpenAppRoot_happensWithPermission_differentUser() throws Exception { - final String queryContent = "query"; - mEnv.state.canShareAcrossProfile = true; - mActivity.intent.putExtra(Intent.EXTRA_CONTENT_QUERY, queryContent); - mHandler.openRoot(TestResolveInfo.create(), TestProvidersAccess.OtherUser.USER_ID); - - Intent forwarderIntent = mActivity.startActivityForResult.getLastValue().first; - assertThat(forwarderIntent.getComponent()).isEqualTo( - new ComponentName(mActivity.getPackageName(), - ForResultForwarderActivity.class.getName())); - - Intent originalIntent = forwarderIntent.getParcelableExtra(EXTRA_INTENT); - assertThat(originalIntent.getStringExtra( - Intent.EXTRA_CONTENT_QUERY)).isEqualTo(queryContent); - assertThat(forwarderIntent.getIntExtra(EXTRA_USER, -1)) - .isEqualTo(TestProvidersAccess.OtherUser.USER_ID.getIdentifier()); - mEnv.dialogs.assertActionNotAllowedNotShown(); - } - - @Test public void testPreviewItem() throws Exception { mActivity.resources.setQuickViewerPackage("corptropolis.viewer"); mActivity.currentRoot = TestProvidersAccess.HOME; |