123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206 |
- package com.afollestad.materialdialogs.prefs;
- import android.annotation.TargetApi;
- import android.app.Dialog;
- import android.content.Context;
- import android.content.DialogInterface;
- import android.content.res.TypedArray;
- import android.os.Build;
- import android.os.Bundle;
- import android.os.Parcel;
- import android.os.Parcelable;
- import android.preference.DialogPreference;
- import android.preference.PreferenceManager;
- import android.support.annotation.NonNull;
- import android.util.AttributeSet;
- import android.view.View;
- import com.afollestad.materialdialogs.MaterialDialog;
- import com.afollestad.materialdialogs.commons.R;
- import java.lang.reflect.Method;
- /**
- * @author Aidan Follestad (afollestad)
- */
- public class MaterialDialogPreference extends DialogPreference {
- private Context context;
- private MaterialDialog mDialog;
- @TargetApi(Build.VERSION_CODES.LOLLIPOP)
- public MaterialDialogPreference(Context context) {
- super(context);
- init(context, null, 0, 0);
- }
- public MaterialDialogPreference(Context context, AttributeSet attrs) {
- super(context, attrs);
- init(context, attrs, 0, 0);
- }
- public MaterialDialogPreference(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- init(context, attrs, defStyleAttr, 0);
- }
- @TargetApi(Build.VERSION_CODES.LOLLIPOP)
- public MaterialDialogPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
- super(context, attrs, defStyleAttr, defStyleRes);
- init(context, attrs, defStyleAttr, defStyleRes);
- }
- private void init(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
- this.context = context;
- final TypedArray a = context.obtainStyledAttributes(
- attrs, com.android.internal.R.styleable.Preference, defStyleAttr, defStyleRes);
- try {
- final int layoutResource = a.getResourceId(com.android.internal.R.styleable.Preference_layout, 0);
- if (layoutResource == 0)
- setLayoutResource(R.layout.md_preference_custom);
- } finally {
- a.recycle();
- }
- }
- @Override
- public Dialog getDialog() {
- return mDialog;
- }
- @Override
- protected void showDialog(Bundle state) {
- MaterialDialog.Builder builder = new MaterialDialog.Builder(context)
- .title(getDialogTitle())
- .content(getDialogMessage())
- .icon(getDialogIcon())
- .dismissListener(this)
- .callback(new MaterialDialog.ButtonCallback() {
- @Override
- public void onNeutral(MaterialDialog dialog) {
- onClick(dialog, DialogInterface.BUTTON_NEUTRAL);
- }
- @Override
- public void onNegative(MaterialDialog dialog) {
- onClick(dialog, DialogInterface.BUTTON_NEGATIVE);
- }
- @Override
- public void onPositive(MaterialDialog dialog) {
- onClick(dialog, DialogInterface.BUTTON_POSITIVE);
- }
- })
- .positiveText(getPositiveButtonText())
- .negativeText(getNegativeButtonText())
- .autoDismiss(true); // immediately close the dialog after selection
- final View contentView = onCreateDialogView();
- if (contentView != null) {
- onBindDialogView(contentView);
- builder.customView(contentView, false);
- } else {
- builder.content(getDialogMessage());
- }
- try {
- PreferenceManager pm = getPreferenceManager();
- Method method = pm.getClass().getDeclaredMethod(
- "registerOnActivityDestroyListener",
- PreferenceManager.OnActivityDestroyListener.class);
- method.setAccessible(true);
- method.invoke(pm, this);
- } catch (Exception ignored) {
- }
- mDialog = builder.build();
- if (state != null)
- mDialog.onRestoreInstanceState(state);
- mDialog.show();
- }
- @Override
- public void onDismiss(DialogInterface dialog) {
- super.onDismiss(dialog);
- try {
- PreferenceManager pm = getPreferenceManager();
- Method method = pm.getClass().getDeclaredMethod(
- "unregisterOnActivityDestroyListener",
- PreferenceManager.OnActivityDestroyListener.class);
- method.setAccessible(true);
- method.invoke(pm, this);
- } catch (Exception ignored) {
- }
- }
- @Override
- public void onActivityDestroy() {
- super.onActivityDestroy();
- if (mDialog != null && mDialog.isShowing())
- mDialog.dismiss();
- }
- @Override
- protected Parcelable onSaveInstanceState() {
- final Parcelable superState = super.onSaveInstanceState();
- Dialog dialog = getDialog();
- if (dialog == null || !dialog.isShowing()) {
- return superState;
- }
- final SavedState myState = new SavedState(superState);
- myState.isDialogShowing = true;
- myState.dialogBundle = dialog.onSaveInstanceState();
- return myState;
- }
- @Override
- protected void onRestoreInstanceState(Parcelable state) {
- if (state == null || !state.getClass().equals(SavedState.class)) {
- // Didn't save state for us in onSaveInstanceState
- super.onRestoreInstanceState(state);
- return;
- }
- SavedState myState = (SavedState) state;
- super.onRestoreInstanceState(myState.getSuperState());
- if (myState.isDialogShowing) {
- showDialog(myState.dialogBundle);
- }
- }
- // From DialogPreference
- private static class SavedState extends BaseSavedState {
- boolean isDialogShowing;
- Bundle dialogBundle;
- public SavedState(Parcel source) {
- super(source);
- isDialogShowing = source.readInt() == 1;
- dialogBundle = source.readBundle();
- }
- @Override
- public void writeToParcel(@NonNull Parcel dest, int flags) {
- super.writeToParcel(dest, flags);
- dest.writeInt(isDialogShowing ? 1 : 0);
- dest.writeBundle(dialogBundle);
- }
- public SavedState(Parcelable superState) {
- super(superState);
- }
- public static final Creator<SavedState> CREATOR =
- new Creator<SavedState>() {
- public SavedState createFromParcel(Parcel in) {
- return new SavedState(in);
- }
- public SavedState[] newArray(int size) {
- return new SavedState[size];
- }
- };
- }
- }
|