Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0b350704 authored by Jeff Davidson's avatar Jeff Davidson Committed by Android (Google) Code Review
Browse files

Merge "Refactor SmsListPreference into AppListPreference."

parents 1502fba4 b9558d91
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -21,13 +21,13 @@
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:padding="6dip">
    <ImageView
        android:id="@+id/sms_image"
        android:id="@+id/app_image"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:padding="6dip"
    />
    <CheckedTextView
        android:id="@+id/sms_text"
        android:id="@+id/app_label"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:minHeight="?android:attr/listPreferredItemHeight"
+2 −1
Original line number Diff line number Diff line
@@ -23,9 +23,10 @@
        android:persistent="false"
        android:disableDependentsState="true" />

    <com.android.settings.SmsListPreference
    <com.android.settings.AppListPreference
        android:key="sms_application"
        android:title="@string/sms_application_title"
        android:summary="%s"
        android:persistent="false" />

    <CheckBoxPreference
+50 −18
Original line number Diff line number Diff line
@@ -19,6 +19,9 @@ package com.android.settings;
import android.app.Activity;
import android.app.AlertDialog.Builder;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.graphics.drawable.Drawable;
import android.preference.ListPreference;
import android.util.AttributeSet;
@@ -31,55 +34,84 @@ import android.widget.ImageView;
import android.widget.ListAdapter;

/**
 * Extends ListPreference to allow us to show the icons for the available SMS applications. We do
 * this because the names of SMS applications are very similar and the user may not be able to
 * determine what app they are selecting without an icon.
 * Extends ListPreference to allow us to show the icons for a given list of applications. We do this
 * because the names of applications are very similar and the user may not be able to determine what
 * app they are selecting without an icon.
 */
public class SmsListPreference extends ListPreference {
public class AppListPreference extends ListPreference {
    private Drawable[] mEntryDrawables;

    public class SmsArrayAdapter extends ArrayAdapter<CharSequence> {
    public class AppArrayAdapter extends ArrayAdapter<CharSequence> {
        private Drawable[] mImageDrawables = null;
        private int mSelectedIndex = 0;

        public SmsArrayAdapter(Context context, int textViewResourceId,
        public AppArrayAdapter(Context context, int textViewResourceId,
                CharSequence[] objects, Drawable[] imageDrawables, int selectedIndex) {
            super(context, textViewResourceId, objects);
            mSelectedIndex = selectedIndex;
            mImageDrawables = imageDrawables;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            LayoutInflater inflater = ((Activity)getContext()).getLayoutInflater();
            View view = inflater.inflate(R.layout.sms_preference_item, parent, false);
            CheckedTextView checkedTextView = (CheckedTextView)view.findViewById(R.id.sms_text);
            View view = inflater.inflate(R.layout.app_preference_item, parent, false);
            CheckedTextView checkedTextView = (CheckedTextView)view.findViewById(R.id.app_label);
            checkedTextView.setText(getItem(position));
            if (position == mSelectedIndex) {
                checkedTextView.setChecked(true);
            }
            ImageView imageView = (ImageView)view.findViewById(R.id.sms_image);
            ImageView imageView = (ImageView)view.findViewById(R.id.app_image);
            imageView.setImageDrawable(mImageDrawables[position]);
            return view;
        }
    }

    public SmsListPreference(Context context, AttributeSet attrs) {
    public AppListPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void setEntryDrawables(Drawable[] entries) {
        mEntryDrawables = entries;
    public void setPackageNames(String[] packageNames, String defaultPackageName) {
        // Look up all package names in PackageManager. Skip ones we can't find.
        int foundPackages = 0;
        PackageManager pm = getContext().getPackageManager();
        ApplicationInfo[] appInfos = new ApplicationInfo[packageNames.length];
        for (int i = 0; i < packageNames.length; i++) {
            try {
                appInfos[i] = pm.getApplicationInfo(packageNames[i], 0);
                foundPackages++;
            } catch (NameNotFoundException e) {
                // Leave appInfos[i] uninitialized; it will be skipped in the list.
            }
        }

    public Drawable[] getEntryDrawables() {
        return mEntryDrawables;
        // Show the label and icon for each application package.
        CharSequence[] applicationNames = new CharSequence[foundPackages];
        mEntryDrawables = new Drawable[foundPackages];
        int index = 0;
        int selectedIndex = -1;
        for (ApplicationInfo appInfo : appInfos) {
            if (appInfo != null) {
                applicationNames[index] = appInfo.loadLabel(pm);
                mEntryDrawables[index] = appInfo.loadIcon(pm);
                if (appInfo.packageName.contentEquals(defaultPackageName)) {
                    selectedIndex = index;
                }
                index++;
            }
        }
        setEntries(applicationNames);
        setEntryValues(packageNames);
        if (selectedIndex != -1) {
            setValueIndex(selectedIndex);
        }
    }

    @Override
    protected void onPrepareDialogBuilder(Builder builder) {
        int selectedIndex = findIndexOfValue(getValue());
        ListAdapter adapter = new SmsArrayAdapter(getContext(),
            R.layout.sms_preference_item, getEntries(), mEntryDrawables, selectedIndex);
        ListAdapter adapter = new AppArrayAdapter(getContext(),
            R.layout.app_preference_item, getEntries(), mEntryDrawables, selectedIndex);
        builder.setAdapter(adapter, this);
        super.onPrepareDialogBuilder(builder);
    }
+10 −37
Original line number Diff line number Diff line
@@ -26,9 +26,7 @@ import android.content.Context;
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 @@ public class WirelessSettings extends RestrictedSettingsFragment
    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 @@ public class WirelessSettings extends RestrictedSettingsFragment
        }
    }

    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 @@ public class WirelessSettings extends RestrictedSettingsFragment

        // 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 @@ public class WirelessSettings extends RestrictedSettingsFragment
        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 class WirelessSettings extends RestrictedSettingsFragment
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        if (preference == mSmsApplicationPreference && newValue != null) {
            SmsApplication.setDefaultApplication(newValue.toString(), getActivity());
            updateSmsApplicationSetting();
            return true;
        }
        return false;