From 62464b819e185ce4a1642442fcf4cc18a4932a78 Mon Sep 17 00:00:00 2001 From: Alexandra Gherghina Date: Mon, 11 Aug 2014 12:40:13 +0100 Subject: [PATCH] Modify account settings for better locale resolution Bug: 16282173 Change-Id: I2ab861464cdbbb1c1b0a5a7231f960d8ed9e90c6 --- .../android/settings/SettingsActivity.java | 23 +++++- src/com/android/settings/Utils.java | 71 ++++++++++++++++--- .../settings/accounts/AccountSettings.java | 31 ++++++-- .../accounts/AuthenticatorHelper.java | 27 +++++++ 4 files changed, 135 insertions(+), 17 deletions(-) diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java index 37fcc871967..dc5675c9090 100644 --- a/src/com/android/settings/SettingsActivity.java +++ b/src/com/android/settings/SettingsActivity.java @@ -184,6 +184,11 @@ public class SettingsActivity extends Activity * that fragment. */ 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 = ":settings:show_fragment_title_resid"; public static final String EXTRA_SHOW_FRAGMENT_AS_SHORTCUT = @@ -657,7 +662,23 @@ public class SettingsActivity extends Activity if (initialTitleResId > 0) { mInitialTitle = null; 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 { mInitialTitleResId = -1; final String initialTitle = intent.getStringExtra(EXTRA_SHOW_FRAGMENT_TITLE); diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java index ad54c6b41fa..0555c75bcd6 100644 --- a/src/com/android/settings/Utils.java +++ b/src/com/android/settings/Utils.java @@ -590,16 +590,52 @@ public final class Utils { * @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, int titleResId, CharSequence title) { + Fragment resultTo, int resultRequestCode, int titleResId, + CharSequence title) { 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, - Fragment resultTo, int resultRequestCode, int titleResId, CharSequence title, - boolean isShortcut) { - Intent intent = onBuildStartFragmentIntent(context, fragmentName, args, titleResId, - title, isShortcut); + Fragment resultTo, int resultRequestCode, int titleResId, + CharSequence title, boolean isShortcut) { + Intent intent = onBuildStartFragmentIntent(context, fragmentName, args, + 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) { context.startActivity(intent); } else { @@ -608,9 +644,20 @@ public final class Utils { } public static void startWithFragmentAsUser(Context context, String fragmentName, Bundle args, - int titleResId, CharSequence title, boolean isShortcut, UserHandle userHandle) { - Intent intent = onBuildStartFragmentIntent(context, fragmentName, args, titleResId, - title, isShortcut); + int titleResId, CharSequence title, boolean isShortcut, + UserHandle userHandle) { + 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_CLEAR_TASK); context.startActivityAsUser(intent, userHandle); @@ -625,6 +672,7 @@ public final class Utils { * @param context The Context. * @param fragmentName The name of the fragment to display. * @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 title Optional title to show for this item. * @param isShortcut tell if this is a Launcher Shortcut or not @@ -632,11 +680,14 @@ public final class Utils { * fragment. */ 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.setClass(context, SubSettings.class); intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT, fragmentName); 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, title); intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_AS_SHORTCUT, isShortcut); diff --git a/src/com/android/settings/accounts/AccountSettings.java b/src/com/android/settings/accounts/AccountSettings.java index 1bfa611b200..ffcb3b8d20a 100644 --- a/src/com/android/settings/accounts/AccountSettings.java +++ b/src/com/android/settings/accounts/AccountSettings.java @@ -369,6 +369,8 @@ public class AccountSettings extends SettingsPreferenceFragment if (label == null) { continue; } + final String titleResPackageName = helper.getPackageForType(accountType); + final int titleResId = helper.getLabelIdForType(accountType); final Account[] accounts = AccountManager.get(getActivity()) .getAccountsByTypeAsUser(accountType, userHandle); @@ -382,7 +384,8 @@ public class AccountSettings extends SettingsPreferenceFragment fragmentArguments.putParcelable(EXTRA_USER, userHandle); accountTypePreferences.add(new AccountPreference(getActivity(), label, - AccountSyncSettings.class.getName(), fragmentArguments, + titleResPackageName, titleResId, AccountSyncSettings.class.getName(), + fragmentArguments, helper.getDrawableForType(getActivity(), accountType))); } else { final Bundle fragmentArguments = new Bundle(); @@ -392,7 +395,8 @@ public class AccountSettings extends SettingsPreferenceFragment fragmentArguments.putParcelable(EXTRA_USER, userHandle); accountTypePreferences.add(new AccountPreference(getActivity(), label, - ManageAccountsSettings.class.getName(), fragmentArguments, + titleResPackageName, titleResId, ManageAccountsSettings.class.getName(), + fragmentArguments, helper.getDrawableForType(getActivity(), accountType))); } helper.preloadDrawableForType(getActivity(), accountType); @@ -434,6 +438,17 @@ public class AccountSettings extends SettingsPreferenceFragment */ 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 * selected. @@ -447,10 +462,13 @@ public class AccountSettings extends SettingsPreferenceFragment */ private final Bundle mFragmentArguments; - public AccountPreference(Context context, CharSequence title, String fragment, - Bundle fragmentArguments, Drawable icon) { + public AccountPreference(Context context, CharSequence title, String titleResPackageName, + int titleResId, String fragment, Bundle fragmentArguments, + Drawable icon) { super(context); mTitle = title; + mTitleResPackageName = titleResPackageName; + mTitleResId = titleResId; mFragment = fragment; mFragmentArguments = fragmentArguments; setWidgetLayoutResource(R.layout.account_type_preference); @@ -464,8 +482,9 @@ public class AccountSettings extends SettingsPreferenceFragment @Override public boolean onPreferenceClick(Preference preference) { if (mFragment != null) { - Utils.startWithFragment( - getContext(), mFragment, mFragmentArguments, null, 0, 0, mTitle); + Utils.startWithFragment(getContext(), mFragment, mFragmentArguments, + null /* resultTo */, 0 /* resultRequestCode */, mTitleResPackageName, + mTitleResId, null /* title */); return true; } return false; diff --git a/src/com/android/settings/accounts/AuthenticatorHelper.java b/src/com/android/settings/accounts/AuthenticatorHelper.java index 3757d97c6a6..86e0da5e804 100644 --- a/src/com/android/settings/accounts/AuthenticatorHelper.java +++ b/src/com/android/settings/accounts/AuthenticatorHelper.java @@ -147,6 +147,33 @@ final public class AuthenticatorHelper extends BroadcastReceiver { 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() * and update any UI that depends on AuthenticatorDescriptions in onAuthDescriptionsUpdated().