DialogFragment.java revision 327fbd2c8fa294b919475feb4c74a74ee1981e02
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.
39727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn *
40727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * <p>Topics covered here:
41727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * <ol>
42727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * <li><a href="#Lifecycle">Lifecycle</a>
43727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * <li><a href="#BasicDialog">Basic Dialog</a>
44727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * <li><a href="#AlertDialog">Alert Dialog</a>
45727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * <li><a href="#DialogOrEmbed">Selecting Between Dialog or Embedding</a>
46727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * </ol>
47727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn *
48727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * <a name="Lifecycle"></a>
49727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * <h3>Lifecycle</h3>
50727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn *
51727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * <p>DialogFragment does various things to keep the fragment's lifecycle
52727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * driving it, instead of the Dialog.  Note that dialogs are generally
53727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * autonomous entities -- they are their own window, receiving their own
54727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * input events, and often deciding on their own when to disappear (by
55727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * receiving a back key event or the user clicking on a button).
56727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn *
57727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * <p>DialogFragment needs to ensure that what is happening with the Fragment
58727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * and Dialog states remains consistent.  To do this, it watches for dismiss
59727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * events from the dialog and takes are of removing its own state when they
60727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * happen.  This means you should use {@link #show(FragmentManager, String)}
61727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * or {@link #show(FragmentTransaction, String)} to add an instance of
62727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * DialogFragment to your UI, as these keep track of how DialogFragment should
63727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * remove itself when the dialog is dismissed.
64727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn *
65727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * <a name="BasicDialog"></a>
66727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * <h3>Basic Dialog</h3>
67727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn *
68727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * <p>The simplest use of DialogFragment is as a floating container for the
69727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * fragment's view hierarchy.  A simple implementation may look like this:
70727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn *
71727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * {@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentDialog.java
72727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn *      dialog}
73727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn *
74727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * <p>An example showDialog() method on the Activity could be:
75727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn *
76727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * {@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentDialog.java
77727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn *      add_dialog}
78727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn *
79727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * <p>This removes any currently shown dialog, creates a new DialogFragment
80727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * with an argument, and shows it as a new state on the back stack.  When the
81727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * transaction is popped, the current DialogFragment and its Dialog will be
82727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * destroyed, and the previous one (if any) re-shown.  Note that in this case
83727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * DialogFragment will take care of popping the transaction of the Dialog
84727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * is dismissed separately from it.
85727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn *
86727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * <a name="AlertDialog"></a>
87727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * <h3>Alert Dialog</h3>
88727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn *
89727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * <p>Instead of (or in addition to) implementing {@link #onCreateView} to
90727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * generate the view hierarchy inside of a dialog, you may implement
91727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * {@link #onCreateDialog(Bundle)} to create your own custom Dialog object.
92727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn *
93727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * <p>This is most useful for creating an {@link AlertDialog}, allowing you
94727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * to display standard alerts to the user that are managed by a fragment.
95727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * A simple example implementation of this is:
96727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn *
97727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * {@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentAlertDialog.java
98727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn *      dialog}
99727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn *
100727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * <p>The activity creating this fragment may have the following methods to
101727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * show the dialog and receive results from it:
102727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn *
103727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * {@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentAlertDialog.java
104727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn *      activity}
105727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn *
106727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * <p>Note that in this case the fragment is not placed on the back stack, it
107727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * is just added as an indefinitely running fragment.  Because dialogs normally
108727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * are modal, this will still operate as a back stack, since the dialog will
109727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * capture user input until it is dismissed.  When it is dismissed, DialogFragment
110727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * will take care of removing itself from its fragment manager.
111727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn *
112727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * <a name="DialogOrEmbed"></a>
113727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * <h3>Selecting Between Dialog or Embedding</h3>
114727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn *
115727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * <p>A DialogFragment can still optionally be used as a normal fragment, if
116727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * desired.  This is useful if you have a fragment that in some cases should
117727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * be shown as a dialog and others embedded in a larger UI.  This behavior
118727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * will normally be automatically selected for you based on how you are using
119727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * the fragment, but can be customized with {@link #setShowsDialog(boolean)}.
120727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn *
121727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * <p>For example, here is a simple dialog fragment:
122727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn *
123727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * {@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentDialogOrActivity.java
124727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn *      dialog}
125727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn *
126727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * <p>An instance of this fragment can be created and shown as a dialog:
127727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn *
128727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * {@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentDialogOrActivity.java
129727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn *      show_dialog}
130727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn *
131727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * <p>It can also be added as content in a view hierarchy:
132727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn *
133727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn * {@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentDialogOrActivity.java
134727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn *      embed}
135dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn */
136dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackbornpublic class DialogFragment extends Fragment
137dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        implements DialogInterface.OnCancelListener, DialogInterface.OnDismissListener {
138dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
139dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    /**
14072dc780f57b4396b808032d592c41d35644a3277Jean-Baptiste Queru     * Style for {@link #setStyle(int, int)}: a basic,
141dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * normal dialog.
142dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     */
143dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public static final int STYLE_NORMAL = 0;
144dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
145dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    /**
14672dc780f57b4396b808032d592c41d35644a3277Jean-Baptiste Queru     * Style for {@link #setStyle(int, int)}: don't include
147dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * a title area.
148dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     */
149dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public static final int STYLE_NO_TITLE = 1;
150dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
151dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    /**
15272dc780f57b4396b808032d592c41d35644a3277Jean-Baptiste Queru     * Style for {@link #setStyle(int, int)}: don't draw
153dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * any frame at all; the view hierarchy returned by {@link #onCreateView}
154dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * is entirely responsible for drawing the dialog.
155dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     */
156dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public static final int STYLE_NO_FRAME = 2;
157dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
158dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    /**
15972dc780f57b4396b808032d592c41d35644a3277Jean-Baptiste Queru     * Style for {@link #setStyle(int, int)}: like
160dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * {@link #STYLE_NO_FRAME}, but also disables all input to the dialog.
161dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * The user can not touch it, and its window will not receive input focus.
162dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     */
163dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public static final int STYLE_NO_INPUT = 3;
164dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
165dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    private static final String SAVED_DIALOG_STATE_TAG = "android:savedDialogState";
166dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    private static final String SAVED_STYLE = "android:style";
167dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    private static final String SAVED_THEME = "android:theme";
168dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    private static final String SAVED_CANCELABLE = "android:cancelable";
169727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn    private static final String SAVED_SHOWS_DIALOG = "android:showsDialog";
170dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    private static final String SAVED_BACK_STACK_ID = "android:backStackId";
171dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
172dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    int mStyle = STYLE_NORMAL;
173dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    int mTheme = 0;
174dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    boolean mCancelable = true;
175727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn    boolean mShowsDialog = true;
176dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    int mBackStackId = -1;
177dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
178dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    Dialog mDialog;
179dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    boolean mDestroyed;
180def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn    boolean mRemoved;
181dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
182dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public DialogFragment() {
183dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
184dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
185dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    /**
186b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * Call to customize the basic appearance and behavior of the
187dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * fragment's dialog.  This can be used for some common dialog behaviors,
188dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * taking care of selecting flags, theme, and other options for you.  The
189dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * same effect can be achieve by manually setting Dialog and Window
190b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * attributes yourself.  Calling this after the fragment's Dialog is
191b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * created will have no effect.
192dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     *
193dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * @param style Selects a standard style: may be {@link #STYLE_NORMAL},
194dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * {@link #STYLE_NO_TITLE}, {@link #STYLE_NO_FRAME}, or
195dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * {@link #STYLE_NO_INPUT}.
196dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * @param theme Optional custom theme.  If 0, an appropriate theme (based
197dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * on the style) will be selected for you.
198dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     */
199b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    public void setStyle(int style, int theme) {
200dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        mStyle = style;
201dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        if (mStyle == STYLE_NO_FRAME || mStyle == STYLE_NO_INPUT) {
202c63806d852a550d82bbe6cadff8a2139d78ed559Adam Powell            mTheme = com.android.internal.R.style.Theme_Holo_Dialog_NoFrame;
203dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        }
204dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        if (theme != 0) {
205dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            mTheme = theme;
206dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        }
207dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
208dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
209dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    /**
210727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     * Display the dialog, adding the fragment to the given FragmentManager.  This
211dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * is a convenience for explicitly creating a transaction, adding the
212dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * fragment to it with the given tag, and committing it.  This does
213dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * <em>not</em> add the transaction to the back stack.  When the fragment
214dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * is dismissed, a new transaction will be executed to remove it from
215dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * the activity.
216727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     * @param manager The FragmentManager this fragment will be added to.
217dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * @param tag The tag for this fragment, as per
218dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * {@link FragmentTransaction#add(Fragment, String) FragmentTransaction.add}.
219dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     */
220727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn    public void show(FragmentManager manager, String tag) {
22148e7b458694acdf3a4fc58e62437f1dbc4f29d83Dianne Hackborn        FragmentTransaction ft = manager.beginTransaction();
222dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        ft.add(this, tag);
223dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        ft.commit();
224dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
225dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
226dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    /**
227727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     * Display the dialog, adding the fragment using an existing transaction
228727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     * and then committing the transaction.
229dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * @param transaction An existing transaction in which to add the fragment.
230dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * @param tag The tag for this fragment, as per
231dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * {@link FragmentTransaction#add(Fragment, String) FragmentTransaction.add}.
232dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * @return Returns the identifier of the committed transaction, as per
233dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * {@link FragmentTransaction#commit() FragmentTransaction.commit()}.
234dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     */
235727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn    public int show(FragmentTransaction transaction, String tag) {
236dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        transaction.add(this, tag);
237def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn        mRemoved = false;
238dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        mBackStackId = transaction.commit();
239dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        return mBackStackId;
240dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
241dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
242dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    /**
243dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * Dismiss the fragment and its dialog.  If the fragment was added to the
244dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * back stack, all back stack state up to and including this entry will
245dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * be popped.  Otherwise, a new transaction will be committed to remove
246dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * the fragment.
247dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     */
248dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public void dismiss() {
249ab36acb39941ce981dddda9f9cf4d2d23a56fd26Dianne Hackborn        dismissInternal(false);
250ab36acb39941ce981dddda9f9cf4d2d23a56fd26Dianne Hackborn    }
251ab36acb39941ce981dddda9f9cf4d2d23a56fd26Dianne Hackborn
252ab36acb39941ce981dddda9f9cf4d2d23a56fd26Dianne Hackborn    void dismissInternal(boolean allowStateLoss) {
253dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        if (mDialog != null) {
254dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            mDialog.dismiss();
255def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn            mDialog = null;
256dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        }
257def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn        mRemoved = true;
258dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        if (mBackStackId >= 0) {
259def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn            getFragmentManager().popBackStack(mBackStackId,
260def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn                    FragmentManager.POP_BACK_STACK_INCLUSIVE);
261dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            mBackStackId = -1;
262dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        } else {
26348e7b458694acdf3a4fc58e62437f1dbc4f29d83Dianne Hackborn            FragmentTransaction ft = getFragmentManager().beginTransaction();
264dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            ft.remove(this);
2656908cd154c5a2ed2e3b21d40f51952d45be69184Dianne Hackborn            if (allowStateLoss) {
2666908cd154c5a2ed2e3b21d40f51952d45be69184Dianne Hackborn                ft.commitAllowingStateLoss();
2676908cd154c5a2ed2e3b21d40f51952d45be69184Dianne Hackborn            } else {
2686908cd154c5a2ed2e3b21d40f51952d45be69184Dianne Hackborn                ft.commit();
2696908cd154c5a2ed2e3b21d40f51952d45be69184Dianne Hackborn            }
270dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        }
271dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
272ab36acb39941ce981dddda9f9cf4d2d23a56fd26Dianne Hackborn
273dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public Dialog getDialog() {
274dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        return mDialog;
275dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
276dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
277dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public int getTheme() {
278dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        return mTheme;
279dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
280dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
281727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn    /**
282727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     * Control whether the shown Dialog is cancelable.  Use this instead of
283727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     * directly calling {@link Dialog#setCancelable(boolean)
284727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     * Dialog.setCancelable(boolean)}, because DialogFragment needs to change
285727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     * its behavior based on this.
286727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     *
287727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     * @param cancelable If true, the dialog is cancelable.  The default
288727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     * is true.
289727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     */
290dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public void setCancelable(boolean cancelable) {
291dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        mCancelable = cancelable;
292dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        if (mDialog != null) mDialog.setCancelable(cancelable);
293dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
294dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
295727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn    /**
296727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     * Return the current value of {@link #setCancelable(boolean)}.
297727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     */
298327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn    public boolean isCancelable() {
299dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        return mCancelable;
300dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
301dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
302727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn    /**
303727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     * Controls whether this fragment should be shown in a dialog.  If not
304727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     * set, no Dialog will be created in {@link #onActivityCreated(Bundle)},
305727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     * and the fragment's view hierarchy will thus not be added to it.  This
306727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     * allows you to instead use it as a normal fragment (embedded inside of
307727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     * its activity).
308727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     *
309727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     * <p>This is normally set for you based on whether the fragment is
310727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     * associated with a container view ID passed to
311727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     * {@link FragmentTransaction#add(int, Fragment) FragmentTransaction.add(int, Fragment)}.
312727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     * If the fragment was added with a container, setShowsDialog will be
313727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     * initialized to false; otherwise, it will be true.
314727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     *
315727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     * @param showsDialog If true, the fragment will be displayed in a Dialog.
316727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     * If false, no Dialog will be created and the fragment's view hierarchly
317727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     * left undisturbed.
318727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     */
319727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn    public void setShowsDialog(boolean showsDialog) {
320727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn        mShowsDialog = showsDialog;
321727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn    }
322727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn
323727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn    /**
324727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     * Return the current value of {@link #setShowsDialog(boolean)}.
325727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     */
326727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn    public boolean getShowsDialog() {
327727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn        return mShowsDialog;
328727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn    }
329727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn
330dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    @Override
331dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public void onCreate(Bundle savedInstanceState) {
332dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        super.onCreate(savedInstanceState);
333727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn
334727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn        mShowsDialog = mContainerId == 0;
335727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn
336dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        if (savedInstanceState != null) {
337727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn            mStyle = savedInstanceState.getInt(SAVED_STYLE, STYLE_NORMAL);
338727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn            mTheme = savedInstanceState.getInt(SAVED_THEME, 0);
339727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn            mCancelable = savedInstanceState.getBoolean(SAVED_CANCELABLE, true);
340727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn            mShowsDialog = savedInstanceState.getBoolean(SAVED_SHOWS_DIALOG, mShowsDialog);
341727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn            mBackStackId = savedInstanceState.getInt(SAVED_BACK_STACK_ID, -1);
342dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        }
343dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
344dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
345dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public Dialog onCreateDialog(Bundle savedInstanceState) {
346dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        return new Dialog(getActivity(), getTheme());
347dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
348dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
349dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public void onCancel(DialogInterface dialog) {
350dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
351dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
352dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public void onDismiss(DialogInterface dialog) {
353def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn        if (!mRemoved) {
354ab36acb39941ce981dddda9f9cf4d2d23a56fd26Dianne Hackborn            // Note: we need to use allowStateLoss, because the dialog
355ab36acb39941ce981dddda9f9cf4d2d23a56fd26Dianne Hackborn            // dispatches this asynchronously so we can receive the call
356ab36acb39941ce981dddda9f9cf4d2d23a56fd26Dianne Hackborn            // after the activity is paused.  Worst case, when the user comes
357ab36acb39941ce981dddda9f9cf4d2d23a56fd26Dianne Hackborn            // back to the activity they see the dialog again.
358ab36acb39941ce981dddda9f9cf4d2d23a56fd26Dianne Hackborn            dismissInternal(true);
359def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn        }
360dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
361dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
362dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    @Override
363dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public void onActivityCreated(Bundle savedInstanceState) {
364dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        super.onActivityCreated(savedInstanceState);
365727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn
366727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn        if (!mShowsDialog) {
367727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn            return;
368727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn        }
369727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn
370dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        mDialog = onCreateDialog(savedInstanceState);
371dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        mDestroyed = false;
372dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        switch (mStyle) {
373dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            case STYLE_NO_INPUT:
374dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                mDialog.getWindow().addFlags(
375dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                        WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
376dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                        WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
377dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                // fall through...
378dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            case STYLE_NO_FRAME:
379dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            case STYLE_NO_TITLE:
380dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                mDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
381dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        }
382dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        View view = getView();
383dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        if (view != null) {
384dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            if (view.getParent() != null) {
385dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                throw new IllegalStateException("DialogFragment can not be attached to a container view");
386dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            }
387dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            mDialog.setContentView(view);
388dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        }
389dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        mDialog.setOwnerActivity(getActivity());
390dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        mDialog.setCancelable(mCancelable);
391dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        mDialog.setOnCancelListener(this);
392dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        mDialog.setOnDismissListener(this);
393dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        if (savedInstanceState != null) {
394dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            Bundle dialogState = savedInstanceState.getBundle(SAVED_DIALOG_STATE_TAG);
395dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            if (dialogState != null) {
396dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                mDialog.onRestoreInstanceState(dialogState);
397dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            }
398dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        }
399dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
400dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
401dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    @Override
402dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public void onStart() {
403dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        super.onStart();
404def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn        if (mDialog != null) {
405def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn            mRemoved = false;
406def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn            mDialog.show();
407def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn        }
408dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
409dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
410dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    @Override
411dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public void onSaveInstanceState(Bundle outState) {
412dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        super.onSaveInstanceState(outState);
413dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        if (mDialog != null) {
414dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            Bundle dialogState = mDialog.onSaveInstanceState();
415dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            if (dialogState != null) {
416dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                outState.putBundle(SAVED_DIALOG_STATE_TAG, dialogState);
417dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            }
418dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        }
419727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn        if (mStyle != STYLE_NORMAL) {
420727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn            outState.putInt(SAVED_STYLE, mStyle);
421727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn        }
422727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn        if (mTheme != 0) {
423727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn            outState.putInt(SAVED_THEME, mTheme);
424727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn        }
425727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn        if (!mCancelable) {
426727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn            outState.putBoolean(SAVED_CANCELABLE, mCancelable);
427727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn        }
428727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn        if (!mShowsDialog) {
429727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn            outState.putBoolean(SAVED_SHOWS_DIALOG, mShowsDialog);
430727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn        }
431727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn        if (mBackStackId != -1) {
432727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn            outState.putInt(SAVED_BACK_STACK_ID, mBackStackId);
433727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn        }
434dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
435dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
436dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    @Override
437dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public void onStop() {
438dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        super.onStop();
439def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn        if (mDialog != null) {
440def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn            mDialog.hide();
441def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn        }
442dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
443dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
444dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    /**
445def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn     * Remove dialog.
446dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     */
447dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    @Override
448dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public void onDestroyView() {
449dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        super.onDestroyView();
450dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        mDestroyed = true;
451def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn        if (mDialog != null) {
452def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn            // Set removed here because this dismissal is just to hide
453def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn            // the dialog -- we don't want this to cause the fragment to
454def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn            // actually be removed.
455def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn            mRemoved = true;
456def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn            mDialog.dismiss();
457def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn            mDialog = null;
458def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn        }
459dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
460dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn}
461