From 9e257265934cae90a7f3b66da4f280714da55ebc Mon Sep 17 00:00:00 2001 From: lumark Date: Mon, 11 Jun 2018 15:20:39 +0800 Subject: [PATCH] Fix back stack didn't perserved when Files Activity launched by Setting storage then back case. Due to FilesActivity set "android:documentLaunchMode="intoExisting", it will create new task when launched from Storage Setting page. When select FilesActivity task from recents & press back key, it will not back to settings page. Using startActivityForResult to set task as source task can fix task separated case. Change-Id: I26362928261a1a9c0e485a486be493423d1fcf61 Fixes: 33117269 Test: Manual Test: atest StorageItemPreferenceControllerTest --- .../StorageItemPreferenceController.java | 8 ++++-- .../StorageItemPreferenceControllerTest.java | 28 ++++++++++--------- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java b/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java index 9604f74fe3e..0272b5c6dfa 100644 --- a/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java +++ b/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java @@ -402,10 +402,14 @@ public class StorageItemPreferenceController extends AbstractPreferenceControlle try { final int userId = intent.getIntExtra(Intent.EXTRA_USER_ID, -1); + // b/33117269: Note that launchIntent may launch activity in different task which set + // different launchMode (e.g. Files), using startActivityForesult to set task as + // source task, and set requestCode as 0 means don't care about returnCode currently. if (userId == -1) { - mFragment.startActivity(intent); + mFragment.startActivityForResult(intent, 0 /* requestCode not used */); } else { - mFragment.getActivity().startActivityAsUser(intent, new UserHandle(userId)); + mFragment.getActivity().startActivityForResultAsUser(intent, + 0 /* requestCode not used */, new UserHandle(userId)); } } catch (ActivityNotFoundException e) { Log.w(TAG, "No activity found for " + intent); diff --git a/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java index a4107f5b186..c8ed42e342c 100644 --- a/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java @@ -19,6 +19,7 @@ import static com.android.settings.applications.manageapplications.ManageApplica import static com.android.settings.applications.manageapplications.ManageApplications.EXTRA_WORK_ONLY; import static com.android.settings.utils.FileSizeFormatter.MEGABYTE_IN_BYTES; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.nullable; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; @@ -123,7 +124,8 @@ public class StorageItemPreferenceControllerTest { mController.handlePreferenceTreeClick(mPreference); final ArgumentCaptor argumentCaptor = ArgumentCaptor.forClass(Intent.class); - verify(mActivity).startActivityAsUser(argumentCaptor.capture(), nullable(UserHandle.class)); + verify(mActivity).startActivityForResultAsUser(argumentCaptor.capture(), anyInt(), + nullable(UserHandle.class)); final Intent intent = argumentCaptor.getValue(); assertThat(intent.getAction()).isEqualTo(Intent.ACTION_MAIN); @@ -140,8 +142,8 @@ public class StorageItemPreferenceControllerTest { mController.handlePreferenceTreeClick(mPreference); final ArgumentCaptor argumentCaptor = ArgumentCaptor.forClass(Intent.class); - verify(mFragment.getActivity()) - .startActivityAsUser(argumentCaptor.capture(), nullable(UserHandle.class)); + verify(mFragment.getActivity()).startActivityForResultAsUser(argumentCaptor.capture(), + anyInt(), nullable(UserHandle.class)); final Intent intent = argumentCaptor.getValue(); assertThat(intent.getAction()).isEqualTo(Intent.ACTION_MAIN); @@ -167,8 +169,8 @@ public class StorageItemPreferenceControllerTest { mController.handlePreferenceTreeClick(mPreference); final ArgumentCaptor argumentCaptor = ArgumentCaptor.forClass(Intent.class); - verify(mFragment.getActivity()).startActivityAsUser(argumentCaptor.capture(), - nullable(UserHandle.class)); + verify(mFragment.getActivity()).startActivityForResultAsUser(argumentCaptor.capture(), + anyInt(), nullable(UserHandle.class)); final Intent intent = argumentCaptor.getValue(); assertThat(intent.getAction()).isEqualTo(Intent.ACTION_MAIN); @@ -186,8 +188,8 @@ public class StorageItemPreferenceControllerTest { mController.handlePreferenceTreeClick(mPreference); final ArgumentCaptor argumentCaptor = ArgumentCaptor.forClass(Intent.class); - verify(mFragment.getActivity()) - .startActivityAsUser(argumentCaptor.capture(), nullable(UserHandle.class)); + verify(mFragment.getActivity()).startActivityForResultAsUser(argumentCaptor.capture(), + anyInt(), nullable(UserHandle.class)); Intent intent = argumentCaptor.getValue(); assertThat(intent.getAction()).isEqualTo(Intent.ACTION_MAIN); @@ -223,8 +225,8 @@ public class StorageItemPreferenceControllerTest { .isTrue(); final ArgumentCaptor argumentCaptor = ArgumentCaptor.forClass(Intent.class); - verify(mFragment.getActivity()).startActivityAsUser(argumentCaptor.capture(), - nullable(UserHandle.class)); + verify(mFragment.getActivity()).startActivityForResultAsUser(argumentCaptor.capture(), + anyInt(), nullable(UserHandle.class)); Intent intent = argumentCaptor.getValue(); Intent browseIntent = mVolume.buildBrowseIntent(); @@ -240,8 +242,8 @@ public class StorageItemPreferenceControllerTest { mController.handlePreferenceTreeClick(mPreference); final ArgumentCaptor argumentCaptor = ArgumentCaptor.forClass(Intent.class); - verify(mFragment.getActivity()).startActivityAsUser(argumentCaptor.capture(), - nullable(UserHandle.class)); + verify(mFragment.getActivity()).startActivityForResultAsUser(argumentCaptor.capture(), + anyInt(), nullable(UserHandle.class)); Intent intent = argumentCaptor.getValue(); assertThat(intent.getAction()).isEqualTo(Intent.ACTION_MAIN); @@ -258,8 +260,8 @@ public class StorageItemPreferenceControllerTest { mController.handlePreferenceTreeClick(mPreference); final ArgumentCaptor argumentCaptor = ArgumentCaptor.forClass(Intent.class); - verify(mFragment.getActivity()).startActivityAsUser(argumentCaptor.capture(), - nullable(UserHandle.class)); + verify(mFragment.getActivity()).startActivityForResultAsUser(argumentCaptor.capture(), + anyInt(), nullable(UserHandle.class)); Intent intent = argumentCaptor.getValue(); assertThat(intent.getAction()).isEqualTo(Intent.ACTION_MAIN);