Loading src/com/android/settings/accounts/AccountDetailDashboardFragment.java +11 −4 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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) { Loading @@ -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) { Loading @@ -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 Loading Loading @@ -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; } Loading src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java +11 −1 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -238,10 +241,17 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider { } else if (tile.userHandle.size() == 1) { mMetricsFeatureProvider.logDashboardStartIntent(mContext, intent, sourceMetricCategory); activity.startActivityForResultAsUser(intent, 0, tile.userHandle.get(0)); } else { 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); } } } private boolean isIntentResolvable(Intent intent) { return mPackageManager.resolveActivity(intent, 0) != null; Loading tests/robotests/src/com/android/settings/accounts/AccountDetailDashboardFragmentTest.java +16 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 = Loading tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java +43 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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<UserHandle> handles = new ArrayList<>(); handles.add(new UserHandle(0)); handles.add(userHandle); tile.userHandle = handles; mImpl.openTileIntent(mActivity, tile); final ArgumentCaptor<UserHandle> 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<UserHandle> 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(); } } Loading
src/com/android/settings/accounts/AccountDetailDashboardFragment.java +11 −4 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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) { Loading @@ -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) { Loading @@ -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 Loading Loading @@ -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; } Loading
src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java +11 −1 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -238,10 +241,17 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider { } else if (tile.userHandle.size() == 1) { mMetricsFeatureProvider.logDashboardStartIntent(mContext, intent, sourceMetricCategory); activity.startActivityForResultAsUser(intent, 0, tile.userHandle.get(0)); } else { 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); } } } private boolean isIntentResolvable(Intent intent) { return mPackageManager.resolveActivity(intent, 0) != null; Loading
tests/robotests/src/com/android/settings/accounts/AccountDetailDashboardFragmentTest.java +16 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 = Loading
tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java +43 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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<UserHandle> handles = new ArrayList<>(); handles.add(new UserHandle(0)); handles.add(userHandle); tile.userHandle = handles; mImpl.openTileIntent(mActivity, tile); final ArgumentCaptor<UserHandle> 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<UserHandle> 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(); } }