Loading src/com/android/settings/CustomListPreference.java +80 −15 Original line number Diff line number Diff line Loading @@ -18,8 +18,13 @@ package com.android.settings; import android.app.AlertDialog; import android.app.Dialog; import android.app.DialogFragment; import android.app.Fragment; import android.app.FragmentTransaction; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.os.Bundle; import android.support.v14.preference.ListPreferenceDialogFragment; import android.support.v7.preference.ListPreference; Loading Loading @@ -50,6 +55,18 @@ public class CustomListPreference extends ListPreference { return true; } /** * Called when a user is about to choose the given value, to determine if we * should show a confirmation dialog. * * @param value the value the user is about to choose * @return the message to show in a confirmation dialog, or {@code null} to * not request confirmation */ protected CharSequence getConfirmationMessage(String value) { return null; } protected void onDialogStateRestored(Dialog dialog, Bundle savedInstanceState) { } Loading Loading @@ -82,9 +99,7 @@ public class CustomListPreference extends ListPreference { builder.setPositiveButton(R.string.okay, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { CustomListPreferenceDialogFragment.this.onClick(dialog, DialogInterface.BUTTON_POSITIVE); dialog.dismiss(); onItemChosen(); } }); } Loading Loading @@ -115,18 +130,11 @@ public class CustomListPreference extends ListPreference { protected DialogInterface.OnClickListener getOnItemClickListener() { return new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { setClickedDialogEntryIndex(which); if (getCustomizablePreference().isAutoClosePreference()) { /* * Clicking on an item simulates the positive button * click, and dismisses the dialog. */ CustomListPreferenceDialogFragment.this.onClick(dialog, DialogInterface.BUTTON_POSITIVE); dialog.dismiss(); onItemChosen(); } } }; Loading @@ -136,17 +144,74 @@ public class CustomListPreference extends ListPreference { mClickedDialogEntryIndex = which; } private String getValue() { final ListPreference preference = getCustomizablePreference(); if (mClickedDialogEntryIndex >= 0 && preference.getEntryValues() != null) { return preference.getEntryValues()[mClickedDialogEntryIndex].toString(); } else { return null; } } /** * Called when user has made a concrete item choice, but we might need * to make a quick detour to confirm that choice with a second dialog. */ protected void onItemChosen() { final CharSequence message = getCustomizablePreference() .getConfirmationMessage(getValue()); if (message != null) { final Fragment f = new ConfirmDialogFragment(); final Bundle args = new Bundle(); args.putCharSequence(Intent.EXTRA_TEXT, message); f.setArguments(args); f.setTargetFragment(CustomListPreferenceDialogFragment.this, 0); final FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.add(f, getTag() + "-Confirm"); ft.commitAllowingStateLoss(); } else { onItemConfirmed(); } } /** * Called when user has made a concrete item choice and we've fully * confirmed they want to move forward (if we took a detour above). */ protected void onItemConfirmed() { onClick(getDialog(), DialogInterface.BUTTON_POSITIVE); getDialog().dismiss(); } @Override public void onDialogClosed(boolean positiveResult) { getCustomizablePreference().onDialogClosed(positiveResult); final ListPreference preference = getCustomizablePreference(); if (positiveResult && mClickedDialogEntryIndex >= 0 && preference.getEntryValues() != null) { String value = preference.getEntryValues()[mClickedDialogEntryIndex].toString(); final String value = getValue(); if (positiveResult && value != null) { if (preference.callChangeListener(value)) { preference.setValue(value); } } } } public static class ConfirmDialogFragment extends DialogFragment { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { return new AlertDialog.Builder(getActivity()) .setMessage(getArguments().getCharSequence(Intent.EXTRA_TEXT)) .setPositiveButton(android.R.string.ok, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { final Fragment f = getTargetFragment(); if (f != null) { ((CustomListPreferenceDialogFragment) f).onItemConfirmed(); } } }) .setNegativeButton(android.R.string.cancel, null) .create(); } } } src/com/android/settings/Utils.java +10 −1 Original line number Diff line number Diff line Loading @@ -1150,5 +1150,14 @@ public final class Utils extends com.android.settingslib.Utils { } return false; } } public static boolean isPackageDirectBootAware(Context context, String packageName) { try { final ApplicationInfo ai = context.getPackageManager().getApplicationInfo( packageName, 0); return ai.isDirectBootAware() || ai.isPartiallyDirectBootAware(); } catch (NameNotFoundException ignored) { } return false; } } src/com/android/settings/applications/DefaultEmergencyPreference.java +9 −2 Original line number Diff line number Diff line Loading @@ -16,7 +16,6 @@ package com.android.settings.applications; import android.content.ComponentName; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; Loading @@ -30,9 +29,11 @@ import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.ArraySet; import android.util.AttributeSet; import com.android.internal.telephony.SmsApplication; import com.android.settings.AppListPreference; import com.android.settings.R; import com.android.settings.SelfAvailablePreference; import com.android.settings.Utils; import java.util.List; import java.util.Objects; Loading @@ -56,6 +57,12 @@ public class DefaultEmergencyPreference extends AppListPreference load(); } @Override protected CharSequence getConfirmationMessage(String value) { return Utils.isPackageDirectBootAware(getContext(), value) ? null : getContext().getText(R.string.direct_boot_unaware_dialog_message); } @Override protected boolean persistString(String value) { String previousValue = Settings.Secure.getString(mContentResolver, Loading src/com/android/settings/applications/DefaultPhonePreference.java +9 −4 Original line number Diff line number Diff line Loading @@ -24,22 +24,27 @@ import android.telecom.TelecomManager; import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.AttributeSet; import com.android.settings.AppListPreference; import com.android.settings.R; import com.android.settings.SelfAvailablePreference; import com.android.settings.Utils; import java.util.List; import java.util.Objects; public class DefaultPhonePreference extends AppListPreference implements SelfAvailablePreference { private final Context mContext; public DefaultPhonePreference(Context context, AttributeSet attrs) { super(context, attrs); mContext = context.getApplicationContext(); loadDialerApps(); } @Override protected CharSequence getConfirmationMessage(String value) { return Utils.isPackageDirectBootAware(getContext(), value) ? null : getContext().getText(R.string.direct_boot_unaware_dialog_message); } @Override protected boolean persistString(String value) { if (!TextUtils.isEmpty(value) && !Objects.equals(value, getDefaultPackage())) { Loading src/com/android/settings/applications/DefaultSmsPreference.java +9 −2 Original line number Diff line number Diff line Loading @@ -22,19 +22,20 @@ import android.os.UserManager; import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.AttributeSet; import com.android.internal.telephony.SmsApplication; import com.android.internal.telephony.SmsApplication.SmsApplicationData; import com.android.settings.AppListPreference; import com.android.settings.R; import com.android.settings.SelfAvailablePreference; import com.android.settings.Utils; import java.util.Collection; import java.util.Objects; public class DefaultSmsPreference extends AppListPreference implements SelfAvailablePreference { public DefaultSmsPreference(Context context, AttributeSet attrs) { super(context, attrs); loadSmsApps(); } Loading @@ -59,6 +60,12 @@ public class DefaultSmsPreference extends AppListPreference implements SelfAvail return null; } @Override protected CharSequence getConfirmationMessage(String value) { return Utils.isPackageDirectBootAware(getContext(), value) ? null : getContext().getText(R.string.direct_boot_unaware_dialog_message); } @Override protected boolean persistString(String value) { if (!TextUtils.isEmpty(value) && !Objects.equals(value, getDefaultPackage())) { Loading Loading
src/com/android/settings/CustomListPreference.java +80 −15 Original line number Diff line number Diff line Loading @@ -18,8 +18,13 @@ package com.android.settings; import android.app.AlertDialog; import android.app.Dialog; import android.app.DialogFragment; import android.app.Fragment; import android.app.FragmentTransaction; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.os.Bundle; import android.support.v14.preference.ListPreferenceDialogFragment; import android.support.v7.preference.ListPreference; Loading Loading @@ -50,6 +55,18 @@ public class CustomListPreference extends ListPreference { return true; } /** * Called when a user is about to choose the given value, to determine if we * should show a confirmation dialog. * * @param value the value the user is about to choose * @return the message to show in a confirmation dialog, or {@code null} to * not request confirmation */ protected CharSequence getConfirmationMessage(String value) { return null; } protected void onDialogStateRestored(Dialog dialog, Bundle savedInstanceState) { } Loading Loading @@ -82,9 +99,7 @@ public class CustomListPreference extends ListPreference { builder.setPositiveButton(R.string.okay, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { CustomListPreferenceDialogFragment.this.onClick(dialog, DialogInterface.BUTTON_POSITIVE); dialog.dismiss(); onItemChosen(); } }); } Loading Loading @@ -115,18 +130,11 @@ public class CustomListPreference extends ListPreference { protected DialogInterface.OnClickListener getOnItemClickListener() { return new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { setClickedDialogEntryIndex(which); if (getCustomizablePreference().isAutoClosePreference()) { /* * Clicking on an item simulates the positive button * click, and dismisses the dialog. */ CustomListPreferenceDialogFragment.this.onClick(dialog, DialogInterface.BUTTON_POSITIVE); dialog.dismiss(); onItemChosen(); } } }; Loading @@ -136,17 +144,74 @@ public class CustomListPreference extends ListPreference { mClickedDialogEntryIndex = which; } private String getValue() { final ListPreference preference = getCustomizablePreference(); if (mClickedDialogEntryIndex >= 0 && preference.getEntryValues() != null) { return preference.getEntryValues()[mClickedDialogEntryIndex].toString(); } else { return null; } } /** * Called when user has made a concrete item choice, but we might need * to make a quick detour to confirm that choice with a second dialog. */ protected void onItemChosen() { final CharSequence message = getCustomizablePreference() .getConfirmationMessage(getValue()); if (message != null) { final Fragment f = new ConfirmDialogFragment(); final Bundle args = new Bundle(); args.putCharSequence(Intent.EXTRA_TEXT, message); f.setArguments(args); f.setTargetFragment(CustomListPreferenceDialogFragment.this, 0); final FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.add(f, getTag() + "-Confirm"); ft.commitAllowingStateLoss(); } else { onItemConfirmed(); } } /** * Called when user has made a concrete item choice and we've fully * confirmed they want to move forward (if we took a detour above). */ protected void onItemConfirmed() { onClick(getDialog(), DialogInterface.BUTTON_POSITIVE); getDialog().dismiss(); } @Override public void onDialogClosed(boolean positiveResult) { getCustomizablePreference().onDialogClosed(positiveResult); final ListPreference preference = getCustomizablePreference(); if (positiveResult && mClickedDialogEntryIndex >= 0 && preference.getEntryValues() != null) { String value = preference.getEntryValues()[mClickedDialogEntryIndex].toString(); final String value = getValue(); if (positiveResult && value != null) { if (preference.callChangeListener(value)) { preference.setValue(value); } } } } public static class ConfirmDialogFragment extends DialogFragment { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { return new AlertDialog.Builder(getActivity()) .setMessage(getArguments().getCharSequence(Intent.EXTRA_TEXT)) .setPositiveButton(android.R.string.ok, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { final Fragment f = getTargetFragment(); if (f != null) { ((CustomListPreferenceDialogFragment) f).onItemConfirmed(); } } }) .setNegativeButton(android.R.string.cancel, null) .create(); } } }
src/com/android/settings/Utils.java +10 −1 Original line number Diff line number Diff line Loading @@ -1150,5 +1150,14 @@ public final class Utils extends com.android.settingslib.Utils { } return false; } } public static boolean isPackageDirectBootAware(Context context, String packageName) { try { final ApplicationInfo ai = context.getPackageManager().getApplicationInfo( packageName, 0); return ai.isDirectBootAware() || ai.isPartiallyDirectBootAware(); } catch (NameNotFoundException ignored) { } return false; } }
src/com/android/settings/applications/DefaultEmergencyPreference.java +9 −2 Original line number Diff line number Diff line Loading @@ -16,7 +16,6 @@ package com.android.settings.applications; import android.content.ComponentName; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; Loading @@ -30,9 +29,11 @@ import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.ArraySet; import android.util.AttributeSet; import com.android.internal.telephony.SmsApplication; import com.android.settings.AppListPreference; import com.android.settings.R; import com.android.settings.SelfAvailablePreference; import com.android.settings.Utils; import java.util.List; import java.util.Objects; Loading @@ -56,6 +57,12 @@ public class DefaultEmergencyPreference extends AppListPreference load(); } @Override protected CharSequence getConfirmationMessage(String value) { return Utils.isPackageDirectBootAware(getContext(), value) ? null : getContext().getText(R.string.direct_boot_unaware_dialog_message); } @Override protected boolean persistString(String value) { String previousValue = Settings.Secure.getString(mContentResolver, Loading
src/com/android/settings/applications/DefaultPhonePreference.java +9 −4 Original line number Diff line number Diff line Loading @@ -24,22 +24,27 @@ import android.telecom.TelecomManager; import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.AttributeSet; import com.android.settings.AppListPreference; import com.android.settings.R; import com.android.settings.SelfAvailablePreference; import com.android.settings.Utils; import java.util.List; import java.util.Objects; public class DefaultPhonePreference extends AppListPreference implements SelfAvailablePreference { private final Context mContext; public DefaultPhonePreference(Context context, AttributeSet attrs) { super(context, attrs); mContext = context.getApplicationContext(); loadDialerApps(); } @Override protected CharSequence getConfirmationMessage(String value) { return Utils.isPackageDirectBootAware(getContext(), value) ? null : getContext().getText(R.string.direct_boot_unaware_dialog_message); } @Override protected boolean persistString(String value) { if (!TextUtils.isEmpty(value) && !Objects.equals(value, getDefaultPackage())) { Loading
src/com/android/settings/applications/DefaultSmsPreference.java +9 −2 Original line number Diff line number Diff line Loading @@ -22,19 +22,20 @@ import android.os.UserManager; import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.AttributeSet; import com.android.internal.telephony.SmsApplication; import com.android.internal.telephony.SmsApplication.SmsApplicationData; import com.android.settings.AppListPreference; import com.android.settings.R; import com.android.settings.SelfAvailablePreference; import com.android.settings.Utils; import java.util.Collection; import java.util.Objects; public class DefaultSmsPreference extends AppListPreference implements SelfAvailablePreference { public DefaultSmsPreference(Context context, AttributeSet attrs) { super(context, attrs); loadSmsApps(); } Loading @@ -59,6 +60,12 @@ public class DefaultSmsPreference extends AppListPreference implements SelfAvail return null; } @Override protected CharSequence getConfirmationMessage(String value) { return Utils.isPackageDirectBootAware(getContext(), value) ? null : getContext().getText(R.string.direct_boot_unaware_dialog_message); } @Override protected boolean persistString(String value) { if (!TextUtils.isEmpty(value) && !Objects.equals(value, getDefaultPackage())) { Loading