Refactor SmsListPreference into AppListPreference.

This generalizes the pattern of needing to offer a selection among a
list of candidate applications.

Also move some reusable logic around querying PackageManager for icons
into AppListPreference, and remove some unnecessary update logic: the
preference will update itself when onPreferenceChange returns true,
and we can set the summary to '%s' to automatically use the entry as
the summary without having to reset it each time.

Change-Id: I007b9ed58359302f93b367a4b86354e93613bf3e
diff --git a/src/com/android/settings/WirelessSettings.java b/src/com/android/settings/WirelessSettings.java
index 59074e5..733d771 100644
--- a/src/com/android/settings/WirelessSettings.java
+++ b/src/com/android/settings/WirelessSettings.java
@@ -26,9 +26,7 @@
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
 import android.content.res.Resources;
-import android.graphics.drawable.Drawable;
 import android.net.ConnectivityManager;
 import android.net.NetworkInfo;
 import android.nfc.NfcAdapter;
@@ -85,7 +83,7 @@
     private static final int MANAGE_MOBILE_PLAN_DIALOG_ID = 1;
     private static final String SAVED_MANAGE_MOBILE_PLAN_MSG = "mManageMobilePlanMessage";
 
-    private SmsListPreference mSmsApplicationPreference;
+    private AppListPreference mSmsApplicationPreference;
 
     public WirelessSettings() {
         super(null);
@@ -174,23 +172,6 @@
         }
     }
 
-    private void updateSmsApplicationSetting() {
-        log("updateSmsApplicationSetting:");
-        ComponentName appName = SmsApplication.getDefaultSmsApplication(getActivity(), true);
-        if (appName != null) {
-            String packageName = appName.getPackageName();
-
-            CharSequence[] values = mSmsApplicationPreference.getEntryValues();
-            for (int i = 0; i < values.length; i++) {
-                if (packageName.contentEquals(values[i])) {
-                    mSmsApplicationPreference.setValueIndex(i);
-                    mSmsApplicationPreference.setSummary(mSmsApplicationPreference.getEntries()[i]);
-                    break;
-                }
-            }
-        }
-    }
-
     private void initSmsApplicationSetting() {
         log("initSmsApplicationSetting:");
         Collection<SmsApplicationData> smsApplications =
@@ -198,25 +179,18 @@
 
         // If the list is empty the dialog will be empty, but we will not crash.
         int count = smsApplications.size();
-        CharSequence[] entries = new CharSequence[count];
-        CharSequence[] entryValues = new CharSequence[count];
-        Drawable[] entryImages = new Drawable[count];
-
+        String[] packageNames = new String[count];
         int i = 0;
         for (SmsApplicationData smsApplicationData : smsApplications) {
-            entries[i] = smsApplicationData.mApplicationName;
-            entryValues[i] = smsApplicationData.mPackageName;
-            try {
-                entryImages[i] = mPm.getApplicationIcon(smsApplicationData.mPackageName);
-            } catch (NameNotFoundException e) {
-                entryImages[i] = mPm.getDefaultActivityIcon();
-            }
+            packageNames[i] = smsApplicationData.mPackageName;
             i++;
         }
-        mSmsApplicationPreference.setEntries(entries);
-        mSmsApplicationPreference.setEntryValues(entryValues);
-        mSmsApplicationPreference.setEntryDrawables(entryImages);
-        updateSmsApplicationSetting();
+        String defaultPackageName = null;
+        ComponentName appName = SmsApplication.getDefaultSmsApplication(getActivity(), true);
+        if (appName != null) {
+            defaultPackageName = appName.getPackageName();
+        }
+        mSmsApplicationPreference.setPackageNames(packageNames, defaultPackageName);
     }
 
     @Override
@@ -284,7 +258,7 @@
         mAirplaneModeEnabler = new AirplaneModeEnabler(activity, mAirplaneModePreference);
         mNfcEnabler = new NfcEnabler(activity, nfc, androidBeam);
 
-        mSmsApplicationPreference = (SmsListPreference) findPreference(KEY_SMS_APPLICATION);
+        mSmsApplicationPreference = (AppListPreference) findPreference(KEY_SMS_APPLICATION);
         mSmsApplicationPreference.setOnPreferenceChangeListener(this);
         initSmsApplicationSetting();
 
@@ -468,7 +442,6 @@
     public boolean onPreferenceChange(Preference preference, Object newValue) {
         if (preference == mSmsApplicationPreference && newValue != null) {
             SmsApplication.setDefaultApplication(newValue.toString(), getActivity());
-            updateSmsApplicationSetting();
             return true;
         }
         return false;