Java tutorial
/* * Copyright 2014 wada811 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package at.wada811.android.dialogfragments; import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.content.DialogInterface.OnCancelListener; import android.content.DialogInterface.OnDismissListener; import android.content.DialogInterface.OnKeyListener; import android.content.DialogInterface.OnShowListener; import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.util.Log; import android.view.KeyEvent; import at.wada811.android.dialogfragments.interfaces.DialogFragmentCallback; import at.wada811.android.dialogfragments.interfaces.DialogFragmentCallbackProvider; import at.wada811.android.dialogfragments.interfaces.DialogFragmentInterface; abstract class AbstractDialogFragment extends DialogFragment implements DialogFragmentInterface { /** * Value for {@code null} or not set. */ static final int VALUE_NULL = 0; /** * Value for {@code true}. */ static final int VALUE_TRUE = 1; /** * Value for {@code false}. */ static final int VALUE_FALSE = 2; protected static final String ICON_ID = "iconId"; protected static final String TITLE = "title"; protected static final String TITLE_ID = "titleId"; private static final String CANCELED_TOUCH_OUTSIDE = "isCanceledOnTouchOutside"; private static final String SHOW_LISTENER = "setOnShowListener"; private static final String CANCEL_LISTENER = "setOnCancelListener"; private static final String DISMISS_LISTENER = "setOnDismissListener"; private static final String KEY_LISTENER = "setOnKeyListener"; private static final String EXTRA = "extra"; protected int iconId; protected CharSequence title; protected int titleId; protected int isCanceledOnTouchOutside = VALUE_NULL; protected boolean useOnShowListener; protected boolean useOnCancelListener; protected boolean useOnDismissListener; protected boolean useOnKeyListener; Bundle extra; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState != null) { if (iconId == VALUE_NULL) { iconId = savedInstanceState.getInt(ICON_ID, VALUE_NULL); } title = savedInstanceState.getString(TITLE); titleId = savedInstanceState.getInt(TITLE_ID, VALUE_NULL); } if (iconId != VALUE_NULL) { setIcon(iconId); } if (title != null) { setTitle(title); } if (titleId != VALUE_NULL) { setTitle(titleId); } } @Override public abstract Dialog onCreateDialog(Bundle savedInstanceState); //============================================================ // _____ _ // | ___| __ __ _ __ _ _ __ ___ ___ _ __ | |_ // | |_ | '__/ _` |/ _` | '_ ` _ \ / _ \ '_ \| __| // | _|| | | (_| | (_| | | | | | | __/ | | | |_ // |_| |_| \__,_|\__, |_| |_| |_|\___|_| |_|\__| // |___/ // _ _ __ _ // | | (_)/ _| ___ ___ _ _ ___| | ___ // | | | | |_ / _ \/ __| | | |/ __| |/ _ \ // | |___| | _| __/ (__| |_| | (__| | __/ // |_____|_|_| \___|\___|\__, |\___|_|\___| // |___/ //============================================================ @Override public void onActivityCreated(Bundle savedInstanceState) { Dialog dialog = getDialog(); if (dialog == null) { throw new NullPointerException("Dialog is null! #onCreateDialog must not return null."); } super.onActivityCreated(savedInstanceState); if (savedInstanceState != null) { isCanceledOnTouchOutside = savedInstanceState.getInt(CANCELED_TOUCH_OUTSIDE, VALUE_NULL); useOnShowListener = savedInstanceState.getBoolean(SHOW_LISTENER); useOnCancelListener = savedInstanceState.getBoolean(CANCEL_LISTENER); useOnDismissListener = savedInstanceState.getBoolean(DISMISS_LISTENER); useOnKeyListener = savedInstanceState.getBoolean(KEY_LISTENER); extra = savedInstanceState.getBundle(EXTRA); } if (isCanceledOnTouchOutside != VALUE_NULL) { dialog.setCanceledOnTouchOutside(isCanceledOnTouchOutside == VALUE_TRUE); } if (useOnShowListener) { setOnShowListener(dialog); } if (useOnCancelListener) { setOnCancelListener(dialog); } if (useOnDismissListener) { setOnDismissListener(dialog); } if (useOnKeyListener) { setOnKeyListener(dialog); } } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); if (iconId != VALUE_NULL) { outState.putInt(ICON_ID, iconId); } if (title != null) { outState.putString(TITLE, (String) title); } if (titleId != VALUE_NULL) { outState.putInt(TITLE_ID, titleId); } if (isCanceledOnTouchOutside != VALUE_NULL) { outState.putInt(CANCELED_TOUCH_OUTSIDE, isCanceledOnTouchOutside); } if (extra != null) { outState.putBundle(EXTRA, extra); } } @Override public void onDestroy() { extra = null; super.onDestroy(); } @Override public void show(FragmentManager manager, String tag) { super.show(manager, tag); } @Override public int show(FragmentTransaction transaction, String tag) { return super.show(transaction, tag); } //============================================================ // ____ _ _ ____ _ _ _ // | _ \(_) __ _| | ___ __ _ / ___| ___| |_| |_(_)_ __ __ _ ___ // | | | | |/ _` | |/ _ \ / _` | \___ \ / _ \ __| __| | '_ \ / _` / __| // | |_| | | (_| | | (_) | (_| | ___) | __/ |_| |_| | | | | (_| \__ \ // |____/|_|\__,_|_|\___/ \__, | |____/ \___|\__|\__|_|_| |_|\__, |___/ // |___/ |___/ //============================================================ public void setIcon(int iconId) { this.iconId = iconId; if (getDialog() != null) { ((AlertDialog) getDialog()).setIcon(iconId); } } public void setTitle(CharSequence title) { this.title = title; if (getDialog() != null) { getDialog().setTitle(title); } } public void setTitle(int titleId) { this.titleId = titleId; if (getDialog() != null) { getDialog().setTitle(titleId); } } /** * Sets whether this dialog is canceled when touched outside the window's bounds. * If setting to true, the dialog is set to be cancelable if not already set. * * @param cancel Whether the dialog should be canceled when touched outside the window. */ public void setCanceledOnTouchOutside(boolean cancel) { isCanceledOnTouchOutside = cancel ? VALUE_TRUE : VALUE_FALSE; if (getDialog() != null) { getDialog().setCanceledOnTouchOutside(isCanceledOnTouchOutside == VALUE_TRUE); } } public boolean isCanceledOnTouchOutside() { return isCanceledOnTouchOutside == VALUE_TRUE; } /** * Sets a listener to be invoked when the dialog is shown. * * @param provider */ public void setOnShowListener(DialogFragmentCallbackProvider provider) { assertListenerBindable(provider); useOnShowListener = true; if (getDialog() != null) { setOnShowListener(getDialog()); } } /** * Sets the callback that will be called if the dialog is canceled. * * <p> * Even in a cancelable dialog, the dialog may be dismissed for reasons other than being * canceled or one of the supplied choices being selected. If you are interested in listening * for all cases where the dialog is dismissed and not just when it is canceled, see * {@link #setOnDismissListener}. * </p> * * @see #setCancelable(boolean) * @see #setOnDismissListener * * @param provider */ public void setOnCancelListener(DialogFragmentCallbackProvider provider) { assertListenerBindable(provider); useOnCancelListener = true; if (getDialog() != null) { setOnCancelListener(getDialog()); } } /** * Set a listener to be invoked when the dialog is dismissed. * * @param provider */ public void setOnDismissListener(DialogFragmentCallbackProvider provider) { assertListenerBindable(provider); useOnDismissListener = true; if (getDialog() != null) { setOnDismissListener(getDialog()); } } /** * Set a listener to be invoked when the key is pressed. * * @param provider */ public void setOnKeyListener(DialogFragmentCallbackProvider provider) { assertListenerBindable(provider); useOnKeyListener = true; if (getDialog() != null) { setOnKeyListener(getDialog()); } } protected void setOnShowListener(Dialog dialog) { useOnShowListener = true; dialog.setOnShowListener(new OnShowListener() { @Override public void onShow(DialogInterface dialog) { bindShowListener(); } }); } protected void setOnCancelListener(Dialog dialog) { useOnCancelListener = true; dialog.setOnCancelListener(new OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { bindCancelListener(); } }); } protected void setOnDismissListener(Dialog dialog) { useOnDismissListener = true; dialog.setOnDismissListener(new OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { bindDismissListener(); } }); } protected void setOnKeyListener(Dialog dialog) { useOnKeyListener = true; dialog.setOnKeyListener(new OnKeyListener() { @Override public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { return bindKeyListener(keyCode, event); } }); } protected void bindShowListener() { DialogFragmentCallback listener = getDialogFragmentCallback(); if (listener != null) { listener.onShow(this); } } protected void bindCancelListener() { DialogFragmentCallback listener = getDialogFragmentCallback(); if (listener != null) { listener.onCancel(this); } } protected void bindDismissListener() { DialogFragmentCallback listener = getDialogFragmentCallback(); if (listener != null) { listener.onDismiss(this); dismiss(); } } protected boolean bindKeyListener(int keyCode, KeyEvent event) { DialogFragmentCallback listener = getDialogFragmentCallback(); if (listener != null) { return listener.onKey(this, keyCode, event); } return false; } //============================================================ // ____ _ _ ___ _ __ // | _ \(_) __ _| | ___ __ _|_ _|_ __ | |_ ___ _ __ / _| __ _ ___ ___ // | | | | |/ _` | |/ _ \ / _` || || '_ \| __/ _ \ '__| |_ / _` |/ __/ _ \ // | |_| | | (_| | | (_) | (_| || || | | | || __/ | | _| (_| | (_| __/ // |____/|_|\__,_|_|\___/ \__, |___|_| |_|\__\___|_| |_| \__,_|\___\___| // |___/ //============================================================ /** * Set an extra object. This has no effect to dialog behavior. */ @Override public DialogFragmentInterface setExtra(Bundle extra) { this.extra = extra; return this; } /** * Get an extra object you set before. */ @Override public Bundle getExtra() { return extra; } static void assertListenerBindable(DialogFragmentCallbackProvider provider) { if (provider == null) { throw new IllegalArgumentException( DialogFragmentCallbackProvider.class.getSimpleName() + " must not be null."); } else if (provider instanceof Fragment) { // ok } else if (provider instanceof FragmentActivity) { // ok } else { throw new AssertionError(DialogFragmentCallbackProvider.class.getSimpleName() + " must not be implemented as anonymous inner class."); } } DialogFragmentCallback getDialogFragmentCallback() { DialogFragmentCallback listener = null; if (getActivity() == null) { Log.v(getTag(), "getActivity() returns null. Maybe the activity destroyed by rotation."); return null; } if (getParentFragment() instanceof DialogFragmentCallbackProvider) { Log.v(getTag(), "getParentFragment() instanceof DialogEventListenerPovider"); DialogFragmentCallbackProvider provider = (DialogFragmentCallbackProvider) getParentFragment(); listener = provider.getDialogFragmentCallback(); } else if (getActivity() instanceof DialogFragmentCallbackProvider) { Log.v(getTag(), "getActivity() instanceof DialogEventListenerPovider"); DialogFragmentCallbackProvider provider = (DialogFragmentCallbackProvider) getActivity(); listener = provider.getDialogFragmentCallback(); } else { Log.v(getTag(), "Not found instance of DialogEventListenerPovider"); } return listener; } }