Modify account settings for better locale resolution

Bug: 16282173
Change-Id: I2ab861464cdbbb1c1b0a5a7231f960d8ed9e90c6
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index 37fcc87..dc5675c 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -184,6 +184,11 @@
      * 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 @@
         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 ad54c6b..0555c75 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -590,16 +590,52 @@
      * @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 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 @@
      * @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 @@
      * 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 1bfa611..ffcb3b8 100644
--- a/src/com/android/settings/accounts/AccountSettings.java
+++ b/src/com/android/settings/accounts/AccountSettings.java
@@ -369,6 +369,8 @@
             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 @@
                 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 @@
                 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);
@@ -435,6 +439,17 @@
         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.
          * @attr ref android.R.styleable#PreferenceHeader_fragment
@@ -447,10 +462,13 @@
          */
         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 @@
         @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 3757d97..86e0da5 100644
--- a/src/com/android/settings/accounts/AuthenticatorHelper.java
+++ b/src/com/android/settings/accounts/AuthenticatorHelper.java
@@ -148,6 +148,33 @@
     }
 
     /**
+     * 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().
      */