Modify account settings for better locale resolution

Bug: 16282173
Change-Id: I2ab861464cdbbb1c1b0a5a7231f960d8ed9e90c6
This commit is contained in:
Alexandra Gherghina
2014-08-11 12:40:13 +01:00
parent 2d93f36f00
commit 62464b819e
4 changed files with 135 additions and 17 deletions

View File

@@ -184,6 +184,11 @@ public class SettingsActivity extends Activity
* that fragment. * that fragment.
*/ */
public static final String EXTRA_SHOW_FRAGMENT_TITLE = ":settings:show_fragment_title"; public static final String EXTRA_SHOW_FRAGMENT_TITLE = ":settings:show_fragment_title";
/**
* The package name used to resolve the title resource id.
*/
public static final String EXTRA_SHOW_FRAGMENT_TITLE_RES_PACKAGE_NAME =
":settings:show_fragment_title_res_package_name";
public static final String EXTRA_SHOW_FRAGMENT_TITLE_RESID = public static final String EXTRA_SHOW_FRAGMENT_TITLE_RESID =
":settings:show_fragment_title_resid"; ":settings:show_fragment_title_resid";
public static final String EXTRA_SHOW_FRAGMENT_AS_SHORTCUT = public static final String EXTRA_SHOW_FRAGMENT_AS_SHORTCUT =
@@ -657,7 +662,23 @@ public class SettingsActivity extends Activity
if (initialTitleResId > 0) { if (initialTitleResId > 0) {
mInitialTitle = null; mInitialTitle = null;
mInitialTitleResId = initialTitleResId; mInitialTitleResId = initialTitleResId;
setTitle(mInitialTitleResId);
final String initialTitleResPackageName = intent.getStringExtra(
EXTRA_SHOW_FRAGMENT_TITLE_RES_PACKAGE_NAME);
if (initialTitleResPackageName != null) {
try {
Context authContext = createPackageContextAsUser(initialTitleResPackageName,
0 /* flags */, new UserHandle(UserHandle.myUserId()));
mInitialTitle = authContext.getResources().getText(mInitialTitleResId);
setTitle(mInitialTitle);
mInitialTitleResId = -1;
return;
} catch (NameNotFoundException e) {
Log.w(LOG_TAG, "Could not find package" + initialTitleResPackageName);
}
} else {
setTitle(mInitialTitleResId);
}
} else { } else {
mInitialTitleResId = -1; mInitialTitleResId = -1;
final String initialTitle = intent.getStringExtra(EXTRA_SHOW_FRAGMENT_TITLE); final String initialTitle = intent.getStringExtra(EXTRA_SHOW_FRAGMENT_TITLE);

View File

@@ -590,16 +590,52 @@ public final class Utils {
* @param title String to display for the title of this set of preferences. * @param title String to display for the title of this set of preferences.
*/ */
public static void startWithFragment(Context context, String fragmentName, Bundle args, public static void startWithFragment(Context context, String fragmentName, Bundle args,
Fragment resultTo, int resultRequestCode, int titleResId, CharSequence title) { Fragment resultTo, int resultRequestCode, int titleResId,
CharSequence title) {
startWithFragment(context, fragmentName, args, resultTo, resultRequestCode, startWithFragment(context, fragmentName, args, resultTo, resultRequestCode,
titleResId, title, false /* not a shortcut */); null /* titleResPackageName */, titleResId, title, false /* not a shortcut */);
}
/**
* Start a new instance of the activity, showing only the given fragment.
* When launched in this mode, the given preference fragment will be instantiated and fill the
* entire activity.
*
* @param context The context.
* @param fragmentName The name of the fragment to display.
* @param args Optional arguments to supply to the fragment.
* @param resultTo Option fragment that should receive the result of the activity launch.
* @param resultRequestCode If resultTo is non-null, this is the request code in which
* to report the result.
* @param titleResPackageName Optional package name for the resource id of the title.
* @param titleResId resource id for the String to display for the title of this set
* of preferences.
* @param title String to display for the title of this set of preferences.
*/
public static void startWithFragment(Context context, String fragmentName, Bundle args,
Fragment resultTo, int resultRequestCode, String titleResPackageName, int titleResId,
CharSequence title) {
startWithFragment(context, fragmentName, args, resultTo, resultRequestCode,
titleResPackageName, titleResId, title, false /* not a shortcut */);
} }
public static void startWithFragment(Context context, String fragmentName, Bundle args, public static void startWithFragment(Context context, String fragmentName, Bundle args,
Fragment resultTo, int resultRequestCode, int titleResId, CharSequence title, Fragment resultTo, int resultRequestCode, int titleResId,
boolean isShortcut) { CharSequence title, boolean isShortcut) {
Intent intent = onBuildStartFragmentIntent(context, fragmentName, args, titleResId, Intent intent = onBuildStartFragmentIntent(context, fragmentName, args,
title, isShortcut); null /* titleResPackageName */, titleResId, title, isShortcut);
if (resultTo == null) {
context.startActivity(intent);
} else {
resultTo.startActivityForResult(intent, resultRequestCode);
}
}
public static void startWithFragment(Context context, String fragmentName, Bundle args,
Fragment resultTo, int resultRequestCode, String titleResPackageName, int titleResId,
CharSequence title, boolean isShortcut) {
Intent intent = onBuildStartFragmentIntent(context, fragmentName, args, titleResPackageName,
titleResId, title, isShortcut);
if (resultTo == null) { if (resultTo == null) {
context.startActivity(intent); context.startActivity(intent);
} else { } else {
@@ -608,9 +644,20 @@ public final class Utils {
} }
public static void startWithFragmentAsUser(Context context, String fragmentName, Bundle args, public static void startWithFragmentAsUser(Context context, String fragmentName, Bundle args,
int titleResId, CharSequence title, boolean isShortcut, UserHandle userHandle) { int titleResId, CharSequence title, boolean isShortcut,
Intent intent = onBuildStartFragmentIntent(context, fragmentName, args, titleResId, UserHandle userHandle) {
title, isShortcut); Intent intent = onBuildStartFragmentIntent(context, fragmentName, args,
null /* titleResPackageName */, titleResId, title, isShortcut);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
context.startActivityAsUser(intent, userHandle);
}
public static void startWithFragmentAsUser(Context context, String fragmentName, Bundle args,
String titleResPackageName, int titleResId, CharSequence title, boolean isShortcut,
UserHandle userHandle) {
Intent intent = onBuildStartFragmentIntent(context, fragmentName, args, titleResPackageName,
titleResId, title, isShortcut);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
context.startActivityAsUser(intent, userHandle); context.startActivityAsUser(intent, userHandle);
@@ -625,6 +672,7 @@ public final class Utils {
* @param context The Context. * @param context The Context.
* @param fragmentName The name of the fragment to display. * @param fragmentName The name of the fragment to display.
* @param args Optional arguments to supply to the fragment. * @param args Optional arguments to supply to the fragment.
* @param titleResPackageName Optional package name for the resource id of the title.
* @param titleResId Optional title resource id to show for this item. * @param titleResId Optional title resource id to show for this item.
* @param title Optional title to show for this item. * @param title Optional title to show for this item.
* @param isShortcut tell if this is a Launcher Shortcut or not * @param isShortcut tell if this is a Launcher Shortcut or not
@@ -632,11 +680,14 @@ public final class Utils {
* fragment. * fragment.
*/ */
public static Intent onBuildStartFragmentIntent(Context context, String fragmentName, public static Intent onBuildStartFragmentIntent(Context context, String fragmentName,
Bundle args, int titleResId, CharSequence title, boolean isShortcut) { Bundle args, String titleResPackageName, int titleResId, CharSequence title,
boolean isShortcut) {
Intent intent = new Intent(Intent.ACTION_MAIN); Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setClass(context, SubSettings.class); intent.setClass(context, SubSettings.class);
intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT, fragmentName); intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT, fragmentName);
intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS, args); intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS, args);
intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE_RES_PACKAGE_NAME,
titleResPackageName);
intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE_RESID, titleResId); intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE_RESID, titleResId);
intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE, title); intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE, title);
intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_AS_SHORTCUT, isShortcut); intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_AS_SHORTCUT, isShortcut);

View File

@@ -369,6 +369,8 @@ public class AccountSettings extends SettingsPreferenceFragment
if (label == null) { if (label == null) {
continue; continue;
} }
final String titleResPackageName = helper.getPackageForType(accountType);
final int titleResId = helper.getLabelIdForType(accountType);
final Account[] accounts = AccountManager.get(getActivity()) final Account[] accounts = AccountManager.get(getActivity())
.getAccountsByTypeAsUser(accountType, userHandle); .getAccountsByTypeAsUser(accountType, userHandle);
@@ -382,7 +384,8 @@ public class AccountSettings extends SettingsPreferenceFragment
fragmentArguments.putParcelable(EXTRA_USER, userHandle); fragmentArguments.putParcelable(EXTRA_USER, userHandle);
accountTypePreferences.add(new AccountPreference(getActivity(), label, accountTypePreferences.add(new AccountPreference(getActivity(), label,
AccountSyncSettings.class.getName(), fragmentArguments, titleResPackageName, titleResId, AccountSyncSettings.class.getName(),
fragmentArguments,
helper.getDrawableForType(getActivity(), accountType))); helper.getDrawableForType(getActivity(), accountType)));
} else { } else {
final Bundle fragmentArguments = new Bundle(); final Bundle fragmentArguments = new Bundle();
@@ -392,7 +395,8 @@ public class AccountSettings extends SettingsPreferenceFragment
fragmentArguments.putParcelable(EXTRA_USER, userHandle); fragmentArguments.putParcelable(EXTRA_USER, userHandle);
accountTypePreferences.add(new AccountPreference(getActivity(), label, accountTypePreferences.add(new AccountPreference(getActivity(), label,
ManageAccountsSettings.class.getName(), fragmentArguments, titleResPackageName, titleResId, ManageAccountsSettings.class.getName(),
fragmentArguments,
helper.getDrawableForType(getActivity(), accountType))); helper.getDrawableForType(getActivity(), accountType)));
} }
helper.preloadDrawableForType(getActivity(), accountType); helper.preloadDrawableForType(getActivity(), accountType);
@@ -434,6 +438,17 @@ public class AccountSettings extends SettingsPreferenceFragment
*/ */
private final CharSequence mTitle; private final CharSequence mTitle;
/**
* Packange name used to resolve the resources of the title shown to the user in the new
* fragment.
*/
private final String mTitleResPackageName;
/**
* Resource id of the title shown to the user in the new fragment.
*/
private final int mTitleResId;
/** /**
* Full class name of the fragment to display when this tile is * Full class name of the fragment to display when this tile is
* selected. * selected.
@@ -447,10 +462,13 @@ public class AccountSettings extends SettingsPreferenceFragment
*/ */
private final Bundle mFragmentArguments; private final Bundle mFragmentArguments;
public AccountPreference(Context context, CharSequence title, String fragment, public AccountPreference(Context context, CharSequence title, String titleResPackageName,
Bundle fragmentArguments, Drawable icon) { int titleResId, String fragment, Bundle fragmentArguments,
Drawable icon) {
super(context); super(context);
mTitle = title; mTitle = title;
mTitleResPackageName = titleResPackageName;
mTitleResId = titleResId;
mFragment = fragment; mFragment = fragment;
mFragmentArguments = fragmentArguments; mFragmentArguments = fragmentArguments;
setWidgetLayoutResource(R.layout.account_type_preference); setWidgetLayoutResource(R.layout.account_type_preference);
@@ -464,8 +482,9 @@ public class AccountSettings extends SettingsPreferenceFragment
@Override @Override
public boolean onPreferenceClick(Preference preference) { public boolean onPreferenceClick(Preference preference) {
if (mFragment != null) { if (mFragment != null) {
Utils.startWithFragment( Utils.startWithFragment(getContext(), mFragment, mFragmentArguments,
getContext(), mFragment, mFragmentArguments, null, 0, 0, mTitle); null /* resultTo */, 0 /* resultRequestCode */, mTitleResPackageName,
mTitleResId, null /* title */);
return true; return true;
} }
return false; return false;

View File

@@ -147,6 +147,33 @@ final public class AuthenticatorHelper extends BroadcastReceiver {
return label; return label;
} }
/**
* Gets the package associated with a particular account type. If none found, return null.
* @param accountType the type of account
* @return the package name or null if one cannot be found.
*/
public String getPackageForType(final String accountType) {
if (mTypeToAuthDescription.containsKey(accountType)) {
AuthenticatorDescription desc = mTypeToAuthDescription.get(accountType);
return desc.packageName;
}
return null;
}
/**
* Gets the resource id of the label associated with a particular account type. If none found,
* return -1.
* @param accountType the type of account
* @return a resource id for the label or -1 if none found;
*/
public int getLabelIdForType(final String accountType) {
if (mTypeToAuthDescription.containsKey(accountType)) {
AuthenticatorDescription desc = mTypeToAuthDescription.get(accountType);
return desc.labelId;
}
return -1;
}
/** /**
* Updates provider icons. Subclasses should call this in onCreate() * Updates provider icons. Subclasses should call this in onCreate()
* and update any UI that depends on AuthenticatorDescriptions in onAuthDescriptionsUpdated(). * and update any UI that depends on AuthenticatorDescriptions in onAuthDescriptionsUpdated().