DialogFragment.java revision b7a2e4772220c4b41df1260cedaf8912f4b07547
1dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn/*
2dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * Copyright (C) 2010 The Android Open Source Project
3dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn *
4dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License");
5dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * you may not use this file except in compliance with the License.
6dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * You may obtain a copy of the License at
7dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn *
8dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn *      http://www.apache.org/licenses/LICENSE-2.0
9dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn *
10dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * Unless required by applicable law or agreed to in writing, software
11dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS,
12dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * See the License for the specific language governing permissions and
14dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * limitations under the License.
15dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn */
16dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
17dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackbornpackage android.app;
18dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
19dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackbornimport android.content.DialogInterface;
20dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackbornimport android.os.Bundle;
21dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackbornimport android.view.LayoutInflater;
22dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackbornimport android.view.View;
23dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackbornimport android.view.ViewGroup;
24dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackbornimport android.view.Window;
25dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackbornimport android.view.WindowManager;
26dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
27dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn/**
28dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * A fragment that displays a dialog window, floating on top of its
29dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * activity's window.  This fragment contains a Dialog object, which it
30dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * displays as appropriate based on the fragment's state.  Control of
31dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * the dialog (deciding when to show, hide, dismiss it) should be done through
32dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * the API here, not with direct calls on the dialog.
33dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn *
34dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * <p>Implementations should override this class and implement
35dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)} to supply the
36dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * content of the dialog.  Alternatively, they can override
37dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * {@link #onCreateDialog(Bundle)} to create an entirely custom dialog, such
38dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * as an AlertDialog, with its own content.
39dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn */
40dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackbornpublic class DialogFragment extends Fragment
41dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        implements DialogInterface.OnCancelListener, DialogInterface.OnDismissListener {
42dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
43dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    /**
44dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * Style for {@link #DialogFragment(int, int)} constructor: a basic,
45dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * normal dialog.
46dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     */
47dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public static final int STYLE_NORMAL = 0;
48dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
49dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    /**
50dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * Style for {@link #DialogFragment(int, int)} constructor: don't include
51dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * a title area.
52dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     */
53dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public static final int STYLE_NO_TITLE = 1;
54dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
55dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    /**
56dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * Style for {@link #DialogFragment(int, int)} constructor: don't draw
57dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * any frame at all; the view hierarchy returned by {@link #onCreateView}
58dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * is entirely responsible for drawing the dialog.
59dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     */
60dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public static final int STYLE_NO_FRAME = 2;
61dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
62dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    /**
63dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * Style for {@link #DialogFragment(int, int)} constructor: like
64dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * {@link #STYLE_NO_FRAME}, but also disables all input to the dialog.
65dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * The user can not touch it, and its window will not receive input focus.
66dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     */
67dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public static final int STYLE_NO_INPUT = 3;
68dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
69dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    private static final String SAVED_DIALOG_STATE_TAG = "android:savedDialogState";
70dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    private static final String SAVED_STYLE = "android:style";
71dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    private static final String SAVED_THEME = "android:theme";
72dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    private static final String SAVED_CANCELABLE = "android:cancelable";
73dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    private static final String SAVED_BACK_STACK_ID = "android:backStackId";
74dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
75dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    int mStyle = STYLE_NORMAL;
76dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    int mTheme = 0;
77dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    boolean mCancelable = true;
78dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    int mBackStackId = -1;
79dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
80dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    Dialog mDialog;
81dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    boolean mDestroyed;
82dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
83dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public DialogFragment() {
84dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
85dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
86dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    /**
87b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * Call to customize the basic appearance and behavior of the
88dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * fragment's dialog.  This can be used for some common dialog behaviors,
89dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * taking care of selecting flags, theme, and other options for you.  The
90dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * same effect can be achieve by manually setting Dialog and Window
91b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * attributes yourself.  Calling this after the fragment's Dialog is
92b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * created will have no effect.
93dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     *
94dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * @param style Selects a standard style: may be {@link #STYLE_NORMAL},
95dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * {@link #STYLE_NO_TITLE}, {@link #STYLE_NO_FRAME}, or
96dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * {@link #STYLE_NO_INPUT}.
97dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * @param theme Optional custom theme.  If 0, an appropriate theme (based
98dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * on the style) will be selected for you.
99dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     */
100b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    public void setStyle(int style, int theme) {
101dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        mStyle = style;
102dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        if (mStyle == STYLE_NO_FRAME || mStyle == STYLE_NO_INPUT) {
103dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            mTheme = android.R.style.Theme_Dialog_NoFrame;
104dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        }
105dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        if (theme != 0) {
106dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            mTheme = theme;
107dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        }
108dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
109dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
110dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    /**
111dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * Display the dialog, adding the fragment to the given activity.  This
112dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * is a convenience for explicitly creating a transaction, adding the
113dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * fragment to it with the given tag, and committing it.  This does
114dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * <em>not</em> add the transaction to the back stack.  When the fragment
115dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * is dismissed, a new transaction will be executed to remove it from
116dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * the activity.
117dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * @param activity The activity this fragment will be added to.
118dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * @param tag The tag for this fragment, as per
119dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * {@link FragmentTransaction#add(Fragment, String) FragmentTransaction.add}.
120dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     */
121dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public void show(Activity activity, String tag) {
122dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        FragmentTransaction ft = activity.openFragmentTransaction();
123dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        ft.add(this, tag);
124dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        ft.commit();
125dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
126dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
127dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    /**
128dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * Display the dialog, adding the fragment to the given activity using
129dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * an existing transaction and then committing the transaction.
130dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * @param activity The activity this fragment will be added to.
131dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * @param transaction An existing transaction in which to add the fragment.
132dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * @param tag The tag for this fragment, as per
133dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * {@link FragmentTransaction#add(Fragment, String) FragmentTransaction.add}.
134dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * @return Returns the identifier of the committed transaction, as per
135dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * {@link FragmentTransaction#commit() FragmentTransaction.commit()}.
136dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     */
137dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public int show(Activity activity, FragmentTransaction transaction, String tag) {
138dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        transaction.add(this, tag);
139dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        mBackStackId = transaction.commit();
140dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        return mBackStackId;
141dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
142dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
143dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    /**
144dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * Dismiss the fragment and its dialog.  If the fragment was added to the
145dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * back stack, all back stack state up to and including this entry will
146dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * be popped.  Otherwise, a new transaction will be committed to remove
147dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * the fragment.
148dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     */
149dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public void dismiss() {
150dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        if (mDialog != null) {
151dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            mDialog.dismiss();
152dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        }
153dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        if (mBackStackId >= 0) {
154dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            getActivity().popBackStack(mBackStackId, Activity.POP_BACK_STACK_INCLUSIVE);
155dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            mBackStackId = -1;
156dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        } else {
157dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            FragmentTransaction ft = getActivity().openFragmentTransaction();
158dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            ft.remove(this);
159dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            ft.commit();
160dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        }
161dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
162dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
163dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public Dialog getDialog() {
164dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        return mDialog;
165dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
166dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
167dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public int getTheme() {
168dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        return mTheme;
169dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
170dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
171dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public void setCancelable(boolean cancelable) {
172dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        mCancelable = cancelable;
173dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        if (mDialog != null) mDialog.setCancelable(cancelable);
174dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
175dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
176dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public boolean getCancelable() {
177dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        return mCancelable;
178dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
179dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
180dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    @Override
181dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public void onCreate(Bundle savedInstanceState) {
182dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        super.onCreate(savedInstanceState);
183dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        if (savedInstanceState != null) {
184dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            mStyle = savedInstanceState.getInt(SAVED_STYLE, mStyle);
185dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            mTheme = savedInstanceState.getInt(SAVED_THEME, mTheme);
186dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            mCancelable = savedInstanceState.getBoolean(SAVED_CANCELABLE, mCancelable);
187dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            mBackStackId = savedInstanceState.getInt(SAVED_BACK_STACK_ID, mBackStackId);
188dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        }
189dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
190dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
191dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public Dialog onCreateDialog(Bundle savedInstanceState) {
192dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        return new Dialog(getActivity(), getTheme());
193dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
194dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
195dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public void onCancel(DialogInterface dialog) {
196dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        if (mBackStackId >= 0) {
197dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            // If this fragment is part of the back stack, then cancelling
198dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            // the dialog means popping off the back stack.
199dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            getActivity().popBackStack(mBackStackId, Activity.POP_BACK_STACK_INCLUSIVE);
200dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            mBackStackId = -1;
201dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        }
202dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
203dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
204dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public void onDismiss(DialogInterface dialog) {
205dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
206dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
207dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    @Override
208dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public void onActivityCreated(Bundle savedInstanceState) {
209dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        super.onActivityCreated(savedInstanceState);
210dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        mDialog = onCreateDialog(savedInstanceState);
211dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        mDestroyed = false;
212dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        switch (mStyle) {
213dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            case STYLE_NO_INPUT:
214dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                mDialog.getWindow().addFlags(
215dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                        WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
216dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                        WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
217dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                // fall through...
218dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            case STYLE_NO_FRAME:
219dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            case STYLE_NO_TITLE:
220dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                mDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
221dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        }
222dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        View view = getView();
223dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        if (view != null) {
224dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            if (view.getParent() != null) {
225dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                throw new IllegalStateException("DialogFragment can not be attached to a container view");
226dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            }
227dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            mDialog.setContentView(view);
228dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        }
229dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        mDialog.setOwnerActivity(getActivity());
230dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        mDialog.setCancelable(mCancelable);
231dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        mDialog.setOnCancelListener(this);
232dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        mDialog.setOnDismissListener(this);
233dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        if (savedInstanceState != null) {
234dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            Bundle dialogState = savedInstanceState.getBundle(SAVED_DIALOG_STATE_TAG);
235dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            if (dialogState != null) {
236dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                mDialog.onRestoreInstanceState(dialogState);
237dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            }
238dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        }
239dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
240dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
241dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    @Override
242dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public void onStart() {
243dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        super.onStart();
244dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        mDialog.show();
245dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
246dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
247dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    @Override
248dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public void onSaveInstanceState(Bundle outState) {
249dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        super.onSaveInstanceState(outState);
250dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        if (mDialog != null) {
251dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            Bundle dialogState = mDialog.onSaveInstanceState();
252dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            if (dialogState != null) {
253dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                outState.putBundle(SAVED_DIALOG_STATE_TAG, dialogState);
254dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            }
255dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        }
256dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        outState.putInt(SAVED_STYLE, mStyle);
257dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        outState.putInt(SAVED_THEME, mTheme);
258dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        outState.putBoolean(SAVED_CANCELABLE, mCancelable);
259dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        outState.putInt(SAVED_BACK_STACK_ID, mBackStackId);
260dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
261dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
262dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    @Override
263dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public void onStop() {
264dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        super.onStop();
265dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        mDialog.hide();
266dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
267dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
268dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    /**
269dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * Detach from list view.
270dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     */
271dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    @Override
272dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public void onDestroyView() {
273dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        super.onDestroyView();
274dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        mDestroyed = true;
275dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        mDialog.dismiss();
276dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        mDialog = null;
277dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
278dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn}
279