Add current user handle to tile intent in account detail page.
- the account detail settings page is launched with the correct user handle when there is work profile to indicate which profile the account belongs to. When we process the dynamic tile, for the page, we should add this info to the tile intent, so that it can be launched with the correct profile. - when we launch the tile intent, check whether there's user handle specified. If so, launch the intent directly without prompting for profile selection. Change-Id: I91f8c666a826909006b1f53907b3441825322c10 Fixes: 119657694 Test: make RunSettingsRoboTests
This commit is contained in:
@@ -15,11 +15,14 @@
|
|||||||
*/
|
*/
|
||||||
package com.android.settings.accounts;
|
package com.android.settings.accounts;
|
||||||
|
|
||||||
|
import static android.content.Intent.EXTRA_USER;
|
||||||
|
|
||||||
import android.accounts.Account;
|
import android.accounts.Account;
|
||||||
import android.accounts.AccountManager;
|
import android.accounts.AccountManager;
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.app.settings.SettingsEnums;
|
import android.app.settings.SettingsEnums;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.UserHandle;
|
import android.os.UserHandle;
|
||||||
import android.os.UserManager;
|
import android.os.UserManager;
|
||||||
@@ -56,6 +59,8 @@ public class AccountDetailDashboardFragment extends DashboardFragment {
|
|||||||
String mAccountType;
|
String mAccountType;
|
||||||
private AccountSyncPreferenceController mAccountSynController;
|
private AccountSyncPreferenceController mAccountSynController;
|
||||||
private RemoveAccountPreferenceController mRemoveAccountController;
|
private RemoveAccountPreferenceController mRemoveAccountController;
|
||||||
|
@VisibleForTesting
|
||||||
|
UserHandle mUserHandle;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle icicle) {
|
public void onCreate(Bundle icicle) {
|
||||||
@@ -63,7 +68,7 @@ public class AccountDetailDashboardFragment extends DashboardFragment {
|
|||||||
getPreferenceManager().setPreferenceComparisonCallback(null);
|
getPreferenceManager().setPreferenceComparisonCallback(null);
|
||||||
Bundle args = getArguments();
|
Bundle args = getArguments();
|
||||||
final Activity activity = getActivity();
|
final Activity activity = getActivity();
|
||||||
UserHandle userHandle = Utils.getSecureTargetUser(activity.getActivityToken(),
|
mUserHandle = Utils.getSecureTargetUser(activity.getActivityToken(),
|
||||||
(UserManager) getSystemService(Context.USER_SERVICE), args,
|
(UserManager) getSystemService(Context.USER_SERVICE), args,
|
||||||
activity.getIntent().getExtras());
|
activity.getIntent().getExtras());
|
||||||
if (args != null) {
|
if (args != null) {
|
||||||
@@ -77,8 +82,8 @@ public class AccountDetailDashboardFragment extends DashboardFragment {
|
|||||||
mAccountType = args.getString(KEY_ACCOUNT_TYPE);
|
mAccountType = args.getString(KEY_ACCOUNT_TYPE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mAccountSynController.init(mAccount, userHandle);
|
mAccountSynController.init(mAccount, mUserHandle);
|
||||||
mRemoveAccountController.init(mAccount, userHandle);
|
mRemoveAccountController.init(mAccount, mUserHandle);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -154,7 +159,9 @@ public class AccountDetailDashboardFragment extends DashboardFragment {
|
|||||||
}
|
}
|
||||||
final boolean display = mAccountType.equals(metadata.getString(METADATA_IA_ACCOUNT));
|
final boolean display = mAccountType.equals(metadata.getString(METADATA_IA_ACCOUNT));
|
||||||
if (display) {
|
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;
|
return display;
|
||||||
}
|
}
|
||||||
|
@@ -16,6 +16,8 @@
|
|||||||
|
|
||||||
package com.android.settings.dashboard;
|
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_ICON_URI;
|
||||||
import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_SUMMARY;
|
import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_SUMMARY;
|
||||||
import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_SUMMARY_URI;
|
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.Drawable;
|
||||||
import android.graphics.drawable.Icon;
|
import android.graphics.drawable.Icon;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.os.UserHandle;
|
||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.ArrayMap;
|
import android.util.ArrayMap;
|
||||||
@@ -238,10 +241,17 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider {
|
|||||||
} else if (tile.userHandle.size() == 1) {
|
} else if (tile.userHandle.size() == 1) {
|
||||||
mMetricsFeatureProvider.logDashboardStartIntent(mContext, intent, sourceMetricCategory);
|
mMetricsFeatureProvider.logDashboardStartIntent(mContext, intent, sourceMetricCategory);
|
||||||
activity.startActivityForResultAsUser(intent, 0, tile.userHandle.get(0));
|
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 {
|
} else {
|
||||||
ProfileSelectDialog.show(activity.getSupportFragmentManager(), tile);
|
ProfileSelectDialog.show(activity.getSupportFragmentManager(), tile);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private boolean isIntentResolvable(Intent intent) {
|
private boolean isIntentResolvable(Intent intent) {
|
||||||
return mPackageManager.resolveActivity(intent, 0) != null;
|
return mPackageManager.resolveActivity(intent, 0) != null;
|
||||||
|
@@ -15,6 +15,8 @@
|
|||||||
*/
|
*/
|
||||||
package com.android.settings.accounts;
|
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_KEYHINT;
|
||||||
import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_TITLE;
|
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");
|
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
|
@Test
|
||||||
public void onResume_accountMissing_shouldFinish() {
|
public void onResume_accountMissing_shouldFinish() {
|
||||||
ShadowUserManager userManager =
|
ShadowUserManager userManager =
|
||||||
|
@@ -16,6 +16,8 @@
|
|||||||
|
|
||||||
package com.android.settings.dashboard;
|
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_ORDER;
|
||||||
import static com.android.settingslib.drawer.TileUtils.META_DATA_KEY_PROFILE;
|
import static com.android.settingslib.drawer.TileUtils.META_DATA_KEY_PROFILE;
|
||||||
import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_KEYHINT;
|
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.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.mockito.Answers;
|
import org.mockito.Answers;
|
||||||
|
import org.mockito.ArgumentCaptor;
|
||||||
import org.mockito.Mock;
|
import org.mockito.Mock;
|
||||||
import org.mockito.MockitoAnnotations;
|
import org.mockito.MockitoAnnotations;
|
||||||
import org.robolectric.Robolectric;
|
import org.robolectric.Robolectric;
|
||||||
@@ -412,4 +415,44 @@ public class DashboardFeatureProviderImplTest {
|
|||||||
.startActivityForResult(any(Intent.class), eq(0));
|
.startActivityForResult(any(Intent.class), eq(0));
|
||||||
verify(mActivity, never()).getSupportFragmentManager();
|
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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user