DialogFragment.java revision def1537e9e8d0dd190cde5310ddae8b921088c9b
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    /**
4472dc780f57b4396b808032d592c41d35644a3277Jean-Baptiste Queru     * Style for {@link #setStyle(int, int)}: a basic,
45dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * normal dialog.
46dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     */
47dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public static final int STYLE_NORMAL = 0;
48dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
49dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    /**
5072dc780f57b4396b808032d592c41d35644a3277Jean-Baptiste Queru     * Style for {@link #setStyle(int, int)}: don't include
51dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * a title area.
52dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     */
53dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public static final int STYLE_NO_TITLE = 1;
54dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
55dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    /**
5672dc780f57b4396b808032d592c41d35644a3277Jean-Baptiste Queru     * Style for {@link #setStyle(int, int)}: 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    /**
6372dc780f57b4396b808032d592c41d35644a3277Jean-Baptiste Queru     * Style for {@link #setStyle(int, int)}: 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;
82def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn    boolean mRemoved;
83dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
84dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public DialogFragment() {
85dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
86dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
87dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    /**
88b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * Call to customize the basic appearance and behavior of the
89dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * fragment's dialog.  This can be used for some common dialog behaviors,
90dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * taking care of selecting flags, theme, and other options for you.  The
91dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * same effect can be achieve by manually setting Dialog and Window
92b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * attributes yourself.  Calling this after the fragment's Dialog is
93b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * created will have no effect.
94dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     *
95dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * @param style Selects a standard style: may be {@link #STYLE_NORMAL},
96dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * {@link #STYLE_NO_TITLE}, {@link #STYLE_NO_FRAME}, or
97dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * {@link #STYLE_NO_INPUT}.
98dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * @param theme Optional custom theme.  If 0, an appropriate theme (based
99dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * on the style) will be selected for you.
100dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     */
101b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    public void setStyle(int style, int theme) {
102dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        mStyle = style;
103dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        if (mStyle == STYLE_NO_FRAME || mStyle == STYLE_NO_INPUT) {
104dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            mTheme = android.R.style.Theme_Dialog_NoFrame;
105dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        }
106dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        if (theme != 0) {
107dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            mTheme = theme;
108dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        }
109dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
110dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
111dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    /**
112dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * Display the dialog, adding the fragment to the given activity.  This
113dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * is a convenience for explicitly creating a transaction, adding the
114dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * fragment to it with the given tag, and committing it.  This does
115dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * <em>not</em> add the transaction to the back stack.  When the fragment
116dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * is dismissed, a new transaction will be executed to remove it from
117dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * the activity.
118dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * @param activity The activity this fragment will be added to.
119dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * @param tag The tag for this fragment, as per
120dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * {@link FragmentTransaction#add(Fragment, String) FragmentTransaction.add}.
121dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     */
122dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public void show(Activity activity, String tag) {
123dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        FragmentTransaction ft = activity.openFragmentTransaction();
124dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        ft.add(this, tag);
125dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        ft.commit();
126dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
127dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
128dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    /**
129dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * Display the dialog, adding the fragment to the given activity using
130dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * an existing transaction and then committing the transaction.
131dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * @param activity The activity this fragment will be added to.
132dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * @param transaction An existing transaction in which to add the fragment.
133dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * @param tag The tag for this fragment, as per
134dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * {@link FragmentTransaction#add(Fragment, String) FragmentTransaction.add}.
135dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * @return Returns the identifier of the committed transaction, as per
136dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * {@link FragmentTransaction#commit() FragmentTransaction.commit()}.
137dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     */
138dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public int show(Activity activity, FragmentTransaction transaction, String tag) {
139dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        transaction.add(this, tag);
140def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn        mRemoved = false;
141dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        mBackStackId = transaction.commit();
142dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        return mBackStackId;
143dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
144dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
145dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    /**
146dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * Dismiss the fragment and its dialog.  If the fragment was added to the
147dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * back stack, all back stack state up to and including this entry will
148dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * be popped.  Otherwise, a new transaction will be committed to remove
149dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * the fragment.
150dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     */
151dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public void dismiss() {
152dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        if (mDialog != null) {
153dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            mDialog.dismiss();
154def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn            mDialog = null;
155dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        }
156def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn        mRemoved = true;
157dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        if (mBackStackId >= 0) {
158def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn            getFragmentManager().popBackStack(mBackStackId,
159def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn                    FragmentManager.POP_BACK_STACK_INCLUSIVE);
160dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            mBackStackId = -1;
161dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        } else {
162def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn            FragmentTransaction ft = getFragmentManager().openTransaction();
163dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            ft.remove(this);
164dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            ft.commit();
165dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        }
166dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
167dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
168dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public Dialog getDialog() {
169dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        return mDialog;
170dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
171dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
172dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public int getTheme() {
173dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        return mTheme;
174dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
175dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
176dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public void setCancelable(boolean cancelable) {
177dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        mCancelable = cancelable;
178dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        if (mDialog != null) mDialog.setCancelable(cancelable);
179dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
180dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
181dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public boolean getCancelable() {
182dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        return mCancelable;
183dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
184dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
185dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    @Override
186dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public void onCreate(Bundle savedInstanceState) {
187dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        super.onCreate(savedInstanceState);
188dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        if (savedInstanceState != null) {
189dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            mStyle = savedInstanceState.getInt(SAVED_STYLE, mStyle);
190dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            mTheme = savedInstanceState.getInt(SAVED_THEME, mTheme);
191dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            mCancelable = savedInstanceState.getBoolean(SAVED_CANCELABLE, mCancelable);
192dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            mBackStackId = savedInstanceState.getInt(SAVED_BACK_STACK_ID, mBackStackId);
193dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        }
194dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
195dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
196dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public Dialog onCreateDialog(Bundle savedInstanceState) {
197dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        return new Dialog(getActivity(), getTheme());
198dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
199dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
200dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public void onCancel(DialogInterface dialog) {
201dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
202dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
203dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public void onDismiss(DialogInterface dialog) {
204def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn        if (!mRemoved) {
205def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn            dismiss();
206def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn        }
207dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
208dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
209dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    @Override
210dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public void onActivityCreated(Bundle savedInstanceState) {
211dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        super.onActivityCreated(savedInstanceState);
212dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        mDialog = onCreateDialog(savedInstanceState);
213dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        mDestroyed = false;
214dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        switch (mStyle) {
215dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            case STYLE_NO_INPUT:
216dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                mDialog.getWindow().addFlags(
217dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                        WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
218dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                        WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
219dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                // fall through...
220dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            case STYLE_NO_FRAME:
221dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            case STYLE_NO_TITLE:
222dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                mDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
223dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        }
224dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        View view = getView();
225dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        if (view != null) {
226dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            if (view.getParent() != null) {
227dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                throw new IllegalStateException("DialogFragment can not be attached to a container view");
228dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            }
229dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            mDialog.setContentView(view);
230dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        }
231dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        mDialog.setOwnerActivity(getActivity());
232dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        mDialog.setCancelable(mCancelable);
233dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        mDialog.setOnCancelListener(this);
234dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        mDialog.setOnDismissListener(this);
235dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        if (savedInstanceState != null) {
236dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            Bundle dialogState = savedInstanceState.getBundle(SAVED_DIALOG_STATE_TAG);
237dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            if (dialogState != null) {
238dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                mDialog.onRestoreInstanceState(dialogState);
239dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            }
240dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        }
241dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
242dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
243dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    @Override
244dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public void onStart() {
245dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        super.onStart();
246def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn        if (mDialog != null) {
247def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn            mRemoved = false;
248def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn            mDialog.show();
249def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn        }
250dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
251dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
252dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    @Override
253dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public void onSaveInstanceState(Bundle outState) {
254dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        super.onSaveInstanceState(outState);
255dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        if (mDialog != null) {
256dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            Bundle dialogState = mDialog.onSaveInstanceState();
257dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            if (dialogState != null) {
258dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                outState.putBundle(SAVED_DIALOG_STATE_TAG, dialogState);
259dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            }
260dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        }
261dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        outState.putInt(SAVED_STYLE, mStyle);
262dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        outState.putInt(SAVED_THEME, mTheme);
263dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        outState.putBoolean(SAVED_CANCELABLE, mCancelable);
264dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        outState.putInt(SAVED_BACK_STACK_ID, mBackStackId);
265dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
266dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
267dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    @Override
268dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public void onStop() {
269dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        super.onStop();
270def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn        if (mDialog != null) {
271def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn            mDialog.hide();
272def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn        }
273dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
274dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
275dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    /**
276def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn     * Remove dialog.
277dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     */
278dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    @Override
279dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public void onDestroyView() {
280dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        super.onDestroyView();
281dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        mDestroyed = true;
282def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn        if (mDialog != null) {
283def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn            // Set removed here because this dismissal is just to hide
284def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn            // the dialog -- we don't want this to cause the fragment to
285def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn            // actually be removed.
286def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn            mRemoved = true;
287def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn            mDialog.dismiss();
288def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn            mDialog = null;
289def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn        }
290dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
291dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn}
292