diff --git a/src/com/android/settings/accounts/AccountDetailDashboardFragment.java b/src/com/android/settings/accounts/AccountDetailDashboardFragment.java index 4b612384250..ad6ecaff6c0 100644 --- a/src/com/android/settings/accounts/AccountDetailDashboardFragment.java +++ b/src/com/android/settings/accounts/AccountDetailDashboardFragment.java @@ -15,11 +15,14 @@ */ package com.android.settings.accounts; +import static android.content.Intent.EXTRA_USER; + import android.accounts.Account; import android.accounts.AccountManager; import android.app.Activity; import android.app.settings.SettingsEnums; import android.content.Context; +import android.content.Intent; import android.os.Bundle; import android.os.UserHandle; import android.os.UserManager; @@ -56,6 +59,8 @@ public class AccountDetailDashboardFragment extends DashboardFragment { String mAccountType; private AccountSyncPreferenceController mAccountSynController; private RemoveAccountPreferenceController mRemoveAccountController; + @VisibleForTesting + UserHandle mUserHandle; @Override public void onCreate(Bundle icicle) { @@ -63,7 +68,7 @@ public class AccountDetailDashboardFragment extends DashboardFragment { getPreferenceManager().setPreferenceComparisonCallback(null); Bundle args = getArguments(); final Activity activity = getActivity(); - UserHandle userHandle = Utils.getSecureTargetUser(activity.getActivityToken(), + mUserHandle = Utils.getSecureTargetUser(activity.getActivityToken(), (UserManager) getSystemService(Context.USER_SERVICE), args, activity.getIntent().getExtras()); if (args != null) { @@ -77,8 +82,8 @@ public class AccountDetailDashboardFragment extends DashboardFragment { mAccountType = args.getString(KEY_ACCOUNT_TYPE); } } - mAccountSynController.init(mAccount, userHandle); - mRemoveAccountController.init(mAccount, userHandle); + mAccountSynController.init(mAccount, mUserHandle); + mRemoveAccountController.init(mAccount, mUserHandle); } @Override @@ -154,7 +159,9 @@ public class AccountDetailDashboardFragment extends DashboardFragment { } final boolean display = mAccountType.equals(metadata.getString(METADATA_IA_ACCOUNT)); if (display) { - tile.getIntent().putExtra(EXTRA_ACCOUNT_NAME, mAccount.name); + final Intent intent = tile.getIntent(); + intent.putExtra(EXTRA_ACCOUNT_NAME, mAccount.name); + intent.putExtra(EXTRA_USER, mUserHandle); } return display; } diff --git a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java index f79cf5bdc48..69e86cdd0e3 100644 --- a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java +++ b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java @@ -16,6 +16,8 @@ package com.android.settings.dashboard; +import static android.content.Intent.EXTRA_USER; + import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_ICON_URI; import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_SUMMARY; import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_SUMMARY_URI; @@ -29,6 +31,7 @@ import android.content.pm.PackageManager; import android.graphics.drawable.Drawable; import android.graphics.drawable.Icon; import android.os.Bundle; +import android.os.UserHandle; import android.provider.Settings; import android.text.TextUtils; import android.util.ArrayMap; @@ -239,7 +242,14 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider { mMetricsFeatureProvider.logDashboardStartIntent(mContext, intent, sourceMetricCategory); activity.startActivityForResultAsUser(intent, 0, tile.userHandle.get(0)); } else { - ProfileSelectDialog.show(activity.getSupportFragmentManager(), tile); + final UserHandle userHandle = intent.getParcelableExtra(EXTRA_USER); + if (userHandle != null && tile.userHandle.contains(userHandle)) { + mMetricsFeatureProvider.logDashboardStartIntent( + mContext, intent, sourceMetricCategory); + activity.startActivityForResultAsUser(intent, 0, userHandle); + } else { + ProfileSelectDialog.show(activity.getSupportFragmentManager(), tile); + } } } diff --git a/tests/robotests/src/com/android/settings/accounts/AccountDetailDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/accounts/AccountDetailDashboardFragmentTest.java index 0be51c31d29..dffa96861c2 100644 --- a/tests/robotests/src/com/android/settings/accounts/AccountDetailDashboardFragmentTest.java +++ b/tests/robotests/src/com/android/settings/accounts/AccountDetailDashboardFragmentTest.java @@ -15,6 +15,8 @@ */ package com.android.settings.accounts; +import static android.content.Intent.EXTRA_USER; + import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_KEYHINT; import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_TITLE; @@ -160,6 +162,20 @@ public class AccountDetailDashboardFragmentTest { assertThat(intent.getStringExtra("extra.accountName")).isEqualTo("name1@abc.com"); } + @Test + public void displayTile_shouldAddUserHandleToTileIntent() { + mFragment.mUserHandle = new UserHandle(1); + + final Tile tile = new Tile(mActivityInfo, CategoryKey.CATEGORY_ACCOUNT_DETAIL); + mActivityInfo.metaData.putString(METADATA_CATEGORY, CategoryKey.CATEGORY_ACCOUNT); + mActivityInfo.metaData.putString(METADATA_ACCOUNT_TYPE, "com.abc"); + + mFragment.displayTile(tile); + + final UserHandle userHandle = tile.getIntent().getParcelableExtra(EXTRA_USER); + assertThat(userHandle.getIdentifier()).isEqualTo(1); + } + @Test public void onResume_accountMissing_shouldFinish() { ShadowUserManager userManager = diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java index 2aa6ae22ff8..1c51b81a5e9 100644 --- a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java +++ b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java @@ -16,6 +16,8 @@ package com.android.settings.dashboard; +import static android.content.Intent.EXTRA_USER; + import static com.android.settingslib.drawer.TileUtils.META_DATA_KEY_ORDER; import static com.android.settingslib.drawer.TileUtils.META_DATA_KEY_PROFILE; import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_KEYHINT; @@ -67,6 +69,7 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Answers; +import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.Robolectric; @@ -412,4 +415,44 @@ public class DashboardFeatureProviderImplTest { .startActivityForResult(any(Intent.class), eq(0)); verify(mActivity, never()).getSupportFragmentManager(); } + + @Test + public void openTileIntent_profileSelectionDialog_validUserHandleShouldNotShow() { + final int userId = 10; + ShadowUserManager.getShadow().addUser(userId, "Someone", 0); + + final UserHandle userHandle = new UserHandle(userId); + final Tile tile = new Tile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE); + tile.getIntent().putExtra(EXTRA_USER, userHandle); + final ArrayList handles = new ArrayList<>(); + handles.add(new UserHandle(0)); + handles.add(userHandle); + tile.userHandle = handles; + + mImpl.openTileIntent(mActivity, tile); + + final ArgumentCaptor argument = ArgumentCaptor.forClass(UserHandle.class); + verify(mActivity) + .startActivityForResultAsUser(any(Intent.class), anyInt(), argument.capture()); + assertThat(argument.getValue().getIdentifier()).isEqualTo(userId); + verify(mActivity, never()).getSupportFragmentManager(); + } + + @Test + public void openTileIntent_profileSelectionDialog_invalidUserHandleShouldShow() { + ShadowUserManager.getShadow().addUser(10, "Someone", 0); + + final Tile tile = new Tile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE); + tile.getIntent().putExtra(EXTRA_USER, new UserHandle(30)); + final ArrayList handles = new ArrayList<>(); + handles.add(new UserHandle(0)); + handles.add(new UserHandle(10)); + tile.userHandle = handles; + + mImpl.openTileIntent(mActivity, tile); + + verify(mActivity, never()) + .startActivityForResultAsUser(any(Intent.class), anyInt(), any(UserHandle.class)); + verify(mActivity).getSupportFragmentManager(); + } }