Activity.java revision f76a50ce8fdc6aea22cabc77b2977a1a15a79630
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.app;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
196e34636749217654f43221885afb7a29bb5ca96aAdam Powellimport com.android.internal.app.ActionBarImpl;
206e34636749217654f43221885afb7a29bb5ca96aAdam Powellimport com.android.internal.policy.PolicyManager;
2175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
22c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackbornimport android.content.ComponentCallbacks2;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentResolver;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
266ed50de6d1e5e27d11304cce226fefeee3105bd7Jason parksimport android.content.CursorLoader;
271ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapuimport android.content.IIntentSender;
2833b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powellimport android.content.Intent;
29fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackbornimport android.content.IntentSender;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.SharedPreferences;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ActivityInfo;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Configuration;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources;
34ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackbornimport android.content.res.TypedArray;
3588ab69780f58e4b32d497266b2ad646a4d74827bAdam Powellimport android.content.res.Resources.Theme;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.Cursor;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Bitmap;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Canvas;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.media.AudioManager;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri;
428d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackbornimport android.os.Build;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder;
4630c9bd89556137157b2f686637ece961454ccabeDianne Hackbornimport android.os.Looper;
47b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackbornimport android.os.Parcelable;
4875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.os.RemoteException;
49758035757f11a085a12b54daa9467f1d6bb251efBrad Fitzpatrickimport android.os.StrictMode;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.Selection;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.SpannableStringBuilder;
5275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.text.TextUtils;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.method.TextKeyListener;
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.EventLog;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseArray;
5888ab69780f58e4b32d497266b2ad646a4d74827bAdam Powellimport android.util.TypedValue;
596e34636749217654f43221885afb7a29bb5ca96aAdam Powellimport android.view.ActionMode;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ContextMenu;
616e34636749217654f43221885afb7a29bb5ca96aAdam Powellimport android.view.ContextMenu.ContextMenuInfo;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ContextThemeWrapper;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyEvent;
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.LayoutInflater;
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Menu;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.MenuInflater;
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.MenuItem;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.MotionEvent;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View;
70ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackbornimport android.view.WindowManagerImpl;
716e34636749217654f43221885afb7a29bb5ca96aAdam Powellimport android.view.View.OnCreateContextMenuListener;
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewGroup;
736e34636749217654f43221885afb7a29bb5ca96aAdam Powellimport android.view.ViewGroup.LayoutParams;
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewManager;
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Window;
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManager;
7775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.view.accessibility.AccessibilityEvent;
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.AdapterView;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
80625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackbornimport java.io.FileDescriptor;
81625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackbornimport java.io.PrintWriter;
826e34636749217654f43221885afb7a29bb5ca96aAdam Powellimport java.util.ArrayList;
836e34636749217654f43221885afb7a29bb5ca96aAdam Powellimport java.util.HashMap;
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * An activity is a single, focused thing that the user can do.  Almost all
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activities interact with the user, so the Activity class takes care of
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * creating a window for you in which you can place your UI with
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #setContentView}.  While activities are often presented to the user
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as full-screen windows, they can also be used in other ways: as floating
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * windows (via a theme with {@link android.R.attr#windowIsFloating} set)
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or embedded inside of another activity (using {@link ActivityGroup}).
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * There are two methods almost all subclasses of Activity will implement:
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul>
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> {@link #onCreate} is where you initialize your activity.  Most
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     importantly, here you will usually call {@link #setContentView(int)}
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     with a layout resource defining your UI, and using {@link #findViewById}
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     to retrieve the widgets in that UI that you need to interact with
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     programmatically.
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> {@link #onPause} is where you deal with the user leaving your
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     activity.  Most importantly, any changes made by the user should at this
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     point be committed (usually to the
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     {@link android.content.ContentProvider} holding the data).
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>To be of use with {@link android.content.Context#startActivity Context.startActivity()}, all
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity classes must have a corresponding
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.styleable#AndroidManifestActivity &lt;activity&gt;}
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * declaration in their package's <code>AndroidManifest.xml</code>.</p>
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Topics covered here:
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ol>
116291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <li><a href="#Fragments">Fragments</a>
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#ActivityLifecycle">Activity Lifecycle</a>
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#ConfigurationChanges">Configuration Changes</a>
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#StartingActivities">Starting Activities and Getting Results</a>
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#SavingPersistentState">Saving Persistent State</a>
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#Permissions">Permissions</a>
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#ProcessLifecycle">Process Lifecycle</a>
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ol>
124b54e7a3d9f60ac605f404f9eb3c5e92ca51bbd23Joe Fernandez *
125b54e7a3d9f60ac605f404f9eb3c5e92ca51bbd23Joe Fernandez * <div class="special reference">
126b54e7a3d9f60ac605f404f9eb3c5e92ca51bbd23Joe Fernandez * <h3>Developer Guides</h3>
127b54e7a3d9f60ac605f404f9eb3c5e92ca51bbd23Joe Fernandez * <p>The Activity class is an important part of an application's overall lifecycle,
128b54e7a3d9f60ac605f404f9eb3c5e92ca51bbd23Joe Fernandez * and the way activities are launched and put together is a fundamental
129b54e7a3d9f60ac605f404f9eb3c5e92ca51bbd23Joe Fernandez * part of the platform's application model. For a detailed perspective on the structure of an
130b54e7a3d9f60ac605f404f9eb3c5e92ca51bbd23Joe Fernandez * Android application and how activities behave, please read the
131b54e7a3d9f60ac605f404f9eb3c5e92ca51bbd23Joe Fernandez * <a href="{@docRoot}guide/topics/fundamentals.html">Application Fundamentals</a> and
132b54e7a3d9f60ac605f404f9eb3c5e92ca51bbd23Joe Fernandez * <a href="{@docRoot}guide/topics/fundamentals/tasks-and-back-stack.html">Tasks and Back Stack</a>
133b54e7a3d9f60ac605f404f9eb3c5e92ca51bbd23Joe Fernandez * developer guides.</p>
134b54e7a3d9f60ac605f404f9eb3c5e92ca51bbd23Joe Fernandez *
135b54e7a3d9f60ac605f404f9eb3c5e92ca51bbd23Joe Fernandez * <p>You can also find a detailed discussion about how to create activities in the
136b54e7a3d9f60ac605f404f9eb3c5e92ca51bbd23Joe Fernandez * <a href="{@docRoot}guide/topics/fundamentals/activities.html">Activities</a>
137b54e7a3d9f60ac605f404f9eb3c5e92ca51bbd23Joe Fernandez * developer guide.</p>
138b54e7a3d9f60ac605f404f9eb3c5e92ca51bbd23Joe Fernandez * </div>
139b54e7a3d9f60ac605f404f9eb3c5e92ca51bbd23Joe Fernandez *
140291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <a name="Fragments"></a>
141291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <h3>Fragments</h3>
142291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn *
143291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <p>Starting with {@link android.os.Build.VERSION_CODES#HONEYCOMB}, Activity
144291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * implementations can make use of the {@link Fragment} class to better
145291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * modularize their code, build more sophisticated user interfaces for larger
146291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * screens, and help scale their application between small and large screens.
147291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn *
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="ActivityLifecycle"></a>
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Activity Lifecycle</h3>
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Activities in the system are managed as an <em>activity stack</em>.
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * When a new activity is started, it is placed on the top of the stack
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and becomes the running activity -- the previous activity always remains
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * below it in the stack, and will not come to the foreground again until
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the new activity exits.</p>
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>An activity has essentially four states:</p>
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul>
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> If an activity in the foreground of the screen (at the top of
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         the stack),
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         it is <em>active</em> or  <em>running</em>. </li>
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li>If an activity has lost focus but is still visible (that is, a new non-full-sized
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         or transparent activity has focus on top of your activity), it
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         is <em>paused</em>. A paused activity is completely alive (it
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         maintains all state and member information and remains attached to
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         the window manager), but can be killed by the system in extreme
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         low memory situations.
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li>If an activity is completely obscured by another activity,
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         it is <em>stopped</em>. It still retains all state and member information,
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         however, it is no longer visible to the user so its window is hidden
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         and it will often be killed by the system when memory is needed
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         elsewhere.</li>
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li>If an activity is paused or stopped, the system can drop the activity
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         from memory by either asking it to finish, or simply killing its
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         process.  When it is displayed again to the user, it must be
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         completely restarted and restored to its previous state.</li>
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The following diagram shows the important state paths of an Activity.
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The square rectangles represent callback methods you can implement to
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * perform operations when the Activity moves between states.  The colored
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ovals are major states the Activity can be in.</p>
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><img src="../../../images/activity_lifecycle.png"
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      alt="State diagram for an Android Activity Lifecycle." border="0" /></p>
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>There are three key loops you may be interested in monitoring within your
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity:
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul>
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>The <b>entire lifetime</b> of an activity happens between the first call
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to {@link android.app.Activity#onCreate} through to a single final call
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to {@link android.app.Activity#onDestroy}.  An activity will do all setup
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of "global" state in onCreate(), and release all remaining resources in
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * onDestroy().  For example, if it has a thread running in the background
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to download data from the network, it may create that thread in onCreate()
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and then stop the thread in onDestroy().
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>The <b>visible lifetime</b> of an activity happens between a call to
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#onStart} until a corresponding call to
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#onStop}.  During this time the user can see the
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity on-screen, though it may not be in the foreground and interacting
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with the user.  Between these two methods you can maintain resources that
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are needed to show the activity to the user.  For example, you can register
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a {@link android.content.BroadcastReceiver} in onStart() to monitor for changes
206f76a50ce8fdc6aea22cabc77b2977a1a15a79630Ken Wakasa * that impact your UI, and unregister it in onStop() when the user no
207f76a50ce8fdc6aea22cabc77b2977a1a15a79630Ken Wakasa * longer sees what you are displaying.  The onStart() and onStop() methods
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can be called multiple times, as the activity becomes visible and hidden
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to the user.
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>The <b>foreground lifetime</b> of an activity happens between a call to
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#onResume} until a corresponding call to
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#onPause}.  During this time the activity is
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in front of all other activities and interacting with the user.  An activity
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can frequently go between the resumed and paused states -- for example when
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the device goes to sleep, when an activity result is delivered, when a new
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * intent is delivered -- so the code in these methods should be fairly
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * lightweight.
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The entire lifecycle of an activity is defined by the following
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Activity methods.  All of these are hooks that you can override
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to do appropriate work when the activity changes state.  All
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activities will implement {@link android.app.Activity#onCreate}
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to do their initial setup; many will also implement
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#onPause} to commit changes to data and
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * otherwise prepare to stop interacting with the user.  You should always
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * call up to your superclass when implementing these methods.</p>
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p>
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint">
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * public class Activity extends ApplicationContext {
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onCreate(Bundle savedInstanceState);
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onStart();
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onRestart();
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onResume();
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onPause();
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onStop();
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onDestroy();
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * }
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </pre>
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>In general the movement through an activity's lifecycle looks like
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this:</p>
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <table border="2" width="85%" align="center" frame="hsides" rules="rows">
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <colgroup align="left" span="3" />
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <colgroup align="left" />
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <colgroup align="center" />
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <colgroup align="center" />
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <thead>
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th colspan="3">Method</th> <th>Description</th> <th>Killable?</th> <th>Next</th></tr>
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </thead>
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tbody>
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th colspan="3" align="left" border="0">{@link android.app.Activity#onCreate onCreate()}</th>
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>Called when the activity is first created.
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             This is where you should do all of your normal static set up:
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             create views, bind data to lists, etc.  This method also
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             provides you with a Bundle containing the activity's previously
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             frozen state, if there was one.
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             <p>Always followed by <code>onStart()</code>.</td>
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center">No</td>
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center"><code>onStart()</code></td>
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><td rowspan="5" style="border-left: none; border-right: none;">&nbsp;&nbsp;&nbsp;&nbsp;</td>
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <th colspan="2" align="left" border="0">{@link android.app.Activity#onRestart onRestart()}</th>
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>Called after your activity has been stopped, prior to it being
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             started again.
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             <p>Always followed by <code>onStart()</code></td>
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center">No</td>
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center"><code>onStart()</code></td>
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th colspan="2" align="left" border="0">{@link android.app.Activity#onStart onStart()}</th>
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>Called when the activity is becoming visible to the user.
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             <p>Followed by <code>onResume()</code> if the activity comes
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             to the foreground, or <code>onStop()</code> if it becomes hidden.</td>
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center">No</td>
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center"><code>onResume()</code> or <code>onStop()</code></td>
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><td rowspan="2" style="border-left: none;">&nbsp;&nbsp;&nbsp;&nbsp;</td>
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <th align="left" border="0">{@link android.app.Activity#onResume onResume()}</th>
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>Called when the activity will start
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             interacting with the user.  At this point your activity is at
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             the top of the activity stack, with user input going to it.
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             <p>Always followed by <code>onPause()</code>.</td>
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center">No</td>
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center"><code>onPause()</code></td>
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th align="left" border="0">{@link android.app.Activity#onPause onPause()}</th>
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>Called when the system is about to start resuming a previous
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             activity.  This is typically used to commit unsaved changes to
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             persistent data, stop animations and other things that may be consuming
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             CPU, etc.  Implementations of this method must be very quick because
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             the next activity will not be resumed until this method returns.
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             <p>Followed by either <code>onResume()</code> if the activity
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             returns back to the front, or <code>onStop()</code> if it becomes
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             invisible to the user.</td>
3100aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn *         <td align="center"><font color="#800000"><strong>Pre-{@link android.os.Build.VERSION_CODES#HONEYCOMB}</strong></font></td>
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center"><code>onResume()</code> or<br>
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 <code>onStop()</code></td>
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th colspan="2" align="left" border="0">{@link android.app.Activity#onStop onStop()}</th>
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>Called when the activity is no longer visible to the user, because
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             another activity has been resumed and is covering this one.  This
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             may happen either because a new activity is being started, an existing
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             one is being brought in front of this one, or this one is being
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             destroyed.
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             <p>Followed by either <code>onRestart()</code> if
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             this activity is coming back to interact with the user, or
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             <code>onDestroy()</code> if this activity is going away.</td>
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center"><font color="#800000"><strong>Yes</strong></font></td>
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center"><code>onRestart()</code> or<br>
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 <code>onDestroy()</code></td>
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th colspan="3" align="left" border="0">{@link android.app.Activity#onDestroy onDestroy()}</th>
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>The final call you receive before your
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             activity is destroyed.  This can happen either because the
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             activity is finishing (someone called {@link Activity#finish} on
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             it, or because the system is temporarily destroying this
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             instance of the activity to save space.  You can distinguish
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             between these two scenarios with the {@link
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             Activity#isFinishing} method.</td>
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center"><font color="#800000"><strong>Yes</strong></font></td>
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center"><em>nothing</em></td>
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tbody>
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </table>
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Note the "Killable" column in the above table -- for those methods that
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are marked as being killable, after that method returns the process hosting the
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity may killed by the system <em>at any time</em> without another line
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of its code being executed.  Because of this, you should use the
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #onPause} method to write any persistent data (such as user edits)
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to storage.  In addition, the method
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #onSaveInstanceState(Bundle)} is called before placing the activity
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in such a background state, allowing you to save away any dynamic instance
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * state in your activity into the given Bundle, to be later received in
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #onCreate} if the activity needs to be re-created.
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the <a href="#ProcessLifecycle">Process Lifecycle</a>
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * section for more information on how the lifecycle of a process is tied
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to the activities it is hosting.  Note that it is important to save
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * persistent data in {@link #onPause} instead of {@link #onSaveInstanceState}
3575c40f3fcc966ecde3347cd7ddbe965440318c35aDaisuke Miyakawa * because the latter is not part of the lifecycle callbacks, so will not
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be called in every situation as described in its documentation.</p>
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3600aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn * <p class="note">Be aware that these semantics will change slightly between
3610aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn * applications targeting platforms starting with {@link android.os.Build.VERSION_CODES#HONEYCOMB}
3620aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn * vs. those targeting prior platforms.  Starting with Honeycomb, an application
3630aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn * is not in the killable state until its {@link #onStop} has returned.  This
3640aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn * impacts when {@link #onSaveInstanceState(Bundle)} may be called (it may be
3650aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn * safely called after {@link #onPause()} and allows and application to safely
3660aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn * wait until {@link #onStop()} to save persistent state.</p>
3670aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn *
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>For those methods that are not marked as being killable, the activity's
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * process will not be killed by the system starting from the time the method
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is called and continuing after it returns.  Thus an activity is in the killable
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * state, for example, between after <code>onPause()</code> to the start of
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <code>onResume()</code>.</p>
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="ConfigurationChanges"></a>
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Configuration Changes</h3>
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>If the configuration of the device (as defined by the
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Configuration Resources.Configuration} class) changes,
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * then anything displaying a user interface will need to update to match that
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * configuration.  Because Activity is the primary mechanism for interacting
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with the user, it includes special support for handling configuration
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * changes.</p>
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Unless you specify otherwise, a configuration change (such as a change
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in screen orientation, language, input devices, etc) will cause your
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current activity to be <em>destroyed</em>, going through the normal activity
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * lifecycle process of {@link #onPause},
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #onStop}, and {@link #onDestroy} as appropriate.  If the activity
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * had been in the foreground or visible to the user, once {@link #onDestroy} is
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * called in that instance then a new instance of the activity will be
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * created, with whatever savedInstanceState the previous instance had generated
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * from {@link #onSaveInstanceState}.</p>
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>This is done because any application resource,
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * including layout files, can change based on any configuration value.  Thus
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the only safe way to handle a configuration change is to re-retrieve all
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * resources, including layouts, drawables, and strings.  Because activities
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * must already know how to save their state and re-create themselves from
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that state, this is a convenient way to have an activity restart itself
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with a new configuration.</p>
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>In some special cases, you may want to bypass restarting of your
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity based on one or more types of configuration changes.  This is
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * done with the {@link android.R.attr#configChanges android:configChanges}
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * attribute in its manifest.  For any types of configuration changes you say
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that you handle there, you will receive a call to your current activity's
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #onConfigurationChanged} method instead of being restarted.  If
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a configuration change involves any that you do not handle, however, the
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity will still be restarted and {@link #onConfigurationChanged}
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will not be called.</p>
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="StartingActivities"></a>
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Starting Activities and Getting Results</h3>
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The {@link android.app.Activity#startActivity}
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * method is used to start a
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * new activity, which will be placed at the top of the activity stack.  It
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * takes a single argument, an {@link android.content.Intent Intent},
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * which describes the activity
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to be executed.</p>
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Sometimes you want to get a result back from an activity when it
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ends.  For example, you may start an activity that lets the user pick
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a person in a list of contacts; when it ends, it returns the person
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that was selected.  To do this, you call the
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#startActivityForResult(Intent, int)}
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * version with a second integer parameter identifying the call.  The result
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will come back through your {@link android.app.Activity#onActivityResult}
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * method.</p>
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>When an activity exits, it can call
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#setResult(int)}
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to return data back to its parent.  It must always supply a result code,
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * which can be the standard results RESULT_CANCELED, RESULT_OK, or any
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * custom values starting at RESULT_FIRST_USER.  In addition, it can optionally
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * return back an Intent containing any additional data it wants.  All of this
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * information appears back on the
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * parent's <code>Activity.onActivityResult()</code>, along with the integer
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * identifier it originally supplied.</p>
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>If a child activity fails for any reason (such as crashing), the parent
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity will receive a result with the code RESULT_CANCELED.</p>
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint">
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * public class MyActivity extends Activity {
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     ...
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     static final int PICK_CONTACT_REQUEST = 0;
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected boolean onKeyDown(int keyCode, KeyEvent event) {
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             // When the user center presses, let them pick a contact.
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             startActivityForResult(
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 new Intent(Intent.ACTION_PICK,
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 new Uri("content://contacts")),
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 PICK_CONTACT_REQUEST);
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *            return true;
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         }
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         return false;
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     }
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onActivityResult(int requestCode, int resultCode,
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             Intent data) {
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         if (requestCode == PICK_CONTACT_REQUEST) {
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             if (resultCode == RESULT_OK) {
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 // A contact was picked.  Here we will just display it
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 // to the user.
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 startActivity(new Intent(Intent.ACTION_VIEW, data));
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             }
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         }
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     }
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * }
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </pre>
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="SavingPersistentState"></a>
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Saving Persistent State</h3>
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>There are generally two kinds of persistent state than an activity
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will deal with: shared document-like data (typically stored in a SQLite
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * database using a {@linkplain android.content.ContentProvider content provider})
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and internal state such as user preferences.</p>
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>For content provider data, we suggest that activities use a
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * "edit in place" user model.  That is, any edits a user makes are effectively
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * made immediately without requiring an additional confirmation step.
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Supporting this model is generally a simple matter of following two rules:</p>
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul>
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> <p>When creating a new document, the backing database entry or file for
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             it is created immediately.  For example, if the user chooses to write
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             a new e-mail, a new entry for that e-mail is created as soon as they
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             start entering data, so that if they go to any other activity after
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             that point this e-mail will now appear in the list of drafts.</p>
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> <p>When an activity's <code>onPause()</code> method is called, it should
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             commit to the backing content provider or file any changes the user
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             has made.  This ensures that those changes will be seen by any other
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             activity that is about to run.  You will probably want to commit
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             your data even more aggressively at key times during your
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             activity's lifecycle: for example before starting a new
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             activity, before finishing your own activity, when the user
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             switches between input fields, etc.</p>
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>This model is designed to prevent data loss when a user is navigating
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * between activities, and allows the system to safely kill an activity (because
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * system resources are needed somewhere else) at any time after it has been
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * paused.  Note this implies
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that the user pressing BACK from your activity does <em>not</em>
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mean "cancel" -- it means to leave the activity with its current contents
5100aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn * saved away.  Canceling edits in an activity must be provided through
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * some other mechanism, such as an explicit "revert" or "undo" option.</p>
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>See the {@linkplain android.content.ContentProvider content package} for
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * more information about content providers.  These are a key aspect of how
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * different activities invoke and propagate data between themselves.</p>
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The Activity class also provides an API for managing internal persistent state
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * associated with an activity.  This can be used, for example, to remember
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the user's preferred initial display in a calendar (day view or week view)
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or the user's default home page in a web browser.</p>
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Activity persistent state is managed
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with the method {@link #getPreferences},
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * allowing you to retrieve and
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * modify a set of name/value pairs associated with the activity.  To use
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * preferences that are shared across multiple application components
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (activities, receivers, services, providers), you can use the underlying
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Context#getSharedPreferences Context.getSharedPreferences()} method
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to retrieve a preferences
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * object stored under a specific name.
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (Note that it is not possible to share settings data across application
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * packages -- for that you will need a content provider.)</p>
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Here is an excerpt from a calendar activity that stores the user's
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * preferred view mode in its persistent settings:</p>
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint">
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * public class CalendarActivity extends Activity {
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     ...
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     static final int DAY_VIEW_MODE = 0;
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     static final int WEEK_VIEW_MODE = 1;
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     private SharedPreferences mPrefs;
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     private int mCurViewMode;
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onCreate(Bundle savedInstanceState) {
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         super.onCreate(savedInstanceState);
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         SharedPreferences mPrefs = getSharedPreferences();
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         mCurViewMode = mPrefs.getInt("view_mode" DAY_VIEW_MODE);
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     }
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onPause() {
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         super.onPause();
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         SharedPreferences.Editor ed = mPrefs.edit();
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         ed.putInt("view_mode", mCurViewMode);
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         ed.commit();
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     }
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * }
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </pre>
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="Permissions"></a>
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Permissions</h3>
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The ability to start a particular Activity can be enforced when it is
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * declared in its
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * manifest's {@link android.R.styleable#AndroidManifestActivity &lt;activity&gt;}
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * tag.  By doing so, other applications will need to declare a corresponding
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.styleable#AndroidManifestUsesPermission &lt;uses-permission&gt;}
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * element in their own manifest to be able to start that activity.
57321c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn *
57421c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn * <p>When starting an Activity you can set {@link Intent#FLAG_GRANT_READ_URI_PERMISSION
57521c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn * Intent.FLAG_GRANT_READ_URI_PERMISSION} and/or {@link Intent#FLAG_GRANT_WRITE_URI_PERMISSION
57621c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn * Intent.FLAG_GRANT_WRITE_URI_PERMISSION} on the Intent.  This will grant the
57721c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn * Activity access to the specific URIs in the Intent.  Access will remain
57821c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn * until the Activity has finished (it will remain across the hosting
57921c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn * process being killed and other temporary destruction).  As of
58021c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn * {@link android.os.Build.VERSION_CODES#GINGERBREAD}, if the Activity
58121c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn * was already created and a new Intent is being delivered to
58221c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn * {@link #onNewIntent(Intent)}, any newly granted URI permissions will be added
58321c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn * to the existing ones it holds.
58421c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn *
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>See the <a href="{@docRoot}guide/topics/security/security.html">Security and Permissions</a>
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * document for more information on permissions and security in general.
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="ProcessLifecycle"></a>
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Process Lifecycle</h3>
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The Android system attempts to keep application process around for as
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * long as possible, but eventually will need to remove old processes when
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * memory runs low.  As described in <a href="#ActivityLifecycle">Activity
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Lifecycle</a>, the decision about which process to remove is intimately
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * tied to the state of the user's interaction with it.  In general, there
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are four states a process can be in based on the activities running in it,
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * listed here in order of importance.  The system will kill less important
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * processes (the last ones) before it resorts to killing more important
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * processes (the first ones).
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ol>
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <p>The <b>foreground activity</b> (the activity at the top of the screen
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that the user is currently interacting with) is considered the most important.
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Its process will only be killed as a last resort, if it uses more memory
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * than is available on the device.  Generally at this point the device has
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * reached a memory paging state, so this is required in order to keep the user
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * interface responsive.
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <p>A <b>visible activity</b> (an activity that is visible to the user
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * but not in the foreground, such as one sitting behind a foreground dialog)
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is considered extremely important and will not be killed unless that is
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * required to keep the foreground activity running.
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <p>A <b>background activity</b> (an activity that is not visible to
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the user and has been paused) is no longer critical, so the system may
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * safely kill its process to reclaim memory for other foreground or
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * visible processes.  If its process needs to be killed, when the user navigates
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * back to the activity (making it visible on the screen again), its
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #onCreate} method will be called with the savedInstanceState it had previously
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * supplied in {@link #onSaveInstanceState} so that it can restart itself in the same
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * state as the user last left it.
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <p>An <b>empty process</b> is one hosting no activities or other
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * application components (such as {@link Service} or
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.BroadcastReceiver} classes).  These are killed very
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * quickly by the system as memory becomes low.  For this reason, any
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * background operation you do outside of an activity must be executed in the
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * context of an activity BroadcastReceiver or Service to ensure that the system
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * knows it needs to keep your process around.
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ol>
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Sometimes an Activity may need to do a long-running operation that exists
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * independently of the activity lifecycle itself.  An example may be a camera
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * application that allows you to upload a picture to a web site.  The upload
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * may take a long time, and the application should allow the user to leave
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the application will it is executing.  To accomplish this, your Activity
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * should start a {@link Service} in which the upload takes place.  This allows
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the system to properly prioritize your process (considering it to be more
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * important than other non-visible applications) for the duration of the
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * upload, independent of whether the original activity is paused, stopped,
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or finished.
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Activity extends ContextThemeWrapper
641625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        implements LayoutInflater.Factory2,
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Window.Callback, KeyEvent.Callback,
643c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        OnCreateContextMenuListener, ComponentCallbacks2 {
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String TAG = "Activity";
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Standard activity result: operation canceled. */
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int RESULT_CANCELED    = 0;
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Standard activity result: operation succeeded. */
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int RESULT_OK           = -1;
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Start of user-defined activity results. */
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int RESULT_FIRST_USER   = 1;
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String WINDOW_HIERARCHY_TAG = "android:viewHierarchyState";
654b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    private static final String FRAGMENTS_TAG = "android:fragments";
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String SAVED_DIALOG_IDS_KEY = "android:savedDialogIds";
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String SAVED_DIALOGS_TAG = "android:savedDialogs";
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String SAVED_DIALOG_KEY_PREFIX = "android:dialog_";
6588ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    private static final String SAVED_DIALOG_ARGS_KEY_PREFIX = "android:dialog_args_";
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6608ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    private static class ManagedDialog {
6618ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        Dialog mDialog;
6628ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        Bundle mArgs;
6638ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    }
6648ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    private SparseArray<ManagedDialog> mManagedDialogs;
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // set by the thread after the constructor and before onCreate(Bundle savedInstanceState) is called.
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Instrumentation mInstrumentation;
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IBinder mToken;
669b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn    private int mIdent;
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ String mEmbeddedID;
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Application mApplication;
672b70f3dff01e7e1e85f77cf0b0b2eaba8200eb82cChristopher Tate    /*package*/ Intent mIntent;
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ComponentName mComponent;
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ ActivityInfo mActivityInfo;
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ ActivityThread mMainThread;
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Activity mParent;
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mCalled;
6785e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn    boolean mCheckedForLoaderManager;
679fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn    boolean mLoadersStarted;
68052d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamilton    /*package*/ boolean mResumed;
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mStopped;
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mFinished;
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mStartedActivity;
684fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn    /** true if the activity is going through a transient pause */
685fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn    /*package*/ boolean mTemporaryPause = false;
6863d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton    /** true if the activity is being destroyed in order to recreate it with a new configuration */
6873d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton    /*package*/ boolean mChangingConfigurations = false;
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ int mConfigChangeFlags;
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ Configuration mCurrentConfig;
6908d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert    private SearchManager mSearchManager;
69188ab69780f58e4b32d497266b2ad646a4d74827bAdam Powell    private MenuInflater mMenuInflater;
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
693b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    static final class NonConfigurationInstances {
694b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        Object activity;
695b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        HashMap<String, Object> children;
696b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        ArrayList<Fragment> fragments;
6974911b783aa9f4af5ac919db861751d350471f5efDianne Hackborn        SparseArray<LoaderManagerImpl> loaders;
698b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
699b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    /* package */ NonConfigurationInstances mLastNonConfigurationInstances;
700b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Window mWindow;
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private WindowManager mWindowManager;
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ View mDecor = null;
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ boolean mWindowAdded = false;
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ boolean mVisibleFromServer = false;
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ boolean mVisibleFromClient = true;
708ac695c608ba620e2362f57126d7be453cf5b7e1bAdam Powell    /*package*/ ActionBarImpl mActionBar = null;
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private CharSequence mTitle;
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mTitleColor = 0;
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
713b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    final FragmentManagerImpl mFragments = new FragmentManagerImpl();
7142dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
7154911b783aa9f4af5ac919db861751d350471f5efDianne Hackborn    SparseArray<LoaderManagerImpl> mAllLoaderManagers;
7164911b783aa9f4af5ac919db861751d350471f5efDianne Hackborn    LoaderManagerImpl mLoaderManager;
717c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final class ManagedCursor {
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ManagedCursor(Cursor cursor) {
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCursor = cursor;
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mReleased = false;
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUpdated = false;
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final Cursor mCursor;
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private boolean mReleased;
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private boolean mUpdated;
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final ArrayList<ManagedCursor> mManagedCursors =
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new ArrayList<ManagedCursor>();
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // protected by synchronized (this)
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mResultCode = RESULT_CANCELED;
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Intent mResultData = null;
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mTitleReady = false;
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mDefaultKeyMode = DEFAULT_KEYS_DISABLE;
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private SpannableStringBuilder mDefaultKeySsb = null;
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static final int[] FOCUSED_STATE_SET = {com.android.internal.R.attr.state_focused};
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7437e442837702a6e026c73a01fedb62c222b63cfc9Jeff Brown    private final Object mInstanceTracker = StrictMode.trackActivity(this);
7447e442837702a6e026c73a01fedb62c222b63cfc9Jeff Brown
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Thread mUiThread;
746b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    final Handler mHandler = new Handler();
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Return the intent that started this activity. */
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Intent getIntent() {
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mIntent;
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Change the intent returned by {@link #getIntent}.  This holds a
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * reference to the given intent; it does not copy it.  Often used in
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * conjunction with {@link #onNewIntent}.
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param newIntent The new Intent object to return from getIntent
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getIntent
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onNewIntent
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setIntent(Intent newIntent) {
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mIntent = newIntent;
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Return the application that owns this activity. */
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final Application getApplication() {
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mApplication;
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Is this activity embedded inside of another activity? */
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean isChild() {
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mParent != null;
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Return the parent activity if this view is an embedded child. */
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final Activity getParent() {
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mParent;
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Retrieve the window manager for showing custom windows. */
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public WindowManager getWindowManager() {
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mWindowManager;
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the current {@link android.view.Window} for the activity.
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This can be used to directly access parts of the Window API that
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * are not available through Activity/Screen.
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Window The current window, or null if the activity is not
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         visual.
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Window getWindow() {
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mWindow;
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
800c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn     * Return the LoaderManager for this fragment, creating it if needed.
801c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn     */
802c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn    public LoaderManager getLoaderManager() {
803c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn        if (mLoaderManager != null) {
804c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn            return mLoaderManager;
805c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn        }
8065e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn        mCheckedForLoaderManager = true;
807fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn        mLoaderManager = getLoaderManager(-1, mLoadersStarted, true);
808c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn        return mLoaderManager;
809c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn    }
810c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn
8115e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn    LoaderManagerImpl getLoaderManager(int index, boolean started, boolean create) {
812c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn        if (mAllLoaderManagers == null) {
8134911b783aa9f4af5ac919db861751d350471f5efDianne Hackborn            mAllLoaderManagers = new SparseArray<LoaderManagerImpl>();
814c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn        }
8154911b783aa9f4af5ac919db861751d350471f5efDianne Hackborn        LoaderManagerImpl lm = mAllLoaderManagers.get(index);
816fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn        if (lm == null) {
817fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn            if (create) {
818fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn                lm = new LoaderManagerImpl(this, started);
819fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn                mAllLoaderManagers.put(index, lm);
820fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn            }
821fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn        } else {
822fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn            lm.updateActivity(this);
823c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn        }
824c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn        return lm;
825c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn    }
826c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn
827c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn    /**
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Calls {@link android.view.Window#getCurrentFocus} on the
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Window of this Activity to return the currently focused view.
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return View The current View with focus or null.
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getWindow
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.view.Window#getCurrentFocus
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public View getCurrentFocus() {
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mWindow != null ? mWindow.getCurrentFocus() : null;
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when the activity is starting.  This is where most initialization
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * should go: calling {@link #setContentView(int)} to inflate the
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity's UI, using {@link #findViewById} to programmatically interact
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * with widgets in the UI, calling
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #managedQuery(android.net.Uri , String[], String, String[], String)} to retrieve
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * cursors for data being displayed, etc.
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>You can call {@link #finish} from within this function, in
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * which case onDestroy() will be immediately called without any of the rest
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of the activity lifecycle ({@link #onStart}, {@link #onResume},
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onPause}, etc) executing.
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Derived classes must call through to the super class's
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method.  If they do not, an exception will be
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thrown.</em></p>
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param savedInstanceState If the activity is being re-initialized after
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *     previously being shut down then this Bundle contains the data it most
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *     recently supplied in {@link #onSaveInstanceState}.  <b><i>Note: Otherwise it is null.</i></b>
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onStart
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onSaveInstanceState
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onRestoreInstanceState
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPostCreate
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onCreate(Bundle savedInstanceState) {
8672707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn        if (mLastNonConfigurationInstances != null) {
8682707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn            mAllLoaderManagers = mLastNonConfigurationInstances.loaders;
8692707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn        }
870b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (savedInstanceState != null) {
871b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            Parcelable p = savedInstanceState.getParcelable(FRAGMENTS_TAG);
872b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            mFragments.restoreAllState(p, mLastNonConfigurationInstances != null
873b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    ? mLastNonConfigurationInstances.fragments : null);
874b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
875b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mFragments.dispatchCreate();
876c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        getApplication().dispatchActivityCreated(this, savedInstanceState);
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The hook for {@link ActivityThread} to restore the state of this activity.
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Calls {@link #onSaveInstanceState(android.os.Bundle)} and
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #restoreManagedDialogs(android.os.Bundle)}.
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param savedInstanceState contains the saved state
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performRestoreInstanceState(Bundle savedInstanceState) {
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onRestoreInstanceState(savedInstanceState);
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        restoreManagedDialogs(savedInstanceState);
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This method is called after {@link #onStart} when the activity is
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * being re-initialized from a previously saved state, given here in
896305de9dbda4e40d60ca99dda307ccd5e3c23e0a0Mike LeBeau     * <var>savedInstanceState</var>.  Most implementations will simply use {@link #onCreate}
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to restore their state, but it is sometimes convenient to do it here
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * after all of the initialization has been done or to allow subclasses to
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * decide whether to use your default implementation.  The default
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method performs a restore of any view state that
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * had previously been frozen by {@link #onSaveInstanceState}.
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This method is called between {@link #onStart} and
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onPostCreate}.
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param savedInstanceState the data most recently supplied in {@link #onSaveInstanceState}.
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onCreate
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPostCreate
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onResume
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onSaveInstanceState
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onRestoreInstanceState(Bundle savedInstanceState) {
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mWindow != null) {
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Bundle windowState = savedInstanceState.getBundle(WINDOW_HIERARCHY_TAG);
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (windowState != null) {
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWindow.restoreHierarchyState(windowState);
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Restore the state of any saved managed dialogs.
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param savedInstanceState The bundle to restore from.
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void restoreManagedDialogs(Bundle savedInstanceState) {
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Bundle b = savedInstanceState.getBundle(SAVED_DIALOGS_TAG);
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (b == null) {
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int[] ids = b.getIntArray(SAVED_DIALOG_IDS_KEY);
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int numDialogs = ids.length;
9358ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        mManagedDialogs = new SparseArray<ManagedDialog>(numDialogs);
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < numDialogs; i++) {
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final Integer dialogId = ids[i];
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Bundle dialogState = b.getBundle(savedDialogKeyFor(dialogId));
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (dialogState != null) {
940e35c23514592efe07d54fdbed7e7ec0b717e8bbeRomain Guy                // Calling onRestoreInstanceState() below will invoke dispatchOnCreate
941e35c23514592efe07d54fdbed7e7ec0b717e8bbeRomain Guy                // so tell createDialog() not to do it, otherwise we get an exception
9428ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                final ManagedDialog md = new ManagedDialog();
9438ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                md.mArgs = b.getBundle(savedDialogArgsKeyFor(dialogId));
9448ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                md.mDialog = createDialog(dialogId, dialogState, md.mArgs);
9458ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                if (md.mDialog != null) {
9468ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                    mManagedDialogs.put(dialogId, md);
9478ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                    onPrepareDialog(dialogId, md.mDialog, md.mArgs);
9488ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                    md.mDialog.onRestoreInstanceState(dialogState);
9498ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                }
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9548ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    private Dialog createDialog(Integer dialogId, Bundle state, Bundle args) {
9558ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        final Dialog dialog = onCreateDialog(dialogId, args);
956764d5331d15c19162c938e617777b4bf15a6314dRomain Guy        if (dialog == null) {
9578ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            return null;
958764d5331d15c19162c938e617777b4bf15a6314dRomain Guy        }
9596de4aed1c67263269f83f579ec5b06263d173ef3Romain Guy        dialog.dispatchOnCreate(state);
960764d5331d15c19162c938e617777b4bf15a6314dRomain Guy        return dialog;
961764d5331d15c19162c938e617777b4bf15a6314dRomain Guy    }
962764d5331d15c19162c938e617777b4bf15a6314dRomain Guy
9638ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    private static String savedDialogKeyFor(int key) {
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return SAVED_DIALOG_KEY_PREFIX + key;
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9678ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    private static String savedDialogArgsKeyFor(int key) {
9688ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        return SAVED_DIALOG_ARGS_KEY_PREFIX + key;
9698ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    }
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when activity start-up is complete (after {@link #onStart}
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and {@link #onRestoreInstanceState} have been called).  Applications will
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * generally not implement this method; it is intended for system
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * classes to do final initialization after application code has run.
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Derived classes must call through to the super class's
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method.  If they do not, an exception will be
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thrown.</em></p>
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param savedInstanceState If the activity is being re-initialized after
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *     previously being shut down then this Bundle contains the data it most
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *     recently supplied in {@link #onSaveInstanceState}.  <b><i>Note: Otherwise it is null.</i></b>
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onCreate
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onPostCreate(Bundle savedInstanceState) {
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!isChild()) {
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTitleReady = true;
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            onTitleChanged(getTitle(), getTitleColor());
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called after {@link #onCreate} &mdash; or after {@link #onRestart} when
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the activity had been stopped, but is now again being displayed to the
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	 * user.  It will be followed by {@link #onResume}.
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Derived classes must call through to the super class's
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method.  If they do not, an exception will be
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thrown.</em></p>
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onCreate
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onStop
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onResume
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onStart() {
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
1009fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn
1010fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn        if (!mLoadersStarted) {
1011fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn            mLoadersStarted = true;
1012fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn            if (mLoaderManager != null) {
1013fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn                mLoaderManager.doStart();
1014fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn            } else if (!mCheckedForLoaderManager) {
1015fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn                mLoaderManager = getLoaderManager(-1, mLoadersStarted, false);
1016fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn            }
1017fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn            mCheckedForLoaderManager = true;
10182707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn        }
1019c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
1020c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        getApplication().dispatchActivityStarted(this);
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called after {@link #onStop} when the current activity is being
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * re-displayed to the user (the user has navigated back to it).  It will
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be followed by {@link #onStart} and then {@link #onResume}.
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>For activities that are using raw {@link Cursor} objects (instead of
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * creating them through
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #managedQuery(android.net.Uri , String[], String, String[], String)},
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this is usually the place
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * where the cursor should be requeried (because you had deactivated it in
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onStop}.
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Derived classes must call through to the super class's
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method.  If they do not, an exception will be
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thrown.</em></p>
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onStop
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onStart
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onResume
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onRestart() {
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called after {@link #onRestoreInstanceState}, {@link #onRestart}, or
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onPause}, for your activity to start interacting with the user.
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is a good place to begin animations, open exclusive-access devices
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * (such as the camera), etc.
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Keep in mind that onResume is not the best indicator that your activity
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is visible to the user; a system window such as the keyguard may be in
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * front.  Use {@link #onWindowFocusChanged} to know for certain that your
10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity is visible to the user (for example, to resume a game).
10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Derived classes must call through to the super class's
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method.  If they do not, an exception will be
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thrown.</em></p>
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onRestoreInstanceState
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onRestart
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPostResume
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPause
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onResume() {
1068c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        getApplication().dispatchActivityResumed(this);
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when activity resume is complete (after {@link #onResume} has
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * been called). Applications will generally not implement this method;
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * it is intended for system classes to do final setup after application
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * resume code has run.
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Derived classes must call through to the super class's
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method.  If they do not, an exception will be
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thrown.</em></p>
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onResume
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onPostResume() {
10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Window win = getWindow();
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (win != null) win.makeActive();
108750efbed668a9410cdec51f7c8604fa44ed267fedAdam Powell        if (mActionBar != null) mActionBar.setShowHideAnimationEnabled(true);
10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is called for activities that set launchMode to "singleTop" in
10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * their package, or if a client used the {@link Intent#FLAG_ACTIVITY_SINGLE_TOP}
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * flag when calling {@link #startActivity}.  In either case, when the
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity is re-launched while at the top of the activity stack instead
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of a new instance of the activity being started, onNewIntent() will be
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * called on the existing instance with the Intent that was used to
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * re-launch it.
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>An activity will always be paused before receiving a new intent, so
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * you can count on {@link #onResume} being called after this method.
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note that {@link #getIntent} still returns the original Intent.  You
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * can use {@link #setIntent} to update it to this new Intent.
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param intent The new intent that was started for the activity.
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getIntent
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setIntent
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onResume
11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onNewIntent(Intent intent) {
11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The hook for {@link ActivityThread} to save the state of this activity.
11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Calls {@link #onSaveInstanceState(android.os.Bundle)}
11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and {@link #saveManagedDialogs(android.os.Bundle)}.
11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param outState The bundle to save the state to.
11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performSaveInstanceState(Bundle outState) {
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onSaveInstanceState(outState);
11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        saveManagedDialogs(outState);
11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called to retrieve per-instance state from an activity before being killed
11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * so that the state can be restored in {@link #onCreate} or
11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onRestoreInstanceState} (the {@link Bundle} populated by this method
11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will be passed to both).
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This method is called before an activity may be killed so that when it
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * comes back some time in the future it can restore its state.  For example,
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if activity B is launched in front of activity A, and at some point activity
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A is killed to reclaim resources, activity A will have a chance to save the
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * current state of its user interface via this method so that when the user
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returns to activity A, the state of the user interface can be restored
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * via {@link #onCreate} or {@link #onRestoreInstanceState}.
11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Do not confuse this method with activity lifecycle callbacks such as
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onPause}, which is always called when an activity is being placed
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in the background or on its way to destruction, or {@link #onStop} which
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is called before destruction.  One example of when {@link #onPause} and
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onStop} is called and not this method is when a user navigates back
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * from activity B to activity A: there is no need to call {@link #onSaveInstanceState}
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * on B because that particular instance will never be restored, so the
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * system avoids calling it.  An example when {@link #onPause} is called and
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not {@link #onSaveInstanceState} is when activity B is launched in front of activity A:
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the system may avoid calling {@link #onSaveInstanceState} on activity A if it isn't
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * killed during the lifetime of B since the state of the user interface of
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A will stay intact.
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The default implementation takes care of most of the UI per-instance
11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * state for you by calling {@link android.view.View#onSaveInstanceState()} on each
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * view in the hierarchy that has an id, and by saving the id of the currently
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * focused view (all of which is restored by the default implementation of
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onRestoreInstanceState}).  If you override this method to save additional
11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * information not captured by each individual view, you will likely want to
11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * call through to the default implementation, otherwise be prepared to save
11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * all of the state of each view yourself.
11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>If called, this method will occur before {@link #onStop}.  There are
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * no guarantees about whether it will occur before or after {@link #onPause}.
11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param outState Bundle in which to place your saved state.
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onCreate
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onRestoreInstanceState
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPause
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onSaveInstanceState(Bundle outState) {
11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outState.putBundle(WINDOW_HIERARCHY_TAG, mWindow.saveHierarchyState());
1175b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        Parcelable p = mFragments.saveAllState();
1176b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (p != null) {
1177b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            outState.putParcelable(FRAGMENTS_TAG, p);
1178b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
1179c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        getApplication().dispatchActivitySaveInstanceState(this, outState);
11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Save the state of any managed dialogs.
11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param outState place to store the saved state.
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void saveManagedDialogs(Bundle outState) {
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mManagedDialogs == null) {
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int numDialogs = mManagedDialogs.size();
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (numDialogs == 0) {
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Bundle dialogState = new Bundle();
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int[] ids = new int[mManagedDialogs.size()];
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // save each dialog's bundle, gather the ids
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < numDialogs; i++) {
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int key = mManagedDialogs.keyAt(i);
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ids[i] = key;
12058ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            final ManagedDialog md = mManagedDialogs.valueAt(i);
12068ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            dialogState.putBundle(savedDialogKeyFor(key), md.mDialog.onSaveInstanceState());
12078ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            if (md.mArgs != null) {
12088ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                dialogState.putBundle(savedDialogArgsKeyFor(key), md.mArgs);
12098ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            }
12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dialogState.putIntArray(SAVED_DIALOG_IDS_KEY, ids);
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outState.putBundle(SAVED_DIALOGS_TAG, dialogState);
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called as part of the activity lifecycle when an activity is going into
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the background, but has not (yet) been killed.  The counterpart to
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onResume}.
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>When activity B is launched in front of activity A, this callback will
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be invoked on A.  B will not be created until A's {@link #onPause} returns,
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * so be sure to not do anything lengthy here.
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This callback is mostly used for saving any persistent state the
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity is editing, to present a "edit in place" model to the user and
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * making sure nothing is lost if there are not enough resources to start
12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the new activity without first killing this one.  This is also a good
12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * place to do things like stop animations and other things that consume a
12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * noticeable mount of CPU in order to make the switch to the next activity
12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * as fast as possible, or to close resources that are exclusive access
12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * such as the camera.
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>In situations where the system needs more memory it may kill paused
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * processes to reclaim resources.  Because of this, you should be sure
12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that all of your state is saved by the time you return from
12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this function.  In general {@link #onSaveInstanceState} is used to save
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * per-instance state in the activity and this method is used to store
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * global persistent data (in content providers, files, etc.)
12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>After receiving this call you will usually receive a following call
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to {@link #onStop} (after the next activity has been resumed and
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * displayed), however in some cases there will be a direct call back to
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onResume} without going through the stopped state.
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Derived classes must call through to the super class's
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method.  If they do not, an exception will be
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thrown.</em></p>
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onResume
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onSaveInstanceState
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onStop
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onPause() {
1256c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        getApplication().dispatchActivityPaused(this);
12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called as part of the activity lifecycle when an activity is about to go
12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * into the background as the result of user choice.  For example, when the
12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * user presses the Home key, {@link #onUserLeaveHint} will be called, but
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * when an incoming phone call causes the in-call Activity to be automatically
12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * brought to the foreground, {@link #onUserLeaveHint} will not be called on
12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the activity being interrupted.  In cases when it is invoked, this method
12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is called right before the activity's {@link #onPause} callback.
12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This callback and {@link #onUserInteraction} are intended to help
12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activities manage status bar notifications intelligently; specifically,
12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for helping activities determine the proper time to cancel a notfication.
12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onUserInteraction()
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onUserLeaveHint() {
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Generate a new thumbnail for this activity.  This method is called before
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * pausing the activity, and should draw into <var>outBitmap</var> the
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * imagery for the desired thumbnail in the dimensions of that bitmap.  It
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * can use the given <var>canvas</var>, which is configured to draw into the
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * bitmap, for rendering if desired.
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12850aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn     * <p>The default implementation returns fails and does not draw a thumbnail;
12860aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn     * this will result in the platform creating its own thumbnail if needed.
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param outBitmap The bitmap to contain the thumbnail.
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param canvas Can be used to render into the bitmap.
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Return true if you have drawn into the bitmap; otherwise after
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         you return it will be filled with a default thumbnail.
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onCreateDescription
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onSaveInstanceState
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPause
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onCreateThumbnail(Bitmap outBitmap, Canvas canvas) {
12990aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        return false;
13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Generate a new description for this activity.  This method is called
13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * before pausing the activity and can, if desired, return some textual
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * description of its current state to be displayed to the user.
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The default implementation returns null, which will cause you to
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * inherit the description from the previous activity.  If all activities
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * return null, generally the label of the top activity will be used as the
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * description.
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return A description of what the user is doing.  It should be short and
13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         sweet (only a few words).
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onCreateThumbnail
13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onSaveInstanceState
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPause
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public CharSequence onCreateDescription() {
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when you are no longer visible to the user.  You will next
13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * receive either {@link #onRestart}, {@link #onDestroy}, or nothing,
13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * depending on later user activity.
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note that this method may never be called, in low memory situations
13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * where the system does not have enough memory to keep your activity's
13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * process running after its {@link #onPause} method is called.
13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Derived classes must call through to the super class's
13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method.  If they do not, an exception will be
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thrown.</em></p>
13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onRestart
13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onResume
13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onSaveInstanceState
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onDestroy
13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onStop() {
134250efbed668a9410cdec51f7c8604fa44ed267fedAdam Powell        if (mActionBar != null) mActionBar.setShowHideAnimationEnabled(false);
1343c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        getApplication().dispatchActivityStopped(this);
13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Perform any final cleanup before an activity is destroyed.  This can
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * happen either because the activity is finishing (someone called
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #finish} on it, or because the system is temporarily destroying
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this instance of the activity to save space.  You can distinguish
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * between these two scenarios with the {@link #isFinishing} method.
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Note: do not count on this method being called as a place for
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * saving data! For example, if an activity is editing data in a content
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * provider, those edits should be committed in either {@link #onPause} or
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onSaveInstanceState}, not here.</em> This method is usually implemented to
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * free resources like threads that are associated with an activity, so
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that a destroyed activity does not leave such things around while the
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * rest of its application is still running.  There are situations where
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the system will simply kill the activity's hosting process without
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * calling this method (or any others) in it, so it should not be used to
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * do things that are intended to remain around after the process goes
13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * away.
13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Derived classes must call through to the super class's
13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method.  If they do not, an exception will be
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thrown.</em></p>
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPause
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onStop
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #finish
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isFinishing
13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onDestroy() {
13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // dismiss any dialogs we are managing.
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mManagedDialogs != null) {
13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int numDialogs = mManagedDialogs.size();
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i = 0; i < numDialogs; i++) {
13828ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                final ManagedDialog md = mManagedDialogs.valueAt(i);
13838ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                if (md.mDialog.isShowing()) {
13848ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                    md.mDialog.dismiss();
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13878ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            mManagedDialogs = null;
13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // close any cursors we are managing.
13912f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki        synchronized (mManagedCursors) {
13922f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki            int numCursors = mManagedCursors.size();
13932f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki            for (int i = 0; i < numCursors; i++) {
13942f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                ManagedCursor c = mManagedCursors.get(i);
13952f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                if (c != null) {
13962f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                    c.mCursor.close();
13972f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                }
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13992f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki            mManagedCursors.clear();
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14014986044fd3bce877247e425374b47967775081a8Amith Yamasani
14024986044fd3bce877247e425374b47967775081a8Amith Yamasani        // Close any open search dialog
14034986044fd3bce877247e425374b47967775081a8Amith Yamasani        if (mSearchManager != null) {
14044986044fd3bce877247e425374b47967775081a8Amith Yamasani            mSearchManager.stopSearch();
14054986044fd3bce877247e425374b47967775081a8Amith Yamasani        }
1406c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
1407c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        getApplication().dispatchActivityDestroyed(this);
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called by the system when the device configuration changes while your
14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity is running.  Note that this will <em>only</em> be called if
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * you have selected configurations you would like to handle with the
14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.R.attr#configChanges} attribute in your manifest.  If
14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * any configuration change occurs that is not selected to be reported
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * by that attribute, then instead of reporting it the system will stop
14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and restart the activity (to have it launched with the new
14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * configuration).
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>At the time that this function has been called, your Resources
14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * object will have been updated to return resource values matching the
14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * new configuration.
14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param newConfig The new device configuration.
14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onConfigurationChanged(Configuration newConfig) {
14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
1428444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert
14299d0718042f7c0a50d825c621f82ce9a92071f07aDianne Hackborn        mFragments.dispatchConfigurationChanged(newConfig);
14309d0718042f7c0a50d825c621f82ce9a92071f07aDianne Hackborn
14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mWindow != null) {
14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Pass the configuration changed event to the window
14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindow.onConfigurationChanged(newConfig);
14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
143545c0b1954d7dfa6e2590ed76b915a98ae971414cAdam Powell
143645c0b1954d7dfa6e2590ed76b915a98ae971414cAdam Powell        if (mActionBar != null) {
143745c0b1954d7dfa6e2590ed76b915a98ae971414cAdam Powell            // Do this last; the action bar will need to access
143845c0b1954d7dfa6e2590ed76b915a98ae971414cAdam Powell            // view changes from above.
143945c0b1954d7dfa6e2590ed76b915a98ae971414cAdam Powell            mActionBar.onConfigurationChanged(newConfig);
144045c0b1954d7dfa6e2590ed76b915a98ae971414cAdam Powell        }
14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If this activity is being destroyed because it can not handle a
14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * configuration parameter being changed (and thus its
14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onConfigurationChanged(Configuration)} method is
14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <em>not</em> being called), then you can use this method to discover
14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the set of changes that have occurred while in the process of being
14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * destroyed.  Note that there is no guarantee that these will be
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * accurate (other changes could have happened at any time), so you should
14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * only use this as an optimization hint.
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns a bit field of the configuration parameters that are
14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * changing, as defined by the {@link android.content.res.Configuration}
14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * class.
14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getChangingConfigurations() {
14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mConfigChangeFlags;
14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the non-configuration instance data that was previously
14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returned by {@link #onRetainNonConfigurationInstance()}.  This will
14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be available from the initial {@link #onCreate} and
14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onStart} calls to the new instance, allowing you to extract
14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * any useful dynamic state from the previous instance.
14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note that the data you retrieve here should <em>only</em> be used
14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * as an optimization for handling configuration changes.  You should always
14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be able to handle getting a null pointer back, and an activity must
14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * still be able to restore itself to its previous state (through the
14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * normal {@link #onSaveInstanceState(Bundle)} mechanism) even if this
14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * function returns null.
14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the object previously returned by
14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onRetainNonConfigurationInstance()}.
1477271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     *
1478271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * @deprecated Use the new {@link Fragment} API
1479271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * {@link Fragment#setRetainInstance(boolean)} instead; this is also
1480271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * available on older platforms through the Android compatibility package.
14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14829567a66a5e6f49dd8495fb5f6e2efb9f32e84b35Dianne Hackborn    @Deprecated
14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Object getLastNonConfigurationInstance() {
1484b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return mLastNonConfigurationInstances != null
1485b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                ? mLastNonConfigurationInstances.activity : null;
14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called by the system, as part of destroying an
14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity due to a configuration change, when it is known that a new
14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * instance will immediately be created for the new configuration.  You
14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * can return any object you like here, including the activity instance
14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * itself, which can later be retrieved by calling
14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getLastNonConfigurationInstance()} in the new activity
14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * instance.
14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1497291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * <em>If you are targeting {@link android.os.Build.VERSION_CODES#HONEYCOMB}
1498291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * or later, consider instead using a {@link Fragment} with
1499291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * {@link Fragment#setRetainInstance(boolean)
1500291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * Fragment.setRetainInstance(boolean}.</em>
1501291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     *
15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This function is called purely as an optimization, and you must
15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not rely on it being called.  When it is called, a number of guarantees
15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will be made to help optimize configuration switching:
15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <ul>
15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li> The function will be called between {@link #onStop} and
15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onDestroy}.
15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li> A new instance of the activity will <em>always</em> be immediately
1509ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn     * created after this one's {@link #onDestroy()} is called.  In particular,
1510ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn     * <em>no</em> messages will be dispatched during this time (when the returned
1511ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn     * object does not have an activity to be associated with).
15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li> The object you return here will <em>always</em> be available from
15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the {@link #getLastNonConfigurationInstance()} method of the following
15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity instance as described there.
15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </ul>
15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>These guarantees are designed so that an activity can use this API
15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to propagate extensive state from the old to new activity instance, from
15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * loaded bitmaps, to network connections, to evenly actively running
15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * threads.  Note that you should <em>not</em> propagate any data that
15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * may change based on the configuration, including any data loaded from
15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * resources such as strings, layouts, or drawables.
15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1524ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn     * <p>The guarantee of no message handling during the switch to the next
1525ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn     * activity simplifies use with active objects.  For example if your retained
1526ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn     * state is an {@link android.os.AsyncTask} you are guaranteed that its
1527ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn     * call back functions (like {@link android.os.AsyncTask#onPostExecute}) will
1528ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn     * not be called from the call here until you execute the next instance's
1529ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn     * {@link #onCreate(Bundle)}.  (Note however that there is of course no such
1530ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn     * guarantee for {@link android.os.AsyncTask#doInBackground} since that is
1531ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn     * running in a separate thread.)
1532ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn     *
15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Return any Object holding the desired state to propagate to the
15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * next activity instance.
1535271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     *
1536271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * @deprecated Use the new {@link Fragment} API
1537271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * {@link Fragment#setRetainInstance(boolean)} instead; this is also
1538271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * available on older platforms through the Android compatibility package.
15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Object onRetainNonConfigurationInstance() {
15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the non-configuration instance data that was previously
15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returned by {@link #onRetainNonConfigurationChildInstances()}.  This will
15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be available from the initial {@link #onCreate} and
15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onStart} calls to the new instance, allowing you to extract
15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * any useful dynamic state from the previous instance.
15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note that the data you retrieve here should <em>only</em> be used
15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * as an optimization for handling configuration changes.  You should always
15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be able to handle getting a null pointer back, and an activity must
15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * still be able to restore itself to its previous state (through the
15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * normal {@link #onSaveInstanceState(Bundle)} mechanism) even if this
15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * function returns null.
15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the object previously returned by
15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onRetainNonConfigurationChildInstances()}
15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1561b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    HashMap<String, Object> getLastNonConfigurationChildInstances() {
1562b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return mLastNonConfigurationInstances != null
1563b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                ? mLastNonConfigurationInstances.children : null;
15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This method is similar to {@link #onRetainNonConfigurationInstance()} except that
15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * it should return either a mapping from  child activity id strings to arbitrary objects,
15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * or null.  This method is intended to be used by Activity framework subclasses that control a
15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * set of child activities, such as ActivityGroup.  The same guarantees and restrictions apply
15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * as for {@link #onRetainNonConfigurationInstance()}.  The default implementation returns null.
15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    HashMap<String,Object> onRetainNonConfigurationChildInstances() {
15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1577b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    NonConfigurationInstances retainNonConfigurationInstances() {
1578b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        Object activity = onRetainNonConfigurationInstance();
1579b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        HashMap<String, Object> children = onRetainNonConfigurationChildInstances();
1580b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        ArrayList<Fragment> fragments = mFragments.retainNonConfig();
15812707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn        boolean retainLoaders = false;
15822707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn        if (mAllLoaderManagers != null) {
15835e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn            // prune out any loader managers that were already stopped and so
15842707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn            // have nothing useful to retain.
15852707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn            for (int i=mAllLoaderManagers.size()-1; i>=0; i--) {
15864911b783aa9f4af5ac919db861751d350471f5efDianne Hackborn                LoaderManagerImpl lm = mAllLoaderManagers.valueAt(i);
15872707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn                if (lm.mRetaining) {
15882707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn                    retainLoaders = true;
15892707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn                } else {
15905e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn                    lm.doDestroy();
15912707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn                    mAllLoaderManagers.removeAt(i);
15922707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn                }
15932707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn            }
15942707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn        }
15952707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn        if (activity == null && children == null && fragments == null && !retainLoaders) {
1596b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            return null;
1597b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
1598b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
1599b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        NonConfigurationInstances nci = new NonConfigurationInstances();
1600b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        nci.activity = activity;
1601b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        nci.children = children;
1602b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        nci.fragments = fragments;
16032707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn        nci.loaders = mAllLoaderManagers;
1604b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return nci;
1605b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
1606c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onLowMemory() {
16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
16099d0718042f7c0a50d825c621f82ce9a92071f07aDianne Hackborn        mFragments.dispatchLowMemory();
16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1611c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
1612c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    public void onTrimMemory(int level) {
1613c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        mCalled = true;
1614c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        mFragments.dispatchTrimMemory(level);
1615c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    }
1616c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1618b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * Return the FragmentManager for interacting with fragments associated
1619b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * with this activity.
1620b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     */
1621b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    public FragmentManager getFragmentManager() {
1622b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        return mFragments;
1623b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    }
1624b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn
16259e14e9f33a66b864b98c6ff9517988bafbca3301Dianne Hackborn    void invalidateFragmentIndex(int index) {
16265e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn        //Log.v(TAG, "invalidateFragmentIndex: index=" + index);
16279e14e9f33a66b864b98c6ff9517988bafbca3301Dianne Hackborn        if (mAllLoaderManagers != null) {
16285e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn            LoaderManagerImpl lm = mAllLoaderManagers.get(index);
1629d04ad541def2bca8fc2d810514ee15ab97893d35Dianne Hackborn            if (lm != null && !lm.mRetaining) {
16305e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn                lm.doDestroy();
1631d04ad541def2bca8fc2d810514ee15ab97893d35Dianne Hackborn                mAllLoaderManagers.remove(index);
16325e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn            }
16339e14e9f33a66b864b98c6ff9517988bafbca3301Dianne Hackborn        }
16349e14e9f33a66b864b98c6ff9517988bafbca3301Dianne Hackborn    }
16359e14e9f33a66b864b98c6ff9517988bafbca3301Dianne Hackborn
16362dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    /**
1637c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn     * Called when a Fragment is being attached to this activity, immediately
1638c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn     * after the call to its {@link Fragment#onAttach Fragment.onAttach()}
1639c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn     * method and before {@link Fragment#onCreate Fragment.onCreate()}.
1640c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn     */
1641c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn    public void onAttachFragment(Fragment fragment) {
1642c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn    }
1643c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn
1644c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn    /**
16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Wrapper around
16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link ContentResolver#query(android.net.Uri , String[], String, String[], String)}
16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that gives the resulting {@link Cursor} to call
16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #startManagingCursor} so that the activity will manage its
16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * lifecycle for you.
16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1651291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * <em>If you are targeting {@link android.os.Build.VERSION_CODES#HONEYCOMB}
1652291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * or later, consider instead using {@link LoaderManager} instead, available
1653291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * via {@link #getLoaderManager()}.</em>
1654291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     *
16558ef6970cf5b779a5a69502cb07fd94d9190bccfdJoe Fernandez     * <p><strong>Warning:</strong> Do not call {@link Cursor#close()} on a cursor obtained using
16568ef6970cf5b779a5a69502cb07fd94d9190bccfdJoe Fernandez     * this method, because the activity will do that for you at the appropriate time. However, if
16578ef6970cf5b779a5a69502cb07fd94d9190bccfdJoe Fernandez     * you call {@link #stopManagingCursor} on a cursor from a managed query, the system <em>will
16588ef6970cf5b779a5a69502cb07fd94d9190bccfdJoe Fernandez     * not</em> automatically close the cursor and, in that case, you must call
16598ef6970cf5b779a5a69502cb07fd94d9190bccfdJoe Fernandez     * {@link Cursor#close()}.</p>
16608ef6970cf5b779a5a69502cb07fd94d9190bccfdJoe Fernandez     *
16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param uri The URI of the content provider to query.
16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param projection List of columns to return.
16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param selection SQL WHERE clause.
16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param sortOrder SQL ORDER BY clause.
16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The Cursor that was returned by query().
16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see ContentResolver#query(android.net.Uri , String[], String, String[], String)
16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startManagingCursor
16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
16716ed50de6d1e5e27d11304cce226fefeee3105bd7Jason parks     *
16726ed50de6d1e5e27d11304cce226fefeee3105bd7Jason parks     * @deprecated Use {@link CursorLoader} instead.
16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
16746ed50de6d1e5e27d11304cce226fefeee3105bd7Jason parks    @Deprecated
1675291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn    public final Cursor managedQuery(Uri uri, String[] projection, String selection,
1676291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn            String sortOrder) {
16779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Cursor c = getContentResolver().query(uri, projection, selection, null, sortOrder);
16789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (c != null) {
16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            startManagingCursor(c);
16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return c;
16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Wrapper around
16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link ContentResolver#query(android.net.Uri , String[], String, String[], String)}
16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that gives the resulting {@link Cursor} to call
16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #startManagingCursor} so that the activity will manage its
16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * lifecycle for you.
16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1691291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * <em>If you are targeting {@link android.os.Build.VERSION_CODES#HONEYCOMB}
1692291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * or later, consider instead using {@link LoaderManager} instead, available
1693291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * via {@link #getLoaderManager()}.</em>
1694291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     *
16958ef6970cf5b779a5a69502cb07fd94d9190bccfdJoe Fernandez     * <p><strong>Warning:</strong> Do not call {@link Cursor#close()} on a cursor obtained using
16968ef6970cf5b779a5a69502cb07fd94d9190bccfdJoe Fernandez     * this method, because the activity will do that for you at the appropriate time. However, if
16978ef6970cf5b779a5a69502cb07fd94d9190bccfdJoe Fernandez     * you call {@link #stopManagingCursor} on a cursor from a managed query, the system <em>will
16988ef6970cf5b779a5a69502cb07fd94d9190bccfdJoe Fernandez     * not</em> automatically close the cursor and, in that case, you must call
16998ef6970cf5b779a5a69502cb07fd94d9190bccfdJoe Fernandez     * {@link Cursor#close()}.</p>
17008ef6970cf5b779a5a69502cb07fd94d9190bccfdJoe Fernandez     *
17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param uri The URI of the content provider to query.
17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param projection List of columns to return.
17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param selection SQL WHERE clause.
17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param selectionArgs The arguments to selection, if any ?s are pesent
17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param sortOrder SQL ORDER BY clause.
17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The Cursor that was returned by query().
17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see ContentResolver#query(android.net.Uri , String[], String, String[], String)
17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startManagingCursor
17116ed50de6d1e5e27d11304cce226fefeee3105bd7Jason parks     *
17126ed50de6d1e5e27d11304cce226fefeee3105bd7Jason parks     * @deprecated Use {@link CursorLoader} instead.
17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
17146ed50de6d1e5e27d11304cce226fefeee3105bd7Jason parks    @Deprecated
1715291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn    public final Cursor managedQuery(Uri uri, String[] projection, String selection,
1716291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn            String[] selectionArgs, String sortOrder) {
17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Cursor c = getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder);
17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (c != null) {
17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            startManagingCursor(c);
17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return c;
17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This method allows the activity to take care of managing the given
17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link Cursor}'s lifecycle for you based on the activity's lifecycle.
17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * That is, when the activity is stopped it will automatically call
17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link Cursor#deactivate} on the given Cursor, and when it is later restarted
17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * it will call {@link Cursor#requery} for you.  When the activity is
17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * destroyed, all managed Cursors will be closed automatically.
17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1732291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * <em>If you are targeting {@link android.os.Build.VERSION_CODES#HONEYCOMB}
1733291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * or later, consider instead using {@link LoaderManager} instead, available
1734291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * via {@link #getLoaderManager()}.</em>
1735291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     *
17368ef6970cf5b779a5a69502cb07fd94d9190bccfdJoe Fernandez     * <p><strong>Warning:</strong> Do not call {@link Cursor#close()} on cursor obtained from
17378ef6970cf5b779a5a69502cb07fd94d9190bccfdJoe Fernandez     * {@link #managedQuery}, because the activity will do that for you at the appropriate time.
17388ef6970cf5b779a5a69502cb07fd94d9190bccfdJoe Fernandez     * However, if you call {@link #stopManagingCursor} on a cursor from a managed query, the system
17398ef6970cf5b779a5a69502cb07fd94d9190bccfdJoe Fernandez     * <em>will not</em> automatically close the cursor and, in that case, you must call
17408ef6970cf5b779a5a69502cb07fd94d9190bccfdJoe Fernandez     * {@link Cursor#close()}.</p>
17418ef6970cf5b779a5a69502cb07fd94d9190bccfdJoe Fernandez     *
17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param c The Cursor to be managed.
17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #managedQuery(android.net.Uri , String[], String, String[], String)
17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #stopManagingCursor
1746271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     *
1747271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * @deprecated Use the new {@link android.content.CursorLoader} class with
1748271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * {@link LoaderManager} instead; this is also
1749271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * available on older platforms through the Android compatibility package.
17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
17516ed50de6d1e5e27d11304cce226fefeee3105bd7Jason parks    @Deprecated
17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startManagingCursor(Cursor c) {
17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mManagedCursors) {
17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mManagedCursors.add(new ManagedCursor(c));
17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Given a Cursor that was previously given to
17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #startManagingCursor}, stop the activity's management of that
17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * cursor.
17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
17638ef6970cf5b779a5a69502cb07fd94d9190bccfdJoe Fernandez     * <p><strong>Warning:</strong> After calling this method on a cursor from a managed query,
17648ef6970cf5b779a5a69502cb07fd94d9190bccfdJoe Fernandez     * the system <em>will not</em> automatically close the cursor and you must call
17658ef6970cf5b779a5a69502cb07fd94d9190bccfdJoe Fernandez     * {@link Cursor#close()}.</p>
17668ef6970cf5b779a5a69502cb07fd94d9190bccfdJoe Fernandez     *
17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param c The Cursor that was being managed.
17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startManagingCursor
1770271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     *
1771271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * @deprecated Use the new {@link android.content.CursorLoader} class with
1772271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * {@link LoaderManager} instead; this is also
1773271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * available on older platforms through the Android compatibility package.
17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
17756ed50de6d1e5e27d11304cce226fefeee3105bd7Jason parks    @Deprecated
17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void stopManagingCursor(Cursor c) {
17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mManagedCursors) {
17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = mManagedCursors.size();
17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=0; i<N; i++) {
17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ManagedCursor mc = mManagedCursors.get(i);
17819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mc.mCursor == c) {
17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mManagedCursors.remove(i);
17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
17903c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn     * @deprecated As of {@link android.os.Build.VERSION_CODES#GINGERBREAD}
17913c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn     * this is a no-op.
17924f3867e3ce92101224ad79b8f2ff446bb4f99108Dianne Hackborn     * @hide
17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1794d3efa3924407da6d38aa5931ac29aa088d9eb986Dianne Hackborn    @Deprecated
17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setPersistent(boolean isPersistent) {
17969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Finds a view that was identified by the id attribute from the XML that
18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * was processed in {@link #onCreate}.
18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The view if found or null otherwise.
18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public View findViewById(int id) {
18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getWindow().findViewById(id);
18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
180733b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell
180833b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell    /**
180933b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell     * Retrieve a reference to this activity's ActionBar.
181042c0fe86521af507f597af6159f63879cb5be73eAdam Powell     *
181133b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell     * @return The Activity's ActionBar, or null if it does not have one.
181233b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell     */
181333b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell    public ActionBar getActionBar() {
181442c0fe86521af507f597af6159f63879cb5be73eAdam Powell        initActionBar();
181533b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell        return mActionBar;
181633b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell    }
181733b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell
18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
181933b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell     * Creates a new ActionBar, locates the inflated ActionBarView,
182033b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell     * initializes the ActionBar with the view, and sets mActionBar.
182133b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell     */
182233b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell    private void initActionBar() {
182389e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell        Window window = getWindow();
1824a593d9852f3807305763c3f1fe1ac5c59f1fef92Adam Powell
1825a593d9852f3807305763c3f1fe1ac5c59f1fef92Adam Powell        // Initializing the window decor can change window feature flags.
1826a593d9852f3807305763c3f1fe1ac5c59f1fef92Adam Powell        // Make sure that we have the correct set before performing the test below.
1827a593d9852f3807305763c3f1fe1ac5c59f1fef92Adam Powell        window.getDecorView();
1828a593d9852f3807305763c3f1fe1ac5c59f1fef92Adam Powell
18299b4c804b9856d732e461bc7505d40aa4ea1f7bf7Adam Powell        if (isChild() || !window.hasFeature(Window.FEATURE_ACTION_BAR) || mActionBar != null) {
183033b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell            return;
183133b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell        }
183233b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell
1833661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell        mActionBar = new ActionBarImpl(this);
183433b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell    }
183533b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell
183633b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell    /**
18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the activity content from a layout resource.  The resource will be
18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * inflated, adding all top-level views to the activity.
1839482b34a6f8aebe620cf815cdc689726ef5cf437eRomain Guy     *
18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param layoutResID Resource ID to be inflated.
1841482b34a6f8aebe620cf815cdc689726ef5cf437eRomain Guy     *
1842482b34a6f8aebe620cf815cdc689726ef5cf437eRomain Guy     * @see #setContentView(android.view.View)
1843482b34a6f8aebe620cf815cdc689726ef5cf437eRomain Guy     * @see #setContentView(android.view.View, android.view.ViewGroup.LayoutParams)
18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setContentView(int layoutResID) {
18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setContentView(layoutResID);
184733b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell        initActionBar();
18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the activity content to an explicit view.  This view is placed
18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * directly into the activity's view hierarchy.  It can itself be a complex
1853482b34a6f8aebe620cf815cdc689726ef5cf437eRomain Guy     * view hierarchy.  When calling this method, the layout parameters of the
1854482b34a6f8aebe620cf815cdc689726ef5cf437eRomain Guy     * specified view are ignored.  Both the width and the height of the view are
1855482b34a6f8aebe620cf815cdc689726ef5cf437eRomain Guy     * set by default to {@link ViewGroup.LayoutParams#MATCH_PARENT}. To use
1856482b34a6f8aebe620cf815cdc689726ef5cf437eRomain Guy     * your own layout parameters, invoke
1857482b34a6f8aebe620cf815cdc689726ef5cf437eRomain Guy     * {@link #setContentView(android.view.View, android.view.ViewGroup.LayoutParams)}
1858482b34a6f8aebe620cf815cdc689726ef5cf437eRomain Guy     * instead.
18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param view The desired content to display.
1861482b34a6f8aebe620cf815cdc689726ef5cf437eRomain Guy     *
1862482b34a6f8aebe620cf815cdc689726ef5cf437eRomain Guy     * @see #setContentView(int)
1863482b34a6f8aebe620cf815cdc689726ef5cf437eRomain Guy     * @see #setContentView(android.view.View, android.view.ViewGroup.LayoutParams)
18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setContentView(View view) {
18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setContentView(view);
186733b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell        initActionBar();
18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
18719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the activity content to an explicit view.  This view is placed
18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * directly into the activity's view hierarchy.  It can itself be a complex
1873482b34a6f8aebe620cf815cdc689726ef5cf437eRomain Guy     * view hierarchy.
18749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param view The desired content to display.
18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param params Layout parameters for the view.
1877482b34a6f8aebe620cf815cdc689726ef5cf437eRomain Guy     *
1878482b34a6f8aebe620cf815cdc689726ef5cf437eRomain Guy     * @see #setContentView(android.view.View)
1879482b34a6f8aebe620cf815cdc689726ef5cf437eRomain Guy     * @see #setContentView(int)
18809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setContentView(View view, ViewGroup.LayoutParams params) {
18829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setContentView(view, params);
188333b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell        initActionBar();
18849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
18879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Add an additional content view to the activity.  Added after any existing
18889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ones in the activity -- existing views are NOT removed.
18899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param view The desired content to display.
18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param params Layout parameters for the view.
18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
18939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void addContentView(View view, ViewGroup.LayoutParams params) {
18949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().addContentView(view, params);
189533b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell        initActionBar();
18969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1899cfaf8878de83b6bb7a24aee3c240259f428e6e4aDianne Hackborn     * Sets whether this activity is finished when touched outside its window's
1900cfaf8878de83b6bb7a24aee3c240259f428e6e4aDianne Hackborn     * bounds.
1901cfaf8878de83b6bb7a24aee3c240259f428e6e4aDianne Hackborn     */
1902cfaf8878de83b6bb7a24aee3c240259f428e6e4aDianne Hackborn    public void setFinishOnTouchOutside(boolean finish) {
1903cfaf8878de83b6bb7a24aee3c240259f428e6e4aDianne Hackborn        mWindow.setCloseOnTouchOutside(finish);
1904cfaf8878de83b6bb7a24aee3c240259f428e6e4aDianne Hackborn    }
1905cfaf8878de83b6bb7a24aee3c240259f428e6e4aDianne Hackborn
1906cfaf8878de83b6bb7a24aee3c240259f428e6e4aDianne Hackborn    /**
19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setDefaultKeyMode} to turn off default handling of
19089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * keys.
19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setDefaultKeyMode
19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public final int DEFAULT_KEYS_DISABLE = 0;
19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setDefaultKeyMode} to launch the dialer during default
19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * key handling.
19169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setDefaultKeyMode
19189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public final int DEFAULT_KEYS_DIALER = 1;
19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setDefaultKeyMode} to execute a menu shortcut in
19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * default key handling.
19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>That is, the user does not need to hold down the menu key to execute menu shortcuts.
19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setDefaultKeyMode
19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
19289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public final int DEFAULT_KEYS_SHORTCUT = 2;
19299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
19309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setDefaultKeyMode} to specify that unhandled keystrokes
19319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will start an application-defined search.  (If the application or activity does not
19329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * actually define a search, the the keys will be ignored.)
19339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>See {@link android.app.SearchManager android.app.SearchManager} for more details.
19359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
19369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setDefaultKeyMode
19379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
19389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public final int DEFAULT_KEYS_SEARCH_LOCAL = 3;
19399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
19419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setDefaultKeyMode} to specify that unhandled keystrokes
19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will start a global search (typically web search, but some platforms may define alternate
19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * methods for global search)
19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
19459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>See {@link android.app.SearchManager android.app.SearchManager} for more details.
19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
19479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setDefaultKeyMode
19489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public final int DEFAULT_KEYS_SEARCH_GLOBAL = 4;
19509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Select the default key handling for this activity.  This controls what
19539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will happen to key events that are not otherwise handled.  The default
19549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * mode ({@link #DEFAULT_KEYS_DISABLE}) will simply drop them on the
19559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * floor. Other modes allow you to launch the dialer
19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ({@link #DEFAULT_KEYS_DIALER}), execute a shortcut in your options
19579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * menu without requiring the menu key be held down
19589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ({@link #DEFAULT_KEYS_SHORTCUT}), or launch a search ({@link #DEFAULT_KEYS_SEARCH_LOCAL}
19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and {@link #DEFAULT_KEYS_SEARCH_GLOBAL}).
19609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
19619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note that the mode selected here does not impact the default
19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * handling of system keys, such as the "back" and "menu" keys, and your
19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity and its views always get a first chance to receive and handle
19649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * all application keys.
19659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param mode The desired default key mode constant.
19679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
19689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #DEFAULT_KEYS_DISABLE
19699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #DEFAULT_KEYS_DIALER
19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #DEFAULT_KEYS_SHORTCUT
19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #DEFAULT_KEYS_SEARCH_LOCAL
19729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #DEFAULT_KEYS_SEARCH_GLOBAL
19739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onKeyDown
19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
19759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setDefaultKeyMode(int mode) {
19769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDefaultKeyMode = mode;
19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Some modes use a SpannableStringBuilder to track & dispatch input events
19799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // This list must remain in sync with the switch in onKeyDown()
19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (mode) {
19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case DEFAULT_KEYS_DISABLE:
19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case DEFAULT_KEYS_SHORTCUT:
19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDefaultKeySsb = null;      // not used in these modes
19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case DEFAULT_KEYS_DIALER:
19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case DEFAULT_KEYS_SEARCH_LOCAL:
19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case DEFAULT_KEYS_SEARCH_GLOBAL:
19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDefaultKeySsb = new SpannableStringBuilder();
19899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Selection.setSelection(mDefaultKeySsb,0);
19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
19919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        default:
19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException();
19939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when a key was pressed down and not handled by any of the views
19989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * inside of the activity. So, for example, key presses while the cursor
19999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is inside a TextView will not trigger the event (unless it is a navigation
20009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to another object) because TextView handles its own key presses.
20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>If the focused view didn't want this event, this method is called.
20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
20048d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn     * <p>The default implementation takes care of {@link KeyEvent#KEYCODE_BACK}
20058d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn     * by calling {@link #onBackPressed()}, though the behavior varies based
20068d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn     * on the application compatibility mode: for
20078d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn     * {@link android.os.Build.VERSION_CODES#ECLAIR} or later applications,
20088d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn     * it will set up the dispatch to call {@link #onKeyUp} where the action
20098d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn     * will be performed; for earlier applications, it will perform the
20108d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn     * action immediately in on-down, as those versions of the platform
20118d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn     * behaved.
20128d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn     *
20138d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn     * <p>Other additional default key handling may be performed
201483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * if configured with {@link #setDefaultKeyMode}.
20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
20169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Return <code>true</code> to prevent this event from being propagated
20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * further, or <code>false</code> to indicate that you have not handled
20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this event and it should continue to be propagated.
20199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onKeyUp
20209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.view.KeyEvent
20219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
20229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onKeyDown(int keyCode, KeyEvent event)  {
202383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        if (keyCode == KeyEvent.KEYCODE_BACK) {
20248d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn            if (getApplicationInfo().targetSdkVersion
20258d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                    >= Build.VERSION_CODES.ECLAIR) {
20268d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                event.startTracking();
20278d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn            } else {
20288d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                onBackPressed();
20298d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn            }
20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mDefaultKeyMode == DEFAULT_KEYS_DISABLE) {
20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (mDefaultKeyMode == DEFAULT_KEYS_SHORTCUT) {
203683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            if (getWindow().performPanelShortcut(Window.FEATURE_OPTIONS_PANEL,
203783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                    keyCode, event, Menu.FLAG_ALWAYS_PERFORM_CLOSE)) {
203883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                return true;
203983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            }
204083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            return false;
20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Common code for DEFAULT_KEYS_DIALER & DEFAULT_KEYS_SEARCH_*
20439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean clearSpannable = false;
20449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean handled;
20459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((event.getRepeatCount() != 0) || event.isSystem()) {
20469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                clearSpannable = true;
20479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                handled = false;
20489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
204983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                handled = TextKeyListener.getInstance().onKeyDown(
205083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                        null, mDefaultKeySsb, keyCode, event);
20519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (handled && mDefaultKeySsb.length() > 0) {
20529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // something useable has been typed - dispatch it now.
20539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final String str = mDefaultKeySsb.toString();
20559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    clearSpannable = true;
20569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    switch (mDefaultKeyMode) {
20589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    case DEFAULT_KEYS_DIALER:
20599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Intent intent = new Intent(Intent.ACTION_DIAL,  Uri.parse("tel:" + str));
20609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        startActivity(intent);
20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
20639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    case DEFAULT_KEYS_SEARCH_LOCAL:
20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        startSearch(str, false, null, false);
20659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    case DEFAULT_KEYS_SEARCH_GLOBAL:
20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        startSearch(str, false, null, true);
20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
20699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
20709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (clearSpannable) {
20739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mDefaultKeySsb.clear();
20749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mDefaultKeySsb.clearSpans();
20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Selection.setSelection(mDefaultKeySsb,0);
20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return handled;
20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
208283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * Default implementation of {@link KeyEvent.Callback#onKeyLongPress(int, KeyEvent)
208383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * KeyEvent.Callback.onKeyLongPress()}: always returns false (doesn't handle
208483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * the event).
208583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
208683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public boolean onKeyLongPress(int keyCode, KeyEvent event) {
208783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        return false;
208883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    }
208983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
209083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
20919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when a key was released and not handled by any of the views
20929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * inside of the activity. So, for example, key presses while the cursor
20939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is inside a TextView will not trigger the event (unless it is a navigation
20949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to another object) because TextView handles its own key presses.
20959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
209683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * <p>The default implementation handles KEYCODE_BACK to stop the activity
209783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * and go back.
209883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     *
20999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Return <code>true</code> to prevent this event from being propagated
21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * further, or <code>false</code> to indicate that you have not handled
21019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this event and it should continue to be propagated.
21029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onKeyDown
21039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see KeyEvent
21049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
21059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onKeyUp(int keyCode, KeyEvent event) {
21068d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn        if (getApplicationInfo().targetSdkVersion
21078d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                >= Build.VERSION_CODES.ECLAIR) {
21088d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn            if (keyCode == KeyEvent.KEYCODE_BACK && event.isTracking()
21098d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                    && !event.isCanceled()) {
21108d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                onBackPressed();
21118d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                return true;
21128d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn            }
211383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        }
21149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
21159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
21189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default implementation of {@link KeyEvent.Callback#onKeyMultiple(int, int, KeyEvent)
21199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * KeyEvent.Callback.onKeyMultiple()}: always returns false (doesn't handle
21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the event).
21219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
21229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event) {
21239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
21249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
212783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * Called when the activity has detected the user's press of the back
212883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * key.  The default implementation simply finishes the current activity,
212983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * but you can override this to do whatever you want.
213083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
213183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public void onBackPressed() {
21323a57fb9e9c4f205ca6bd4f036b3080f92588d16dDianne Hackborn        if (!mFragments.popBackStackImmediate()) {
2133ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn            finish();
2134ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        }
213583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    }
213664da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown
213764da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown    /**
213864da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     * Called when a key shortcut event is not handled by any of the views in the Activity.
213964da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     * Override this method to implement global key shortcuts for the Activity.
214064da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     * Key shortcuts can also be implemented by setting the
214164da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     * {@link MenuItem#setShortcut(char, char) shortcut} property of menu items.
214264da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     *
214364da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     * @param keyCode The value in event.getKeyCode().
214464da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     * @param event Description of the key event.
214564da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     * @return True if the key shortcut was handled.
214664da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     */
214764da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown    public boolean onKeyShortcut(int keyCode, KeyEvent event) {
214864da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown        return false;
214964da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown    }
215064da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown
215183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
21529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when a touch screen event was not handled by any of the views
21539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * under it.  This is most useful to process touch events that happen
21549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * outside of your window bounds, where there is no view to receive it.
21559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param event The touch screen event being processed.
21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
21589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Return true if you have consumed the event, false if you haven't.
21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The default implementation always returns false.
21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onTouchEvent(MotionEvent event) {
2162cfaf8878de83b6bb7a24aee3c240259f428e6e4aDianne Hackborn        if (mWindow.shouldCloseOnTouch(this, event)) {
2163cfaf8878de83b6bb7a24aee3c240259f428e6e4aDianne Hackborn            finish();
2164cfaf8878de83b6bb7a24aee3c240259f428e6e4aDianne Hackborn            return true;
2165cfaf8878de83b6bb7a24aee3c240259f428e6e4aDianne Hackborn        }
2166cfaf8878de83b6bb7a24aee3c240259f428e6e4aDianne Hackborn
21679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
21719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when the trackball was moved and not handled by any of the
21729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * views inside of the activity.  So, for example, if the trackball moves
21739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * while focus is on a button, you will receive a call here because
21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * buttons do not normally do anything with trackball events.  The call
21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * here happens <em>before</em> trackball movements are converted to
21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * DPAD key events, which then get sent back to the view hierarchy, and
21779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will be processed at the point for things like focus navigation.
21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param event The trackball event being processed.
21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
21819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Return true if you have consumed the event, false if you haven't.
21829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The default implementation always returns false.
21839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
21849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onTrackballEvent(MotionEvent event) {
21859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
21869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2187cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
2188cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    /**
2189cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * Called when a generic motion event was not handled by any of the
2190cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * views inside of the activity.
2191cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * <p>
219233bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown     * Generic motion events describe joystick movements, mouse hovers, track pad
219333bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown     * touches, scroll wheel movements and other input events.  The
2194cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * {@link MotionEvent#getSource() source} of the motion event specifies
2195cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * the class of input that was received.  Implementations of this method
2196cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * must examine the bits in the source before processing the event.
2197cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * The following code example shows how this is done.
219833bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown     * </p><p>
219933bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown     * Generic motion events with source class
220033bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown     * {@link android.view.InputDevice#SOURCE_CLASS_POINTER}
220133bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown     * are delivered to the view under the pointer.  All other generic motion events are
220233bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown     * delivered to the focused view.
220333bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown     * </p><p>
220433bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown     * See {@link View#onGenericMotionEvent(MotionEvent)} for an example of how to
220533bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown     * handle this event.
2206cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * </p>
2207cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     *
2208cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * @param event The generic motion event being processed.
2209cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     *
2210cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * @return Return true if you have consumed the event, false if you haven't.
2211cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * The default implementation always returns false.
2212cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     */
2213cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    public boolean onGenericMotionEvent(MotionEvent event) {
2214cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        return false;
2215cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    }
2216cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
22189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called whenever a key, touch, or trackball event is dispatched to the
22199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity.  Implement this method if you wish to know that the user has
22209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * interacted with the device in some way while your activity is running.
22219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This callback and {@link #onUserLeaveHint} are intended to help
22229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activities manage status bar notifications intelligently; specifically,
22239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for helping activities determine the proper time to cancel a notfication.
22249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
22259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>All calls to your activity's {@link #onUserLeaveHint} callback will
22269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be accompanied by calls to {@link #onUserInteraction}.  This
22279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ensures that your activity will be told of relevant user activity such
22289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * as pulling down the notification pane and touching an item there.
22299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
22309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note that this callback will be invoked for the touch down action
22319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that begins a touch gesture, but may not be invoked for the touch-moved
22329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and touch-up actions that follow.
22339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
22349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onUserLeaveHint()
22359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
22369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onUserInteraction() {
22379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onWindowAttributesChanged(WindowManager.LayoutParams params) {
22409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Update window manager if: we have a view, that view is
22419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // attached to its parent (which will be a RootView), and
22429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this activity is not embedded.
22439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent == null) {
22449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            View decor = mDecor;
22459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (decor != null && decor.getParent() != null) {
22469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                getWindowManager().updateViewLayout(decor, params);
22479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onContentChanged() {
22529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
22559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when the current {@link Window} of the activity gains or loses
22569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * focus.  This is the best indicator of whether this activity is visible
225783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * to the user.  The default implementation clears the key tracking
225883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * state, so should always be called.
22599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
226083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * <p>Note that this provides information about global focus state, which
22619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is managed independently of activity lifecycles.  As such, while focus
22629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * changes will generally have some relation to lifecycle changes (an
22639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity that is stopped will not generally get window focus), you
22649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * should not rely on any particular order between the callbacks here and
22659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * those in the other lifecycle methods such as {@link #onResume}.
22669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
22679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>As a general rule, however, a resumed activity will have window
22689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * focus...  unless it has displayed other dialogs or popups that take
22699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * input focus, in which case the activity itself will not have focus
22709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * when the other windows have it.  Likewise, the system may display
22719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * system-level windows (such as the status bar notification panel or
22729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a system alert) which will temporarily take window input focus without
22739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * pausing the foreground activity.
22749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
22759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param hasFocus Whether the window of this activity has focus.
22769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
22779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #hasWindowFocus()
22789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onResume
22793be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     * @see View#onWindowFocusChanged(boolean)
22809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
22819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onWindowFocusChanged(boolean hasFocus) {
22829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
22853be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     * Called when the main window associated with the activity has been
22863be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     * attached to the window manager.
22873be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     * See {@link View#onAttachedToWindow() View.onAttachedToWindow()}
22883be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     * for more information.
22893be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     * @see View#onAttachedToWindow
22903be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     */
22913be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn    public void onAttachedToWindow() {
22923be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn    }
22933be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn
22943be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn    /**
22953be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     * Called when the main window associated with the activity has been
22963be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     * detached from the window manager.
22973be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     * See {@link View#onDetachedFromWindow() View.onDetachedFromWindow()}
22983be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     * for more information.
22993be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     * @see View#onDetachedFromWindow
23003be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     */
23013be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn    public void onDetachedFromWindow() {
23023be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn    }
23033be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn
23043be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn    /**
23059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns true if this activity's <em>main</em> window currently has window focus.
23069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Note that this is not the same as the view itself having focus.
23079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if this activity's main window currently has window focus.
23099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onWindowAttributesChanged(android.view.WindowManager.LayoutParams)
23119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
23129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean hasWindowFocus() {
23139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Window w = getWindow();
23149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (w != null) {
23159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            View d = w.getDecorView();
23169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (d != null) {
23179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return d.hasWindowFocus();
23189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
23219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
23249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called to process key events.  You can override this to intercept all
23259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * key events before they are dispatched to the window.  Be sure to call
23269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this implementation for key events that should be handled normally.
23279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param event The key event.
23299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return boolean Return true if this event was consumed.
23319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
23329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean dispatchKeyEvent(KeyEvent event) {
23339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onUserInteraction();
23348d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn        Window win = getWindow();
23358d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn        if (win.superDispatchKeyEvent(event)) {
23369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
23379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23388d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn        View decor = mDecor;
23398d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn        if (decor == null) decor = win.getDecorView();
23408d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn        return event.dispatch(this, decor != null
23418d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                ? decor.getKeyDispatcherState() : null, this);
23429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
234564da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     * Called to process a key shortcut event.
234664da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     * You can override this to intercept all key shortcut events before they are
234764da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     * dispatched to the window.  Be sure to call this implementation for key shortcut
234864da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     * events that should be handled normally.
234964da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     *
235064da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     * @param event The key shortcut event.
235164da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     * @return True if this event was consumed.
235264da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     */
235364da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown    public boolean dispatchKeyShortcutEvent(KeyEvent event) {
235464da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown        onUserInteraction();
235564da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown        if (getWindow().superDispatchKeyShortcutEvent(event)) {
235664da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown            return true;
235764da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown        }
235864da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown        return onKeyShortcut(event.getKeyCode(), event);
235964da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown    }
236064da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown
236164da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown    /**
23629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called to process touch screen events.  You can override this to
23639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * intercept all touch screen events before they are dispatched to the
23649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * window.  Be sure to call this implementation for touch screen events
23659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that should be handled normally.
23669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param ev The touch screen event.
23689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return boolean Return true if this event was consumed.
23709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
23719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean dispatchTouchEvent(MotionEvent ev) {
23729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
23739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            onUserInteraction();
23749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (getWindow().superDispatchTouchEvent(ev)) {
23769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
23779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return onTouchEvent(ev);
23799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
23829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called to process trackball events.  You can override this to
23839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * intercept all trackball events before they are dispatched to the
23849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * window.  Be sure to call this implementation for trackball events
23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that should be handled normally.
23869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param ev The trackball event.
23889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return boolean Return true if this event was consumed.
23909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
23919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean dispatchTrackballEvent(MotionEvent ev) {
23929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onUserInteraction();
23939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (getWindow().superDispatchTrackballEvent(ev)) {
23949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
23959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return onTrackballEvent(ev);
23979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
239875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
2399cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    /**
2400cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * Called to process generic motion events.  You can override this to
2401cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * intercept all generic motion events before they are dispatched to the
2402cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * window.  Be sure to call this implementation for generic motion events
2403cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * that should be handled normally.
2404cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     *
2405cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * @param ev The generic motion event.
2406cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     *
2407cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * @return boolean Return true if this event was consumed.
2408cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     */
2409cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    public boolean dispatchGenericMotionEvent(MotionEvent ev) {
2410cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        onUserInteraction();
2411cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        if (getWindow().superDispatchGenericMotionEvent(ev)) {
2412cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            return true;
2413cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        }
2414cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        return onGenericMotionEvent(ev);
2415cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    }
2416cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
241775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
241875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        event.setClassName(getClass().getName());
241975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        event.setPackageName(getPackageName());
242075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
242175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        LayoutParams params = getWindow().getAttributes();
2422980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy        boolean isFullScreen = (params.width == LayoutParams.MATCH_PARENT) &&
2423980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy            (params.height == LayoutParams.MATCH_PARENT);
242475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        event.setFullScreen(isFullScreen);
242575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
242675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        CharSequence title = getTitle();
242775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        if (!TextUtils.isEmpty(title)) {
242875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov           event.getText().add(title);
242975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        }
243075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
243175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        return true;
243275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    }
243375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
24349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
24359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default implementation of
24369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window.Callback#onCreatePanelView}
24379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for activities. This
24389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * simply returns null so that all panel sub-windows will have the default
24399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * menu behavior.
24409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
24419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public View onCreatePanelView(int featureId) {
24429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
24439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
24469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default implementation of
24479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window.Callback#onCreatePanelMenu}
24489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for activities.  This calls through to the new
24499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onCreateOptionsMenu} method for the
24509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window#FEATURE_OPTIONS_PANEL} panel,
24519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * so that subclasses of Activity don't need to deal with feature codes.
24529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
24539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onCreatePanelMenu(int featureId, Menu menu) {
24549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (featureId == Window.FEATURE_OPTIONS_PANEL) {
2455b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn            boolean show = onCreateOptionsMenu(menu);
2456b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn            show |= mFragments.dispatchCreateOptionsMenu(menu, getMenuInflater());
2457b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn            return show;
24589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
24609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
24639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default implementation of
24649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window.Callback#onPreparePanel}
24659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for activities.  This
24669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * calls through to the new {@link #onPrepareOptionsMenu} method for the
24679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window#FEATURE_OPTIONS_PANEL}
24689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * panel, so that subclasses of
24699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Activity don't need to deal with feature codes.
24709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
24719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onPreparePanel(int featureId, View view, Menu menu) {
24729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (featureId == Window.FEATURE_OPTIONS_PANEL && menu != null) {
24739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean goforit = onPrepareOptionsMenu(menu);
2474b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn            goforit |= mFragments.dispatchPrepareOptionsMenu(menu);
24759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return goforit && menu.hasVisibleItems();
24769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
24789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
24819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
24829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
24839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The default implementation returns true.
24849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
24859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onMenuOpened(int featureId, Menu menu) {
24868515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell        if (featureId == Window.FEATURE_ACTION_BAR) {
2487763cbb134f40fa1e555c0a945a2a651f69193505Adam Powell            initActionBar();
2488049dd3d4a4869e0c65d370e2538fcfb55bacef52Adam Powell            if (mActionBar != null) {
2489049dd3d4a4869e0c65d370e2538fcfb55bacef52Adam Powell                mActionBar.dispatchMenuVisibilityChanged(true);
2490049dd3d4a4869e0c65d370e2538fcfb55bacef52Adam Powell            } else {
2491049dd3d4a4869e0c65d370e2538fcfb55bacef52Adam Powell                Log.e(TAG, "Tried to open action bar menu with no action bar");
2492049dd3d4a4869e0c65d370e2538fcfb55bacef52Adam Powell            }
24938515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell        }
24949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
24959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
24989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default implementation of
24999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window.Callback#onMenuItemSelected}
25009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for activities.  This calls through to the new
25019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onOptionsItemSelected} method for the
25029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window#FEATURE_OPTIONS_PANEL}
25039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * panel, so that subclasses of
25049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Activity don't need to deal with feature codes.
25059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
25069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onMenuItemSelected(int featureId, MenuItem item) {
25079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (featureId) {
25089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case Window.FEATURE_OPTIONS_PANEL:
25099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Put event logging here so it gets called even if subclass
25109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // doesn't call through to superclass's implmeentation of each
25119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // of these methods below
25129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                EventLog.writeEvent(50000, 0, item.getTitleCondensed());
2513b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                if (onOptionsItemSelected(item)) {
2514b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                    return true;
2515b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                }
2516b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                return mFragments.dispatchOptionsItemSelected(item);
25179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case Window.FEATURE_CONTEXT_MENU:
25199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                EventLog.writeEvent(50000, 1, item.getTitleCondensed());
25205ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn                if (onContextItemSelected(item)) {
25215ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn                    return true;
25225ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn                }
25235ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn                return mFragments.dispatchContextItemSelected(item);
25248515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell
25259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default:
25269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
25279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
25319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default implementation of
25329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window.Callback#onPanelClosed(int, Menu)} for
25339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activities. This calls through to {@link #onOptionsMenuClosed(Menu)}
25349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * method for the {@link android.view.Window#FEATURE_OPTIONS_PANEL} panel,
25359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * so that subclasses of Activity don't need to deal with feature codes.
25369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * For context menus ({@link Window#FEATURE_CONTEXT_MENU}), the
25379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onContextMenuClosed(Menu)} will be called.
25389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
25399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onPanelClosed(int featureId, Menu menu) {
25409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (featureId) {
25419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case Window.FEATURE_OPTIONS_PANEL:
2542b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                mFragments.dispatchOptionsMenuClosed(menu);
25439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                onOptionsMenuClosed(menu);
25449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
25459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case Window.FEATURE_CONTEXT_MENU:
25479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                onContextMenuClosed(menu);
25489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
25498515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell
25508515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell            case Window.FEATURE_ACTION_BAR:
25519b4bee0f14bbd137b0797127aff2df46a6321ec5Adam Powell                initActionBar();
25528515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell                mActionBar.dispatchMenuVisibilityChanged(false);
25538515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell                break;
25549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2558b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     * Declare that the options menu has changed, so should be recreated.
2559b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     * The {@link #onCreateOptionsMenu(Menu)} method will be called the next
2560b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     * time it needs to be displayed.
2561b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     */
2562b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    public void invalidateOptionsMenu() {
2563b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn        mWindow.invalidatePanelMenu(Window.FEATURE_OPTIONS_PANEL);
2564b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    }
2565b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn
2566b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    /**
25679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Initialize the contents of the Activity's standard options menu.  You
25689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * should place your menu items in to <var>menu</var>.
25699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
25709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This is only called once, the first time the options menu is
25719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * displayed.  To update the menu every time it is displayed, see
25729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onPrepareOptionsMenu}.
25739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
25749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The default implementation populates the menu with standard system
25759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * menu items.  These are placed in the {@link Menu#CATEGORY_SYSTEM} group so that
25769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * they will be correctly ordered with application-defined menu items.
25779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Deriving classes should always call through to the base implementation.
25789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
25799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>You can safely hold on to <var>menu</var> (and any items created
25809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * from it), making modifications to it as desired, until the next
25819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * time onCreateOptionsMenu() is called.
25829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
25839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>When you add items to the menu, you can implement the Activity's
25849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onOptionsItemSelected} method to handle them there.
25859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
25869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param menu The options menu in which you place your items.
25879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
25889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return You must return true for the menu to be displayed;
25899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         if you return false it will not be shown.
25909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
25919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPrepareOptionsMenu
25929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onOptionsItemSelected
25939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
25949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onCreateOptionsMenu(Menu menu) {
25959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent != null) {
25969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mParent.onCreateOptionsMenu(menu);
25979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
25999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
26029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Prepare the Screen's standard options menu to be displayed.  This is
26039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * called right before the menu is shown, every time it is shown.  You can
26049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * use this method to efficiently enable/disable items or otherwise
26059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * dynamically modify the contents.
26069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The default implementation updates the system menu items based on the
26089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity's state.  Deriving classes should always call through to the
26099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * base class implementation.
26109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param menu The options menu as last shown or first initialized by
26129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             onCreateOptionsMenu().
26139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return You must return true for the menu to be displayed;
26159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         if you return false it will not be shown.
26169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onCreateOptionsMenu
26189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
26199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onPrepareOptionsMenu(Menu menu) {
26209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent != null) {
26219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mParent.onPrepareOptionsMenu(menu);
26229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
26249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
26279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This hook is called whenever an item in your options menu is selected.
26289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The default implementation simply returns false to have the normal
26299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * processing happen (calling the item's Runnable or sending a message to
26309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * its Handler as appropriate).  You can use this method for any items
26319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for which you would like to do processing without those other
26329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * facilities.
26339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Derived classes should call through to the base class for it to
26359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * perform the default menu handling.
26369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param item The menu item that was selected.
26389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return boolean Return false to allow normal menu processing to
26409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         proceed, true to consume it here.
26419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onCreateOptionsMenu
26439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
26449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onOptionsItemSelected(MenuItem item) {
26459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent != null) {
26469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mParent.onOptionsItemSelected(item);
26479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
26499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
26529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This hook is called whenever the options menu is being closed (either by the user canceling
26539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the menu with the back/menu button, or when an item is selected).
26549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param menu The options menu as last shown or first initialized by
26569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             onCreateOptionsMenu().
26579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
26589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onOptionsMenuClosed(Menu menu) {
26599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent != null) {
26609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParent.onOptionsMenuClosed(menu);
26619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
26659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Programmatically opens the options menu. If the options menu is already
26669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * open, this method does nothing.
26679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
26689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void openOptionsMenu() {
26699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindow.openPanel(Window.FEATURE_OPTIONS_PANEL, null);
26709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
26739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Progammatically closes the options menu. If the options menu is already
26749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * closed, this method does nothing.
26759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
26769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void closeOptionsMenu() {
26779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindow.closePanel(Window.FEATURE_OPTIONS_PANEL);
26789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
26819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when a context menu for the {@code view} is about to be shown.
26829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Unlike {@link #onCreateOptionsMenu(Menu)}, this will be called every
26839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * time the context menu is about to be shown and should be populated for
26849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the view (or item inside the view for {@link AdapterView} subclasses,
26859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this can be found in the {@code menuInfo})).
26869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
26879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use {@link #onContextItemSelected(android.view.MenuItem)} to know when an
26889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * item has been selected.
26899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
26909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * It is not safe to hold onto the context menu after this method returns.
26919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
26929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
26939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
26949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
26979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Registers a context menu to be shown for the given view (multiple views
26989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * can show the context menu). This method will set the
26999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link OnCreateContextMenuListener} on the view to this activity, so
27009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onCreateContextMenu(ContextMenu, View, ContextMenuInfo)} will be
27019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * called when it is time to show the context menu.
27029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
27039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #unregisterForContextMenu(View)
27049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param view The view that should show a context menu.
27059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
27069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void registerForContextMenu(View view) {
27079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        view.setOnCreateContextMenuListener(this);
27089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
27119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Prevents a context menu to be shown for the given view. This method will remove the
27129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link OnCreateContextMenuListener} on the view.
27139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
27149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #registerForContextMenu(View)
27159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param view The view that should stop showing a context menu.
27169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
27179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void unregisterForContextMenu(View view) {
27189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        view.setOnCreateContextMenuListener(null);
27199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
27229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Programmatically opens the context menu for a particular {@code view}.
27239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The {@code view} should have been added via
27249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #registerForContextMenu(View)}.
27259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
27269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param view The view to show the context menu for.
27279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
27289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void openContextMenu(View view) {
27299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        view.showContextMenu();
27309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
27339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Programmatically closes the most recently opened context menu, if showing.
27349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
27359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void closeContextMenu() {
27369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindow.closePanel(Window.FEATURE_CONTEXT_MENU);
27379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
27409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This hook is called whenever an item in a context menu is selected. The
27419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * default implementation simply returns false to have the normal processing
27429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * happen (calling the item's Runnable or sending a message to its Handler
27439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * as appropriate). You can use this method for any items for which you
27449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * would like to do processing without those other facilities.
27459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
27469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use {@link MenuItem#getMenuInfo()} to get extra information set by the
27479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * View that added this menu item.
27489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
27499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Derived classes should call through to the base class for it to perform
27509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the default menu handling.
27519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
27529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param item The context menu item that was selected.
27539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return boolean Return false to allow normal context menu processing to
27549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         proceed, true to consume it here.
27559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
27569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onContextItemSelected(MenuItem item) {
27579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent != null) {
27589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mParent.onContextItemSelected(item);
27599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
27619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
27649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This hook is called whenever the context menu is being closed (either by
27659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the user canceling the menu with the back/menu button, or when an item is
27669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * selected).
27679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
27689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param menu The context menu that is being closed.
27699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
27709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onContextMenuClosed(Menu menu) {
27719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent != null) {
27729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParent.onContextMenuClosed(menu);
27739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
27778ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @deprecated Old no-arguments version of {@link #onCreateDialog(int, Bundle)}.
27788ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     */
27798ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    @Deprecated
27808ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    protected Dialog onCreateDialog(int id) {
27818ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        return null;
27828ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    }
27838ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn
27848ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    /**
27859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Callback for creating dialogs that are managed (saved and restored) for you
27868ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * by the activity.  The default implementation calls through to
27878ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * {@link #onCreateDialog(int)} for compatibility.
27889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2789291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * <em>If you are targeting {@link android.os.Build.VERSION_CODES#HONEYCOMB}
2790291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * or later, consider instead using a {@link DialogFragment} instead.</em>
2791291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     *
27928ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * <p>If you use {@link #showDialog(int)}, the activity will call through to
27939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this method the first time, and hang onto it thereafter.  Any dialog
27949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that is created by this method will automatically be saved and restored
27959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for you, including whether it is showing.
27969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
27978ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * <p>If you would like the activity to manage saving and restoring dialogs
27989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for you, you should override this method and handle any ids that are
27999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * passed to {@link #showDialog}.
28009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28018ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * <p>If you would like an opportunity to prepare your dialog before it is shown,
28028ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * override {@link #onPrepareDialog(int, Dialog, Bundle)}.
28039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param id The id of the dialog.
28058ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @param args The dialog arguments provided to {@link #showDialog(int, Bundle)}.
28068ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @return The dialog.  If you return null, the dialog will not be created.
28079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28088ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @see #onPrepareDialog(int, Dialog, Bundle)
28098ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @see #showDialog(int, Bundle)
28109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #dismissDialog(int)
28119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #removeDialog(int)
2812271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     *
2813271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * @deprecated Use the new {@link DialogFragment} class with
2814271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * {@link FragmentManager} instead; this is also
2815271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * available on older platforms through the Android compatibility package.
28169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
28179567a66a5e6f49dd8495fb5f6e2efb9f32e84b35Dianne Hackborn    @Deprecated
28188ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    protected Dialog onCreateDialog(int id, Bundle args) {
28198ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        return onCreateDialog(id);
28208ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    }
28218ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn
28228ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    /**
28238ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @deprecated Old no-arguments version of
28248ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * {@link #onPrepareDialog(int, Dialog, Bundle)}.
28258ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     */
28268ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    @Deprecated
28278ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    protected void onPrepareDialog(int id, Dialog dialog) {
28288ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        dialog.setOwnerActivity(this);
28299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
28329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Provides an opportunity to prepare a managed dialog before it is being
28338ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * shown.  The default implementation calls through to
28348ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * {@link #onPrepareDialog(int, Dialog)} for compatibility.
28358ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     *
28369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
28379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Override this if you need to update a managed dialog based on the state
28389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of the application each time it is shown. For example, a time picker
28399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * dialog might want to be updated with the current time. You should call
28409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * through to the superclass's implementation. The default implementation
28419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will set this Activity as the owner activity on the Dialog.
28429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param id The id of the managed dialog.
28449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param dialog The dialog.
28458ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @param args The dialog arguments provided to {@link #showDialog(int, Bundle)}.
28468ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @see #onCreateDialog(int, Bundle)
28479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #showDialog(int)
28489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #dismissDialog(int)
28499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #removeDialog(int)
2850271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     *
2851271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * @deprecated Use the new {@link DialogFragment} class with
2852271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * {@link FragmentManager} instead; this is also
2853271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * available on older platforms through the Android compatibility package.
28549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
28559567a66a5e6f49dd8495fb5f6e2efb9f32e84b35Dianne Hackborn    @Deprecated
28568ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    protected void onPrepareDialog(int id, Dialog dialog, Bundle args) {
28578ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        onPrepareDialog(id, dialog);
28589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
28618ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * Simple version of {@link #showDialog(int, Bundle)} that does not
28628ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * take any arguments.  Simply calls {@link #showDialog(int, Bundle)}
28638ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * with null arguments.
2864271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     *
2865271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * @deprecated Use the new {@link DialogFragment} class with
2866271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * {@link FragmentManager} instead; this is also
2867271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * available on older platforms through the Android compatibility package.
28688ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     */
28699567a66a5e6f49dd8495fb5f6e2efb9f32e84b35Dianne Hackborn    @Deprecated
28708ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    public final void showDialog(int id) {
28718ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        showDialog(id, null);
28728ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    }
28738ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn
28748ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    /**
28758ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * Show a dialog managed by this activity.  A call to {@link #onCreateDialog(int, Bundle)}
28769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will be made with the same id the first time this is called for a given
28779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * id.  From thereafter, the dialog will be automatically saved and restored.
28789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2879291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * <em>If you are targeting {@link android.os.Build.VERSION_CODES#HONEYCOMB}
2880291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * or later, consider instead using a {@link DialogFragment} instead.</em>
2881291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     *
28828ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * <p>Each time a dialog is shown, {@link #onPrepareDialog(int, Dialog, Bundle)} will
28839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be made to provide an opportunity to do any timely preparation.
28849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param id The id of the managed dialog.
28868ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @param args Arguments to pass through to the dialog.  These will be saved
28878ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * and restored for you.  Note that if the dialog is already created,
28888ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * {@link #onCreateDialog(int, Bundle)} will not be called with the new
28898ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * arguments but {@link #onPrepareDialog(int, Dialog, Bundle)} will be.
2890d47c6ed4a9f2b5bd31f6c806b74701428efe458bDianne Hackborn     * If you need to rebuild the dialog, call {@link #removeDialog(int)} first.
28918ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @return Returns true if the Dialog was created; false is returned if
28928ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * it is not created because {@link #onCreateDialog(int, Bundle)} returns false.
28938ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     *
289437296dc4edae8d1383179e956dff2ecf806ac166Joe Onorato     * @see Dialog
28958ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @see #onCreateDialog(int, Bundle)
28968ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @see #onPrepareDialog(int, Dialog, Bundle)
28979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #dismissDialog(int)
28989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #removeDialog(int)
2899271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     *
2900271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * @deprecated Use the new {@link DialogFragment} class with
2901271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * {@link FragmentManager} instead; this is also
2902271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * available on older platforms through the Android compatibility package.
29039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
29049567a66a5e6f49dd8495fb5f6e2efb9f32e84b35Dianne Hackborn    @Deprecated
29058ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    public final boolean showDialog(int id, Bundle args) {
29069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mManagedDialogs == null) {
29078ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            mManagedDialogs = new SparseArray<ManagedDialog>();
29089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29098ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        ManagedDialog md = mManagedDialogs.get(id);
29108ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        if (md == null) {
29118ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            md = new ManagedDialog();
29128ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            md.mDialog = createDialog(id, null, args);
29138ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            if (md.mDialog == null) {
29148ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                return false;
29158ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            }
29168ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            mManagedDialogs.put(id, md);
29179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29198ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        md.mArgs = args;
29208ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        onPrepareDialog(id, md.mDialog, args);
29218ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        md.mDialog.show();
29228ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        return true;
29239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
29269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Dismiss a dialog that was previously shown via {@link #showDialog(int)}.
29279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
29289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param id The id of the managed dialog.
29299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
29309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalArgumentException if the id was not previously shown via
29319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *   {@link #showDialog(int)}.
29329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
29338ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @see #onCreateDialog(int, Bundle)
29348ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @see #onPrepareDialog(int, Dialog, Bundle)
29359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #showDialog(int)
29369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #removeDialog(int)
2937271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     *
2938271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * @deprecated Use the new {@link DialogFragment} class with
2939271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * {@link FragmentManager} instead; this is also
2940271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * available on older platforms through the Android compatibility package.
29419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
29429567a66a5e6f49dd8495fb5f6e2efb9f32e84b35Dianne Hackborn    @Deprecated
29439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void dismissDialog(int id) {
29449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mManagedDialogs == null) {
29459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw missingDialog(id);
29469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29478ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn
29488ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        final ManagedDialog md = mManagedDialogs.get(id);
29498ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        if (md == null) {
29509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw missingDialog(id);
29519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29528ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        md.mDialog.dismiss();
29539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
29569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Creates an exception to throw if a user passed in a dialog id that is
29579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * unexpected.
29589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
29599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IllegalArgumentException missingDialog(int id) {
29609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new IllegalArgumentException("no dialog with id " + id + " was ever "
29619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + "shown via Activity#showDialog");
29629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
29659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Removes any internal references to a dialog managed by this Activity.
29669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If the dialog is showing, it will dismiss it as part of the clean up.
29679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
29688ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * <p>This can be useful if you know that you will never show a dialog again and
29699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * want to avoid the overhead of saving and restoring it in the future.
29709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2971d2ce8bbb84607b1f456b9af00d8d7b84a4610a79Dianne Hackborn     * <p>As of {@link android.os.Build.VERSION_CODES#GINGERBREAD}, this function
2972d2ce8bbb84607b1f456b9af00d8d7b84a4610a79Dianne Hackborn     * will not throw an exception if you try to remove an ID that does not
2973d2ce8bbb84607b1f456b9af00d8d7b84a4610a79Dianne Hackborn     * currently have an associated dialog.</p>
2974d2ce8bbb84607b1f456b9af00d8d7b84a4610a79Dianne Hackborn     *
29759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param id The id of the managed dialog.
29769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
29778ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @see #onCreateDialog(int, Bundle)
29788ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @see #onPrepareDialog(int, Dialog, Bundle)
29799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #showDialog(int)
29809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #dismissDialog(int)
2981271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     *
2982271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * @deprecated Use the new {@link DialogFragment} class with
2983271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * {@link FragmentManager} instead; this is also
2984271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * available on older platforms through the Android compatibility package.
29859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
29869567a66a5e6f49dd8495fb5f6e2efb9f32e84b35Dianne Hackborn    @Deprecated
29879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void removeDialog(int id) {
2988d2ce8bbb84607b1f456b9af00d8d7b84a4610a79Dianne Hackborn        if (mManagedDialogs != null) {
2989d2ce8bbb84607b1f456b9af00d8d7b84a4610a79Dianne Hackborn            final ManagedDialog md = mManagedDialogs.get(id);
2990d2ce8bbb84607b1f456b9af00d8d7b84a4610a79Dianne Hackborn            if (md != null) {
2991d2ce8bbb84607b1f456b9af00d8d7b84a4610a79Dianne Hackborn                md.mDialog.dismiss();
2992d2ce8bbb84607b1f456b9af00d8d7b84a4610a79Dianne Hackborn                mManagedDialogs.remove(id);
2993d2ce8bbb84607b1f456b9af00d8d7b84a4610a79Dianne Hackborn            }
29949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
29989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This hook is called when the user signals the desire to start a search.
29999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
30006266e40a754d82afa717ef068898c8418a0bb5c3Bjorn Bringert     * <p>You can use this function as a simple way to launch the search UI, in response to a
30016266e40a754d82afa717ef068898c8418a0bb5c3Bjorn Bringert     * menu item, search button, or other widgets within your activity. Unless overidden,
30026266e40a754d82afa717ef068898c8418a0bb5c3Bjorn Bringert     * calling this function is the same as calling
30036266e40a754d82afa717ef068898c8418a0bb5c3Bjorn Bringert     * {@link #startSearch startSearch(null, false, null, false)}, which launches
30046266e40a754d82afa717ef068898c8418a0bb5c3Bjorn Bringert     * search for the current activity as specified in its manifest, see {@link SearchManager}.
30059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
30069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>You can override this function to force global search, e.g. in response to a dedicated
30079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * search key, or to block search entirely (by simply returning false).
30089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
30096266e40a754d82afa717ef068898c8418a0bb5c3Bjorn Bringert     * @return Returns {@code true} if search launched, and {@code false} if activity blocks it.
30106266e40a754d82afa717ef068898c8418a0bb5c3Bjorn Bringert     *         The default implementation always returns {@code true}.
30119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
30129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.app.SearchManager
30139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
30149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onSearchRequested() {
30159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        startSearch(null, false, null, false);
30169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
30179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
30209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This hook is called to launch the search UI.
30219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
30229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>It is typically called from onSearchRequested(), either directly from
30239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Activity.onSearchRequested() or from an overridden version in any given
30249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Activity.  If your goal is simply to activate search, it is preferred to call
30259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * onSearchRequested(), which may have been overriden elsewhere in your Activity.  If your goal
30269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is to inject specific data such as context data, it is preferred to <i>override</i>
30279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * onSearchRequested(), so that any callers to it will benefit from the override.
30289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
30299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param initialQuery Any non-null non-empty string will be inserted as
30309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * pre-entered text in the search query box.
30319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param selectInitialQuery If true, the intial query will be preselected, which means that
30329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * any further typing will replace it.  This is useful for cases where an entire pre-formed
30339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * query is being inserted.  If false, the selection point will be placed at the end of the
30349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * inserted query.  This is useful when the inserted query is text that the user entered,
30359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and the user would expect to be able to keep typing.  <i>This parameter is only meaningful
30369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if initialQuery is a non-empty string.</i>
30379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param appSearchData An application can insert application-specific
30389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * context here, in order to improve quality or specificity of its own
30399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * searches.  This data will be returned with SEARCH intent(s).  Null if
30409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * no extra data is required.
30419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param globalSearch If false, this will only launch the search that has been specifically
30429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * defined by the application (which is usually defined as a local search).  If no default
3043cfa419b754332e12f8cd45244c2f3bee9d6a74bbMike LeBeau     * search is defined in the current application or activity, global search will be launched.
30449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If true, this will always launch a platform-global (e.g. web-based) search instead.
30459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
30469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.app.SearchManager
30479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onSearchRequested
30489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
30499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startSearch(String initialQuery, boolean selectInitialQuery,
30509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Bundle appSearchData, boolean globalSearch) {
3051b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn        ensureSearchManager();
30528d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert        mSearchManager.startSearch(initialQuery, selectInitialQuery, getComponentName(),
30539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        appSearchData, globalSearch);
30549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3057d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     * Similar to {@link #startSearch}, but actually fires off the search query after invoking
3058d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     * the search dialog.  Made available for testing purposes.
3059d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     *
3060d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     * @param query The query to trigger.  If empty, the request will be ignored.
3061d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     * @param appSearchData An application can insert application-specific
3062d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     * context here, in order to improve quality or specificity of its own
3063d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     * searches.  This data will be returned with SEARCH intent(s).  Null if
3064d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     * no extra data is required.
3065d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     */
3066b782a2f4f0a3072f2677f6f10fb255c77468ae66Bjorn Bringert    public void triggerSearch(String query, Bundle appSearchData) {
3067d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen        ensureSearchManager();
3068b782a2f4f0a3072f2677f6f10fb255c77468ae66Bjorn Bringert        mSearchManager.triggerSearch(query, getComponentName(), appSearchData);
3069d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen    }
3070d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen
3071d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen    /**
30729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Request that key events come to this activity. Use this if your
30739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity has no views with focus, but the activity still wants
30749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a chance to process key events.
30759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
30769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.view.Window#takeKeyEvents
30779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
30789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void takeKeyEvents(boolean get) {
30799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().takeKeyEvents(get);
30809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
30839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Enable extended window features.  This is a convenience for calling
30849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window#requestFeature getWindow().requestFeature()}.
30859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
30869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param featureId The desired feature as defined in
30879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                  {@link android.view.Window}.
30889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns true if the requested feature is supported and now
30899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         enabled.
30909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
30919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.view.Window#requestFeature
30929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
30939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean requestWindowFeature(int featureId) {
30949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getWindow().requestFeature(featureId);
30959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
30989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Convenience for calling
30999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window#setFeatureDrawableResource}.
31009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
31019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setFeatureDrawableResource(int featureId, int resId) {
31029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setFeatureDrawableResource(featureId, resId);
31039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
31069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Convenience for calling
31079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window#setFeatureDrawableUri}.
31089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
31099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setFeatureDrawableUri(int featureId, Uri uri) {
31109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setFeatureDrawableUri(featureId, uri);
31119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
31149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Convenience for calling
31159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window#setFeatureDrawable(int, Drawable)}.
31169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
31179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setFeatureDrawable(int featureId, Drawable drawable) {
31189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setFeatureDrawable(featureId, drawable);
31199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
31229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Convenience for calling
31239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window#setFeatureDrawableAlpha}.
31249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
31259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setFeatureDrawableAlpha(int featureId, int alpha) {
31269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setFeatureDrawableAlpha(featureId, alpha);
31279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
31309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Convenience for calling
31319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window#getLayoutInflater}.
31329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
31339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public LayoutInflater getLayoutInflater() {
31349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getWindow().getLayoutInflater();
31359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
31389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns a {@link MenuInflater} with this context.
31399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
31409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public MenuInflater getMenuInflater() {
314188ab69780f58e4b32d497266b2ad646a4d74827bAdam Powell        // Make sure that action views can get an appropriate theme.
314288ab69780f58e4b32d497266b2ad646a4d74827bAdam Powell        if (mMenuInflater == null) {
314388ab69780f58e4b32d497266b2ad646a4d74827bAdam Powell            initActionBar();
314488ab69780f58e4b32d497266b2ad646a4d74827bAdam Powell            if (mActionBar != null) {
314588ab69780f58e4b32d497266b2ad646a4d74827bAdam Powell                mMenuInflater = new MenuInflater(mActionBar.getThemedContext());
314688ab69780f58e4b32d497266b2ad646a4d74827bAdam Powell            } else {
314788ab69780f58e4b32d497266b2ad646a4d74827bAdam Powell                mMenuInflater = new MenuInflater(this);
314888ab69780f58e4b32d497266b2ad646a4d74827bAdam Powell            }
314988ab69780f58e4b32d497266b2ad646a4d74827bAdam Powell        }
315088ab69780f58e4b32d497266b2ad646a4d74827bAdam Powell        return mMenuInflater;
31519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3154bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn    protected void onApplyThemeResource(Resources.Theme theme, int resid,
3155bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            boolean first) {
31569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent == null) {
31579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super.onApplyThemeResource(theme, resid, first);
31589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
31599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
31609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                theme.setTo(mParent.getTheme());
31619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (Exception e) {
31629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Empty
31639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            theme.applyStyle(resid, false);
31659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
31699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Launch an activity for which you would like a result when it finished.
31709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * When this activity exits, your
31719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * onActivityResult() method will be called with the given requestCode.
31729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Using a negative requestCode is the same as calling
31739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #startActivity} (the activity is not launched as a sub-activity).
31749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
31759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note that this method should only be used with Intent protocols
31769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that are defined to return a result.  In other protocols (such as
31779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link Intent#ACTION_MAIN} or {@link Intent#ACTION_VIEW}), you may
31789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not get the result when you expect.  For example, if the activity you
31799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * are launching uses the singleTask launch mode, it will not run in your
31809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * task and thus you will immediately receive a cancel result.
31819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
31829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>As a special case, if you call startActivityForResult() with a requestCode
31839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * >= 0 during the initial onCreate(Bundle savedInstanceState)/onResume() of your
31849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity, then your window will not be displayed until a result is
31859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returned back from the started activity.  This is to avoid visible
31869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * flickering when redirecting to another activity.
31879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
31889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This method throws {@link android.content.ActivityNotFoundException}
31899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if there was no Activity found to run the given Intent.
31909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
31919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param intent The intent to start.
31929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param requestCode If >= 0, this code will be returned in
31939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                    onActivityResult() when the activity exits.
31949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
31959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws android.content.ActivityNotFoundException
31969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
31979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startActivity
31989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
31999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startActivityForResult(Intent intent, int requestCode) {
32009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent == null) {
32019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Instrumentation.ActivityResult ar =
32029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mInstrumentation.execStartActivity(
32039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    this, mMainThread.getApplicationThread(), mToken, this,
32049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    intent, requestCode);
32059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ar != null) {
32069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.sendActivityResult(
32079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mToken, mEmbeddedID, requestCode, ar.getResultCode(),
32089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ar.getResultData());
32099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
32109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (requestCode >= 0) {
32119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If this start is requesting a result, we can avoid making
32129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // the activity visible until the result is received.  Setting
32139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // this code during onCreate(Bundle savedInstanceState) or onResume() will keep the
32149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // activity hidden during this time, to avoid flickering.
32159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // This can only be done when a result is requested because
32169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // that guarantees we will get information back when the
32179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // activity is finished, no matter what happens to it.
32189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mStartedActivity = true;
32199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
32209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
32219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParent.startActivityFromChild(this, intent, requestCode);
32229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3226bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * Like {@link #startActivityForResult(Intent, int)}, but allowing you
3227fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * to use a IntentSender to describe the activity to be started.  If
3228fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * the IntentSender is for an activity, that activity will be started
3229fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * as if you had called the regular {@link #startActivityForResult(Intent, int)}
3230fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * here; otherwise, its associated action will be executed (such as
3231fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * sending a broadcast) as if you had called
3232fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * {@link IntentSender#sendIntent IntentSender.sendIntent} on it.
3233fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     *
3234fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * @param intent The IntentSender to launch.
3235bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * @param requestCode If >= 0, this code will be returned in
3236bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     *                    onActivityResult() when the activity exits.
3237bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * @param fillInIntent If non-null, this will be provided as the
3238fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * intent parameter to {@link IntentSender#sendIntent}.
3239fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * @param flagsMask Intent flags in the original IntentSender that you
3240bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * would like to change.
3241bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * @param flagsValues Desired values for any bits set in
3242bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * <var>flagsMask</var>
3243fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * @param extraFlags Always set to 0.
3244bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     */
3245fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn    public void startIntentSenderForResult(IntentSender intent, int requestCode,
3246fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)
3247fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            throws IntentSender.SendIntentException {
3248bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn        if (mParent == null) {
3249fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            startIntentSenderForResultInner(intent, requestCode, fillInIntent,
3250bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                    flagsMask, flagsValues, this);
3251bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn        } else {
3252fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            mParent.startIntentSenderFromChild(this, intent, requestCode,
3253fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                    fillInIntent, flagsMask, flagsValues, extraFlags);
3254bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn        }
3255bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn    }
3256bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn
3257fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn    private void startIntentSenderForResultInner(IntentSender intent, int requestCode,
3258bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            Intent fillInIntent, int flagsMask, int flagsValues, Activity activity)
3259fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            throws IntentSender.SendIntentException {
3260bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn        try {
3261bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            String resolvedType = null;
3262bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            if (fillInIntent != null) {
32639ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn                fillInIntent.setAllowFds(false);
3264bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                resolvedType = fillInIntent.resolveTypeIfNeeded(getContentResolver());
3265bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            }
3266bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            int result = ActivityManagerNative.getDefault()
3267fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                .startActivityIntentSender(mMainThread.getApplicationThread(), intent,
3268bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        fillInIntent, resolvedType, mToken, activity.mEmbeddedID,
3269bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        requestCode, flagsMask, flagsValues);
3270bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            if (result == IActivityManager.START_CANCELED) {
3271fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                throw new IntentSender.SendIntentException();
3272bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            }
3273bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            Instrumentation.checkStartActivityResult(result, null);
3274bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn        } catch (RemoteException e) {
3275bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn        }
3276bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn        if (requestCode >= 0) {
3277bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            // If this start is requesting a result, we can avoid making
3278bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            // the activity visible until the result is received.  Setting
3279bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            // this code during onCreate(Bundle savedInstanceState) or onResume() will keep the
3280bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            // activity hidden during this time, to avoid flickering.
3281bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            // This can only be done when a result is requested because
3282bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            // that guarantees we will get information back when the
3283bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            // activity is finished, no matter what happens to it.
3284bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            mStartedActivity = true;
3285bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn        }
3286bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn    }
3287bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn
3288bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn    /**
32899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Launch a new activity.  You will not receive any information about when
32909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the activity exits.  This implementation overrides the base version,
32919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * providing information about
32929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the activity performing the launch.  Because of this additional
32939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * information, the {@link Intent#FLAG_ACTIVITY_NEW_TASK} launch flag is not
32949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * required; if not specified, the new activity will be added to the
32959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * task of the caller.
32969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
32979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This method throws {@link android.content.ActivityNotFoundException}
32989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if there was no Activity found to run the given Intent.
32999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
33009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param intent The intent to start.
33019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
33029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws android.content.ActivityNotFoundException
33039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
33049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startActivityForResult
33059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
33069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
33079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startActivity(Intent intent) {
33089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        startActivityForResult(intent, -1);
33099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
33109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3312621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     * Launch a new activity.  You will not receive any information about when
3313621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     * the activity exits.  This implementation overrides the base version,
3314621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     * providing information about
3315621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     * the activity performing the launch.  Because of this additional
3316621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     * information, the {@link Intent#FLAG_ACTIVITY_NEW_TASK} launch flag is not
3317621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     * required; if not specified, the new activity will be added to the
3318621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     * task of the caller.
3319621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     *
3320621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     * <p>This method throws {@link android.content.ActivityNotFoundException}
3321621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     * if there was no Activity found to run the given Intent.
3322621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     *
3323621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     * @param intents The intents to start.
3324621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     *
3325621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     * @throws android.content.ActivityNotFoundException
3326621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     *
3327621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     * @see #startActivityForResult
3328621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     */
3329621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    @Override
3330621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    public void startActivities(Intent[] intents) {
3331621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        mInstrumentation.execStartActivities(this, mMainThread.getApplicationThread(),
3332621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                mToken, this, intents);
3333621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    }
3334621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3335621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    /**
3336fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * Like {@link #startActivity(Intent)}, but taking a IntentSender
3337bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * to start; see
3338ae22c05b91d1e7a458066792eb5cfc0974c1be9eDianne Hackborn     * {@link #startIntentSenderForResult(IntentSender, int, Intent, int, int, int)}
3339bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * for more information.
3340bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     *
3341fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * @param intent The IntentSender to launch.
3342bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * @param fillInIntent If non-null, this will be provided as the
3343fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * intent parameter to {@link IntentSender#sendIntent}.
3344fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * @param flagsMask Intent flags in the original IntentSender that you
3345bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * would like to change.
3346bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * @param flagsValues Desired values for any bits set in
3347bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * <var>flagsMask</var>
3348fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * @param extraFlags Always set to 0.
3349bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     */
3350fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn    public void startIntentSender(IntentSender intent,
3351fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)
3352fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            throws IntentSender.SendIntentException {
3353fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn        startIntentSenderForResult(intent, -1, fillInIntent, flagsMask,
3354fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                flagsValues, extraFlags);
3355bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn    }
3356bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn
3357bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn    /**
33589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A special variation to launch an activity only if a new activity
33599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * instance is needed to handle the given Intent.  In other words, this is
33609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * just like {@link #startActivityForResult(Intent, int)} except: if you are
33619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * using the {@link Intent#FLAG_ACTIVITY_SINGLE_TOP} flag, or
33629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * singleTask or singleTop
33639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.R.styleable#AndroidManifestActivity_launchMode launchMode},
33649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and the activity
33659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that handles <var>intent</var> is the same as your currently running
33669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity, then a new instance is not needed.  In this case, instead of
33679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the normal behavior of calling {@link #onNewIntent} this function will
33689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * return and you can handle the Intent yourself.
33699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
33709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This function can only be called from a top-level activity; if it is
33719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * called from a child activity, a runtime exception will be thrown.
33729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
33739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param intent The intent to start.
33749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param requestCode If >= 0, this code will be returned in
33759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         onActivityResult() when the activity exits, as described in
33769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         {@link #startActivityForResult}.
33779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
33789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return If a new activity was launched then true is returned; otherwise
33799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         false is returned and you must handle the Intent yourself.
33809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
33819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startActivity
33829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startActivityForResult
33839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
33849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean startActivityIfNeeded(Intent intent, int requestCode) {
33859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent == null) {
33869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int result = IActivityManager.START_RETURN_INTENT_TO_CALLER;
33879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
33889ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn                intent.setAllowFds(false);
33899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                result = ActivityManagerNative.getDefault()
33909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    .startActivity(mMainThread.getApplicationThread(),
33919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            intent, intent.resolveTypeIfNeeded(
33929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    getContentResolver()),
33939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            null, 0,
339462f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                            mToken, mEmbeddedID, requestCode, true, false,
339562f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                            null, null, false);
33969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
33979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Empty
33989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
33999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Instrumentation.checkStartActivityResult(result, intent);
34019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (requestCode >= 0) {
34039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If this start is requesting a result, we can avoid making
34049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // the activity visible until the result is received.  Setting
34059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // this code during onCreate(Bundle savedInstanceState) or onResume() will keep the
34069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // activity hidden during this time, to avoid flickering.
34079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // This can only be done when a result is requested because
34089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // that guarantees we will get information back when the
34099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // activity is finished, no matter what happens to it.
34109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mStartedActivity = true;
34119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
34129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return result != IActivityManager.START_RETURN_INTENT_TO_CALLER;
34139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new UnsupportedOperationException(
34169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "startActivityIfNeeded can only be called from a top-level activity");
34179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
34189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
34209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Special version of starting an activity, for use when you are replacing
34219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * other activity components.  You can use this to hand the Intent off
34229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to the next Activity that can handle it.  You typically call this in
34239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onCreate} with the Intent returned by {@link #getIntent}.
34249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
34259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param intent The intent to dispatch to the next activity.  For
34269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * correct behavior, this must be the same as the Intent that started
34279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * your own activity; the only changes you can make are to the extras
34289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * inside of it.
34299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
34309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns a boolean indicating whether there was another Activity
34319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to start: true if there was a next activity to start, false if there
34329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * wasn't.  In general, if true is returned you will then want to call
34339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * finish() on yourself.
34349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
34359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean startNextMatchingActivity(Intent intent) {
34369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent == null) {
34379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
34389ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn                intent.setAllowFds(false);
34399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return ActivityManagerNative.getDefault()
34409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    .startNextMatchingActivity(mToken, intent);
34419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
34429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Empty
34439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
34449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
34459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new UnsupportedOperationException(
34489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "startNextMatchingActivity can only be called from a top-level activity");
34499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
34509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
34529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is called when a child activity of this one calls its
34539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #startActivity} or {@link #startActivityForResult} method.
34549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
34559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This method throws {@link android.content.ActivityNotFoundException}
34569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if there was no Activity found to run the given Intent.
34579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
34589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param child The activity making the call.
34599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param intent The intent to start.
34609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param requestCode Reply request code.  < 0 if reply is not requested.
34619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
34629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws android.content.ActivityNotFoundException
34639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
34649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startActivity
34659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startActivityForResult
34669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
34679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startActivityFromChild(Activity child, Intent intent,
34689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int requestCode) {
34699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Instrumentation.ActivityResult ar =
34709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mInstrumentation.execStartActivity(
34719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                this, mMainThread.getApplicationThread(), mToken, child,
34729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                intent, requestCode);
34739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ar != null) {
34749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mMainThread.sendActivityResult(
34759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mToken, child.mEmbeddedID, requestCode,
34769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ar.getResultCode(), ar.getResultData());
34779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
34799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
34816e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * This is called when a Fragment in this activity calls its
34826e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * {@link Fragment#startActivity} or {@link Fragment#startActivityForResult}
34836e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * method.
34846e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     *
34856e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * <p>This method throws {@link android.content.ActivityNotFoundException}
34866e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * if there was no Activity found to run the given Intent.
34876e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     *
34886e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * @param fragment The fragment making the call.
34896e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * @param intent The intent to start.
34906e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * @param requestCode Reply request code.  < 0 if reply is not requested.
34916e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     *
34926e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * @throws android.content.ActivityNotFoundException
34936e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     *
34946e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * @see Fragment#startActivity
34956e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * @see Fragment#startActivityForResult
34966e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     */
34976e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    public void startActivityFromFragment(Fragment fragment, Intent intent,
34986e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            int requestCode) {
34996e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        Instrumentation.ActivityResult ar =
35006e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            mInstrumentation.execStartActivity(
35016e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                this, mMainThread.getApplicationThread(), mToken, fragment,
35026e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                intent, requestCode);
35036e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (ar != null) {
35046e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            mMainThread.sendActivityResult(
35056e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                mToken, fragment.mWho, requestCode,
35066e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                ar.getResultCode(), ar.getResultData());
35076e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        }
35086e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    }
35096e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn
35106e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    /**
3511bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * Like {@link #startActivityFromChild(Activity, Intent, int)}, but
3512fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * taking a IntentSender; see
3513ae22c05b91d1e7a458066792eb5cfc0974c1be9eDianne Hackborn     * {@link #startIntentSenderForResult(IntentSender, int, Intent, int, int, int)}
3514bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * for more information.
3515bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     */
3516fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn    public void startIntentSenderFromChild(Activity child, IntentSender intent,
3517fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            int requestCode, Intent fillInIntent, int flagsMask, int flagsValues,
3518fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            int extraFlags)
3519fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            throws IntentSender.SendIntentException {
3520fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn        startIntentSenderForResultInner(intent, requestCode, fillInIntent,
3521bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                flagsMask, flagsValues, child);
3522bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn    }
3523bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn
3524bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn    /**
35253b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn     * Call immediately after one of the flavors of {@link #startActivity(Intent)}
35263b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn     * or {@link #finish} to specify an explicit transition animation to
35273b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn     * perform next.
35283b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn     * @param enterAnim A resource ID of the animation resource to use for
35298b571a817cc953ce96750f440645f104c7f55157Dianne Hackborn     * the incoming activity.  Use 0 for no animation.
35303b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn     * @param exitAnim A resource ID of the animation resource to use for
35318b571a817cc953ce96750f440645f104c7f55157Dianne Hackborn     * the outgoing activity.  Use 0 for no animation.
35323b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn     */
35333b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn    public void overridePendingTransition(int enterAnim, int exitAnim) {
35343b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        try {
35353b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            ActivityManagerNative.getDefault().overridePendingTransition(
35363b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    mToken, getPackageName(), enterAnim, exitAnim);
35373b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        } catch (RemoteException e) {
35383b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        }
35393b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn    }
35403b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn
35413b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn    /**
35429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Call this to set the result that your activity will return to its
35439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * caller.
35449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
35459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param resultCode The result code to propagate back to the originating
35469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                   activity, often RESULT_CANCELED or RESULT_OK
35479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
35489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #RESULT_CANCELED
35499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #RESULT_OK
35509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #RESULT_FIRST_USER
35519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setResult(int, Intent)
35529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
35539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setResult(int resultCode) {
35549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (this) {
35559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mResultCode = resultCode;
35569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mResultData = null;
35579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
35589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
35599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
35619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Call this to set the result that your activity will return to its
35629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * caller.
356321c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn     *
356421c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn     * <p>As of {@link android.os.Build.VERSION_CODES#GINGERBREAD}, the Intent
356521c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn     * you supply here can have {@link Intent#FLAG_GRANT_READ_URI_PERMISSION
356621c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn     * Intent.FLAG_GRANT_READ_URI_PERMISSION} and/or {@link Intent#FLAG_GRANT_WRITE_URI_PERMISSION
356721c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn     * Intent.FLAG_GRANT_WRITE_URI_PERMISSION} set.  This will grant the
356821c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn     * Activity receiving the result access to the specific URIs in the Intent.
356921c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn     * Access will remain until the Activity has finished (it will remain across the hosting
357021c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn     * process being killed and other temporary destruction) and will be added
357121c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn     * to any existing set of URI permissions it already holds.
357221c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn     *
35739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param resultCode The result code to propagate back to the originating
35749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                   activity, often RESULT_CANCELED or RESULT_OK
35759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param data The data to propagate back to the originating activity.
35769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
35779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #RESULT_CANCELED
35789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #RESULT_OK
35799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #RESULT_FIRST_USER
35809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setResult(int)
35819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
35829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setResult(int resultCode, Intent data) {
35839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (this) {
35849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mResultCode = resultCode;
35859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mResultData = data;
35869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
35879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
35889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
35909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the name of the package that invoked this activity.  This is who
35919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the data in {@link #setResult setResult()} will be sent to.  You can
35929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * use this information to validate that the recipient is allowed to
35939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * receive the data.
35949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
35959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note: if the calling activity is not expecting a result (that is it
35969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * did not use the {@link #startActivityForResult}
35979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * form that includes a request code), then the calling package will be
35989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * null.
35999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
36009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The package of the activity that will receive your
36019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         reply, or null if none.
36029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
36039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getCallingPackage() {
36049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
36059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().getCallingPackage(mToken);
36069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
36079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
36089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
36099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
36109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
36129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the name of the activity that invoked this activity.  This is
36139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * who the data in {@link #setResult setResult()} will be sent to.  You
36149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * can use this information to validate that the recipient is allowed to
36159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * receive the data.
36169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
36179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note: if the calling activity is not expecting a result (that is it
36189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * did not use the {@link #startActivityForResult}
36199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * form that includes a request code), then the calling package will be
36209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * null.
36219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
36229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return String The full name of the activity that will receive your
36239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         reply, or null if none.
36249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
36259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ComponentName getCallingActivity() {
36269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
36279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().getCallingActivity(mToken);
36289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
36299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
36309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
36319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
36329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
36349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Control whether this activity's main window is visible.  This is intended
36359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * only for the special case of an activity that is not going to show a
36369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * UI itself, but can't just finish prior to onResume() because it needs
36379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to wait for a service binding or such.  Setting this to false allows
36389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * you to prevent your UI from being shown during that time.
36399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
36409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The default value for this is taken from the
36419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.R.attr#windowNoDisplay} attribute of the activity's theme.
36429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
36439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setVisible(boolean visible) {
36449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mVisibleFromClient != visible) {
36459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mVisibleFromClient = visible;
36469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mVisibleFromServer) {
36479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (visible) makeVisible();
36489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                else mDecor.setVisibility(View.INVISIBLE);
36499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
36509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
36519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
36529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void makeVisible() {
36549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mWindowAdded) {
36559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ViewManager wm = getWindowManager();
36569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wm.addView(mDecor, getWindow().getAttributes());
36579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindowAdded = true;
36589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
36599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDecor.setVisibility(View.VISIBLE);
36609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
36619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
36639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Check to see whether this activity is in the process of finishing,
36649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * either because you called {@link #finish} on it or someone else
36659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * has requested that it finished.  This is often used in
36669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onPause} to determine whether the activity is simply pausing or
36679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * completely finishing.
36689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
36699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return If the activity is finishing, returns true; else returns false.
36709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
36719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #finish
36729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
36739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isFinishing() {
36749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mFinished;
36759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
36769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
36783d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton     * Check to see whether this activity is in the process of being destroyed in order to be
36793d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton     * recreated with a new configuration. This is often used in
36803d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton     * {@link #onStop} to determine whether the state needs to be cleaned up or will be passed
36813d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton     * on to the next instance of the activity via {@link #onRetainNonConfigurationInstance()}.
36823d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton     *
36833d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton     * @return If the activity is being torn down in order to be recreated with a new configuration,
36843d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton     * returns true; else returns false.
36853d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton     */
36863d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton    public boolean isChangingConfigurations() {
36873d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton        return mChangingConfigurations;
36883d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton    }
36893d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton
36903d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton    /**
369130c9bd89556137157b2f686637ece961454ccabeDianne Hackborn     * Cause this Activity to be recreated with a new instance.  This results
369230c9bd89556137157b2f686637ece961454ccabeDianne Hackborn     * in essentially the same flow as when the Activity is created due to
369330c9bd89556137157b2f686637ece961454ccabeDianne Hackborn     * a configuration change -- the current instance will go through its
369430c9bd89556137157b2f686637ece961454ccabeDianne Hackborn     * lifecycle to {@link #onDestroy} and a new instance then created after it.
369530c9bd89556137157b2f686637ece961454ccabeDianne Hackborn     */
369630c9bd89556137157b2f686637ece961454ccabeDianne Hackborn    public void recreate() {
369730c9bd89556137157b2f686637ece961454ccabeDianne Hackborn        if (mParent != null) {
369830c9bd89556137157b2f686637ece961454ccabeDianne Hackborn            throw new IllegalStateException("Can only be called on top-level activity");
369930c9bd89556137157b2f686637ece961454ccabeDianne Hackborn        }
370030c9bd89556137157b2f686637ece961454ccabeDianne Hackborn        if (Looper.myLooper() != mMainThread.getLooper()) {
370130c9bd89556137157b2f686637ece961454ccabeDianne Hackborn            throw new IllegalStateException("Must be called from main thread");
370230c9bd89556137157b2f686637ece961454ccabeDianne Hackborn        }
370330c9bd89556137157b2f686637ece961454ccabeDianne Hackborn        mMainThread.requestRelaunchActivity(mToken, null, null, 0, false, null, false);
370430c9bd89556137157b2f686637ece961454ccabeDianne Hackborn    }
370530c9bd89556137157b2f686637ece961454ccabeDianne Hackborn
370630c9bd89556137157b2f686637ece961454ccabeDianne Hackborn    /**
37079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Call this when your activity is done and should be closed.  The
37089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ActivityResult is propagated back to whoever launched you via
37099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * onActivityResult().
37109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
37119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void finish() {
37129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent == null) {
37139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int resultCode;
37149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Intent resultData;
37159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (this) {
37169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                resultCode = mResultCode;
37179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                resultData = mResultData;
37189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
371943a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato            if (false) Log.v(TAG, "Finishing self: token=" + mToken);
37209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
37219ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn                if (resultData != null) {
37229ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn                    resultData.setAllowFds(false);
37239ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn                }
37249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ActivityManagerNative.getDefault()
37259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    .finishActivity(mToken, resultCode, resultData)) {
37269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mFinished = true;
37279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
37299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Empty
37309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
37319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
37329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParent.finishFromChild(this);
37339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
37349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
37359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
37379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is called when a child activity of this one calls its
37389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #finish} method.  The default implementation simply calls
37399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * finish() on this activity (the parent), finishing the entire group.
37409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
37419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param child The activity making the call.
37429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
37439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #finish
37449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
37459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void finishFromChild(Activity child) {
37469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        finish();
37479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
37489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
37509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Force finish another activity that you had previously started with
37519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #startActivityForResult}.
37529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
37539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param requestCode The request code of the activity that you had
37549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                    given to startActivityForResult().  If there are multiple
37559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                    activities started with this request code, they
37569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                    will all be finished.
37579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
37589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void finishActivity(int requestCode) {
37599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent == null) {
37609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
37619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityManagerNative.getDefault()
37629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    .finishSubActivity(mToken, mEmbeddedID, requestCode);
37639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
37649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Empty
37659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
37669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
37679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParent.finishActivityFromChild(this, requestCode);
37689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
37699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
37709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
37729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is called when a child activity of this one calls its
37739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * finishActivity().
37749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
37759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param child The activity making the call.
37769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param requestCode Request code that had been used to start the
37779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                    activity.
37789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
37799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void finishActivityFromChild(Activity child, int requestCode) {
37809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
37819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault()
37829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                .finishSubActivity(mToken, child.mEmbeddedID, requestCode);
37839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
37849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Empty
37859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
37869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
37879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
37899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when an activity you launched exits, giving you the requestCode
37909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * you started it with, the resultCode it returned, and any additional
37919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * data from it.  The <var>resultCode</var> will be
37929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #RESULT_CANCELED} if the activity explicitly returned that,
37939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * didn't return any result, or crashed during its operation.
37949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
37959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>You will receive this call immediately before onResume() when your
37969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity is re-starting.
37979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
37989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param requestCode The integer request code originally supplied to
37999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                    startActivityForResult(), allowing you to identify who this
38009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                    result came from.
38019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param resultCode The integer result code returned by the child activity
38029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                   through its setResult().
38039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param data An Intent, which can return result data to the caller
38049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *               (various data can be attached to Intent "extras").
38059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
38069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startActivityForResult
38079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #createPendingResult
38089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setResult(int)
38099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
38106e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
38119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
38129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
38149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new PendingIntent object which you can hand to others
38159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for them to use to send result data back to your
38169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onActivityResult} callback.  The created object will be either
38179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * one-shot (becoming invalid after a result is sent back) or multiple
38189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * (allowing any number of results to be sent through it).
38199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
38209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param requestCode Private request code for the sender that will be
38219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * associated with the result data when it is returned.  The sender can not
38229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * modify this value, allowing you to identify incoming results.
38239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param data Default data to supply in the result, which may be modified
38249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * by the sender.
38259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param flags May be {@link PendingIntent#FLAG_ONE_SHOT PendingIntent.FLAG_ONE_SHOT},
38269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link PendingIntent#FLAG_NO_CREATE PendingIntent.FLAG_NO_CREATE},
38279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link PendingIntent#FLAG_CANCEL_CURRENT PendingIntent.FLAG_CANCEL_CURRENT},
38289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link PendingIntent#FLAG_UPDATE_CURRENT PendingIntent.FLAG_UPDATE_CURRENT},
38299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * or any of the flags as supported by
38309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link Intent#fillIn Intent.fillIn()} to control which unspecified parts
38319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of the intent that can be supplied when the actual send happens.
38329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
38339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns an existing or new PendingIntent matching the given
38349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * parameters.  May return null only if
38359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link PendingIntent#FLAG_NO_CREATE PendingIntent.FLAG_NO_CREATE} has been
38369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * supplied.
38379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
38389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see PendingIntent
38399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
38409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public PendingIntent createPendingResult(int requestCode, Intent data,
38419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int flags) {
38429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String packageName = getPackageName();
38439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
38449ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            data.setAllowFds(false);
38459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IIntentSender target =
38469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityManagerNative.getDefault().getIntentSender(
38479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        IActivityManager.INTENT_SENDER_ACTIVITY_RESULT, packageName,
38489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mParent == null ? mToken : mParent.mToken,
3849621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        mEmbeddedID, requestCode, new Intent[] { data }, null, flags);
38509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return target != null ? new PendingIntent(target) : null;
38519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
38529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Empty
38539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
38549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
38559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
38569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
38589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Change the desired orientation of this activity.  If the activity
38599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is currently in the foreground or otherwise impacting the screen
38609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * orientation, the screen will immediately be changed (possibly causing
38619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the activity to be restarted). Otherwise, this will be used the next
38629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * time the activity is visible.
38639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
38649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param requestedOrientation An orientation constant as used in
38659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link ActivityInfo#screenOrientation ActivityInfo.screenOrientation}.
38669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
38679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setRequestedOrientation(int requestedOrientation) {
38689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent == null) {
38699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
38709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityManagerNative.getDefault().setRequestedOrientation(
38719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mToken, requestedOrientation);
38729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
38739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Empty
38749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
38759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
38769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParent.setRequestedOrientation(requestedOrientation);
38779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
38789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
38799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
38819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the current requested orientation of the activity.  This will
38829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * either be the orientation requested in its component's manifest, or
38839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the last requested orientation given to
38849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setRequestedOrientation(int)}.
38859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
38869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns an orientation constant as used in
38879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link ActivityInfo#screenOrientation ActivityInfo.screenOrientation}.
38889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
38899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getRequestedOrientation() {
38909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent == null) {
38919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
38929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return ActivityManagerNative.getDefault()
38939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        .getRequestedOrientation(mToken);
38949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
38959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Empty
38969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
38979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
38989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mParent.getRequestedOrientation();
38999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
39019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
39029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
39049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the identifier of the task this activity is in.  This identifier
39059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will remain the same for the lifetime of the activity.
39069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
39079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Task identifier, an opaque integer.
39089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
39099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getTaskId() {
39109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
39119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault()
39129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                .getTaskForActivity(mToken, false);
39139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
39149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return -1;
39159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
39179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
39199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return whether this activity is the root of a task.  The root is the
39209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * first activity in a task.
39219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
39229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if this is the root activity, else false.
39239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
39249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isTaskRoot() {
39259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
39269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault()
39279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                .getTaskForActivity(mToken, true) >= 0;
39289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
39299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
39309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
39329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
39349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Move the task containing this activity to the back of the activity
39359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * stack.  The activity's order within the task is unchanged.
39369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
39379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param nonRoot If false then this only works if the activity is the root
39389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                of a task; if true it will work for any activity in
39399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                a task.
39409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
39419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return If the task was moved (or it was already at the
39429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         back) true is returned, else false.
39439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
39449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean moveTaskToBack(boolean nonRoot) {
39459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
39469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().moveActivityTaskToBack(
39479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mToken, nonRoot);
39489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
39499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Empty
39509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
39529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
39539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
39559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns class name for this activity with the package prefix removed.
39569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is the default name used to read and write settings.
39579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
39589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The local class name.
39599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
39609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getLocalClassName() {
39619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String pkg = getPackageName();
39629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String cls = mComponent.getClassName();
39639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int packageLen = pkg.length();
39649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!cls.startsWith(pkg) || cls.length() <= packageLen
39659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                || cls.charAt(packageLen) != '.') {
39669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return cls;
39679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return cls.substring(packageLen+1);
39699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
39709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
39729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns complete component name of this activity.
39739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
39749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the complete component name for this activity
39759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
39769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ComponentName getComponentName()
39779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
39789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mComponent;
39799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
39809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
39829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve a {@link SharedPreferences} object for accessing preferences
39839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that are private to this activity.  This simply calls the underlying
39849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getSharedPreferences(String, int)} method by passing in this activity's
39859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * class name as the preferences name.
39869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
39879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param mode Operating mode.  Use {@link #MODE_PRIVATE} for the default
39889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             operation, {@link #MODE_WORLD_READABLE} and
39899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             {@link #MODE_WORLD_WRITEABLE} to control permissions.
39909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
39919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the single SharedPreferences instance that can be used
39929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         to retrieve and modify the preference values.
39939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
39949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public SharedPreferences getPreferences(int mode) {
39959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getSharedPreferences(getLocalClassName(), mode);
39969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
39979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3998b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn    private void ensureSearchManager() {
3999b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn        if (mSearchManager != null) {
4000b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn            return;
4001b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn        }
4002b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn
4003e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani        mSearchManager = new SearchManager(this, null);
4004b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn    }
4005b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn
40069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
40079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Object getSystemService(String name) {
40089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (getBaseContext() == null) {
40099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalStateException(
40109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "System services not available to Activities before onCreate()");
40119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (WINDOW_SERVICE.equals(name)) {
40149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mWindowManager;
40158d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert        } else if (SEARCH_SERVICE.equals(name)) {
4016b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn            ensureSearchManager();
40178d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert            return mSearchManager;
40189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return super.getSystemService(name);
40209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
40239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Change the title associated with this activity.  If this is a
40249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * top-level activity, the title for its window will change.  If it
40259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is an embedded activity, the parent can do whatever it wants
40269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * with it.
40279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
40289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setTitle(CharSequence title) {
40299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTitle = title;
40309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onTitleChanged(title, mTitleColor);
40319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent != null) {
40339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParent.onChildTitleChanged(this, title);
40349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
40389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Change the title associated with this activity.  If this is a
40399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * top-level activity, the title for its window will change.  If it
40409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is an embedded activity, the parent can do whatever it wants
40419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * with it.
40429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
40439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setTitle(int titleId) {
40449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setTitle(getText(titleId));
40459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setTitleColor(int textColor) {
40489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTitleColor = textColor;
40499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onTitleChanged(mTitle, textColor);
40509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final CharSequence getTitle() {
40539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mTitle;
40549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getTitleColor() {
40579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mTitleColor;
40589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onTitleChanged(CharSequence title, int color) {
40619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mTitleReady) {
40629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final Window win = getWindow();
40639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win != null) {
40649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.setTitle(title);
40659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (color != 0) {
40669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.setTitleColor(color);
40679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
40689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
40699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onChildTitleChanged(Activity childActivity, CharSequence title) {
40739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
40769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the visibility of the progress bar in the title.
40779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
40789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * In order for the progress bar to be shown, the feature must be requested
40799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * via {@link #requestWindowFeature(int)}.
40809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
40819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param visible Whether to show the progress bars in the title.
40829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
40839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setProgressBarVisibility(boolean visible) {
40849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setFeatureInt(Window.FEATURE_PROGRESS, visible ? Window.PROGRESS_VISIBILITY_ON :
40859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Window.PROGRESS_VISIBILITY_OFF);
40869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
40899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the visibility of the indeterminate progress bar in the title.
40909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
40919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * In order for the progress bar to be shown, the feature must be requested
40929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * via {@link #requestWindowFeature(int)}.
40939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
40949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param visible Whether to show the progress bars in the title.
40959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
40969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setProgressBarIndeterminateVisibility(boolean visible) {
40979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setFeatureInt(Window.FEATURE_INDETERMINATE_PROGRESS,
40989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                visible ? Window.PROGRESS_VISIBILITY_ON : Window.PROGRESS_VISIBILITY_OFF);
40999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
41029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets whether the horizontal progress bar in the title should be indeterminate (the circular
41039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is always indeterminate).
41049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
41059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * In order for the progress bar to be shown, the feature must be requested
41069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * via {@link #requestWindowFeature(int)}.
41079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
41089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param indeterminate Whether the horizontal progress bar should be indeterminate.
41099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
41109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setProgressBarIndeterminate(boolean indeterminate) {
41119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setFeatureInt(Window.FEATURE_PROGRESS,
41129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                indeterminate ? Window.PROGRESS_INDETERMINATE_ON : Window.PROGRESS_INDETERMINATE_OFF);
41139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
41169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the progress for the progress bars in the title.
41179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
41189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * In order for the progress bar to be shown, the feature must be requested
41199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * via {@link #requestWindowFeature(int)}.
41209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
41219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param progress The progress for the progress bar. Valid ranges are from
41229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            0 to 10000 (both inclusive). If 10000 is given, the progress
41239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            bar will be completely filled and will fade out.
41249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
41259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setProgress(int progress) {
41269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setFeatureInt(Window.FEATURE_PROGRESS, progress + Window.PROGRESS_START);
41279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
41309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the secondary progress for the progress bar in the title. This
41319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * progress is drawn between the primary progress (set via
41329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setProgress(int)} and the background. It can be ideal for media
41339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * scenarios such as showing the buffering progress while the default
41349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * progress shows the play progress.
41359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
41369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * In order for the progress bar to be shown, the feature must be requested
41379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * via {@link #requestWindowFeature(int)}.
41389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
41399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param secondaryProgress The secondary progress for the progress bar. Valid ranges are from
41409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            0 to 10000 (both inclusive).
41419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
41429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setSecondaryProgress(int secondaryProgress) {
41439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setFeatureInt(Window.FEATURE_PROGRESS,
41449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                secondaryProgress + Window.PROGRESS_SECONDARY_START);
41459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
41489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Suggests an audio stream whose volume should be changed by the hardware
41499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * volume controls.
41509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
41519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The suggested audio stream will be tied to the window of this Activity.
41529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If the Activity is switched, the stream set here is no longer the
41539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * suggested stream. The client does not need to save and restore the old
41549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * suggested stream value in onPause and onResume.
41559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
41569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param streamType The type of the audio stream whose volume should be
41579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        changed by the hardware volume controls. It is not guaranteed that
41589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        the hardware volume controls will always change this stream's
41599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        volume (for example, if a call is in progress, its stream's volume
41609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        may be changed instead). To reset back to the default, use
41619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        {@link AudioManager#USE_DEFAULT_STREAM_TYPE}.
41629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
41639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setVolumeControlStream(int streamType) {
41649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setVolumeControlStream(streamType);
41659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
41689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the suggested audio stream whose volume should be changed by the
41699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * harwdare volume controls.
41709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
41719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The suggested audio stream type whose volume should be changed by
41729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         the hardware volume controls.
41739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setVolumeControlStream(int)
41749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
41759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getVolumeControlStream() {
41769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getWindow().getVolumeControlStream();
41779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
41809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Runs the specified action on the UI thread. If the current thread is the UI
41819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thread, then the action is executed immediately. If the current thread is
41829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not the UI thread, the action is posted to the event queue of the UI thread.
41839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
41849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param action the action to run on the UI thread
41859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
41869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void runOnUiThread(Runnable action) {
41879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (Thread.currentThread() != mUiThread) {
41889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mHandler.post(action);
41899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
41909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            action.run();
41919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
41929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4195ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn     * Standard implementation of
4196ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn     * {@link android.view.LayoutInflater.Factory#onCreateView} used when
4197ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn     * inflating with the LayoutInflater returned by {@link #getSystemService}.
4198625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * This implementation does nothing and is for
4199625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * pre-{@link android.os.Build.VERSION_CODES#HONEYCOMB} apps.  Newer apps
4200625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * should use {@link #onCreateView(View, String, Context, AttributeSet)}.
4201625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     *
4202625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * @see android.view.LayoutInflater#createView
4203625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * @see android.view.Window#getLayoutInflater
4204625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     */
4205625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn    public View onCreateView(String name, Context context, AttributeSet attrs) {
4206625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        return null;
4207625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn    }
4208625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn
4209625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn    /**
4210625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * Standard implementation of
4211625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * {@link android.view.LayoutInflater.Factory2#onCreateView(View, String, Context, AttributeSet)}
4212625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * used when inflating with the LayoutInflater returned by {@link #getSystemService}.
4213ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn     * This implementation handles <fragment> tags to embed fragments inside
4214ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn     * of the activity.
42159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
42169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.view.LayoutInflater#createView
42179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.view.Window#getLayoutInflater
42189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4219625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn    public View onCreateView(View parent, String name, Context context, AttributeSet attrs) {
4220ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        if (!"fragment".equals(name)) {
4221625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            return onCreateView(name, context, attrs);
4222ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        }
4223ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn
4224def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn        String fname = attrs.getAttributeValue(null, "class");
4225ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        TypedArray a =
4226ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn            context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.Fragment);
4227def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn        if (fname == null) {
4228def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn            fname = a.getString(com.android.internal.R.styleable.Fragment_name);
4229def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn        }
4230625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        int id = a.getResourceId(com.android.internal.R.styleable.Fragment_id, View.NO_ID);
4231ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        String tag = a.getString(com.android.internal.R.styleable.Fragment_tag);
4232ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        a.recycle();
4233ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn
4234625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        int containerId = parent != null ? parent.getId() : 0;
4235625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        if (containerId == View.NO_ID && id == View.NO_ID && tag == null) {
4236b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            throw new IllegalArgumentException(attrs.getPositionDescription()
4237625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                    + ": Must specify unique android:id, android:tag, or have a parent with an id for " + fname);
4238b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
4239625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn
4240b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        // If we restored from a previous state, we may already have
4241b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        // instantiated this fragment from the state and should use
4242b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        // that instance instead of making a new one.
4243625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        Fragment fragment = id != View.NO_ID ? mFragments.findFragmentById(id) : null;
4244625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        if (fragment == null && tag != null) {
4245625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            fragment = mFragments.findFragmentByTag(tag);
4246625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        }
4247625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        if (fragment == null && containerId != View.NO_ID) {
4248625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            fragment = mFragments.findFragmentById(containerId);
4249625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        }
4250625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn
4251b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        if (FragmentManagerImpl.DEBUG) Log.v(TAG, "onCreateView: id=0x"
4252b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn                + Integer.toHexString(id) + " fname=" + fname
4253b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn                + " existing=" + fragment);
4254b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        if (fragment == null) {
4255b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn            fragment = Fragment.instantiate(this, fname);
4256b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn            fragment.mFromLayout = true;
4257625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            fragment.mFragmentId = id != 0 ? id : containerId;
4258625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            fragment.mContainerId = containerId;
4259b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn            fragment.mTag = tag;
4260625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            fragment.mInLayout = true;
42613e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn            fragment.mFragmentManager = mFragments;
4262e3a7f628c6d9fef42be24999b3137ebe5c6f3525Dianne Hackborn            fragment.onInflate(this, attrs, fragment.mSavedFragmentState);
4263625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            mFragments.addFragment(fragment, true);
4264625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn
4265625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        } else if (fragment.mInLayout) {
4266625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            // A fragment already exists and it is not one we restored from
4267625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            // previous state.
4268625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            throw new IllegalArgumentException(attrs.getPositionDescription()
4269625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                    + ": Duplicate id 0x" + Integer.toHexString(id)
4270625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                    + ", tag " + tag + ", or parent id 0x" + Integer.toHexString(containerId)
4271625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                    + " with another fragment for " + fname);
4272625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        } else {
4273625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            // This fragment was retained from a previous instance; get it
4274625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            // going now.
4275625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            fragment.mInLayout = true;
4276def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn            // If this fragment is newly instantiated (either right now, or
4277def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn            // from last saved state), then give it the attributes to
4278def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn            // initialize itself.
4279def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn            if (!fragment.mRetaining) {
4280e3a7f628c6d9fef42be24999b3137ebe5c6f3525Dianne Hackborn                fragment.onInflate(this, attrs, fragment.mSavedFragmentState);
4281def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn            }
4282625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            mFragments.moveToState(fragment);
4283b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        }
4284625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn
4285b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        if (fragment.mView == null) {
4286b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn            throw new IllegalStateException("Fragment " + fname
4287b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn                    + " did not create a view.");
4288b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        }
4289625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        if (id != 0) {
4290625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            fragment.mView.setId(id);
4291625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        }
4292b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        if (fragment.mView.getTag() == null) {
4293b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn            fragment.mView.setTag(tag);
4294b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        }
4295b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        return fragment.mView;
42969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
42979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
429869a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler    /**
4299625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * Print the Activity's state into the given stream.  This gets invoked if
430030d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn     * you run "adb shell dumpsys activity <activity_component_name>".
4301625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     *
430230d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn     * @param prefix Desired prefix to prepend at each line of output.
4303625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * @param fd The raw file descriptor that the dump is being sent to.
4304625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * @param writer The PrintWriter to which you should dump your state.  This will be
4305625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * closed for you after you return.
4306625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * @param args additional arguments to the dump request.
4307625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     */
430830d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn    public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
430930d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn        writer.print(prefix); writer.print("Local Activity ");
431030d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn                writer.print(Integer.toHexString(System.identityHashCode(this)));
431130d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn                writer.println(" State:");
431230d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn        String innerPrefix = prefix + "  ";
431330d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn        writer.print(innerPrefix); writer.print("mResumed=");
431430d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn                writer.print(mResumed); writer.print(" mStopped=");
431530d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn                writer.print(mStopped); writer.print(" mFinished=");
431630d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn                writer.println(mFinished);
431730d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn        writer.print(innerPrefix); writer.print("mLoadersStarted=");
431830d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn                writer.println(mLoadersStarted);
431930d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn        writer.print(innerPrefix); writer.print("mChangingConfigurations=");
432030d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn                writer.println(mChangingConfigurations);
432130d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn        writer.print(innerPrefix); writer.print("mCurrentConfig=");
432230d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn                writer.println(mCurrentConfig);
432330d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn        if (mLoaderManager != null) {
432430d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn            writer.print(prefix); writer.print("Loader Manager ");
432530d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn                    writer.print(Integer.toHexString(System.identityHashCode(mLoaderManager)));
432630d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn                    writer.println(":");
432730d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn            mLoaderManager.dump(prefix + "  ", fd, writer, args);
432830d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn        }
432930d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn        mFragments.dump(prefix, fd, writer, args);
4330625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn    }
4331625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn
4332625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn    /**
433369a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * Bit indicating that this activity is "immersive" and should not be
433469a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * interrupted by notifications if possible.
433569a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     *
433669a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * This value is initially set by the manifest property
433769a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * <code>android:immersive</code> but may be changed at runtime by
433869a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * {@link #setImmersive}.
433969a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     *
434069a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * @see android.content.pm.ActivityInfo#FLAG_IMMERSIVE
434102486b1327e3007c62d253dd89ba9db1852b87f8Dianne Hackborn     * @hide
434269a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     */
434369a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler    public boolean isImmersive() {
434469a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler        try {
434569a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler            return ActivityManagerNative.getDefault().isImmersive(mToken);
434669a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler        } catch (RemoteException e) {
434769a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler            return false;
434869a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler        }
434969a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler    }
435069a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler
435169a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler    /**
435269a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * Adjust the current immersive mode setting.
435369a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     *
435469a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * Note that changing this value will have no effect on the activity's
435569a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * {@link android.content.pm.ActivityInfo} structure; that is, if
435669a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * <code>android:immersive</code> is set to <code>true</code>
435769a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * in the application's manifest entry for this activity, the {@link
435869a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * android.content.pm.ActivityInfo#flags ActivityInfo.flags} member will
435969a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * always have its {@link android.content.pm.ActivityInfo#FLAG_IMMERSIVE
436069a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * FLAG_IMMERSIVE} bit set.
436169a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     *
436269a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * @see #isImmersive
436369a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * @see android.content.pm.ActivityInfo#FLAG_IMMERSIVE
436402486b1327e3007c62d253dd89ba9db1852b87f8Dianne Hackborn     * @hide
436569a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     */
436669a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler    public void setImmersive(boolean i) {
436769a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler        try {
436869a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler            ActivityManagerNative.getDefault().setImmersive(mToken, i);
436969a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler        } catch (RemoteException e) {
437069a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler            // pass
437169a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler        }
437269a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler    }
437369a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler
43746e34636749217654f43221885afb7a29bb5ca96aAdam Powell    /**
4375debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     * Start an action mode.
43766e34636749217654f43221885afb7a29bb5ca96aAdam Powell     *
43776e34636749217654f43221885afb7a29bb5ca96aAdam Powell     * @param callback Callback that will manage lifecycle events for this context mode
43786e34636749217654f43221885afb7a29bb5ca96aAdam Powell     * @return The ContextMode that was started, or null if it was canceled
43796e34636749217654f43221885afb7a29bb5ca96aAdam Powell     *
43806e34636749217654f43221885afb7a29bb5ca96aAdam Powell     * @see ActionMode
43816e34636749217654f43221885afb7a29bb5ca96aAdam Powell     */
43825d27977f9da482627ceb19317a2cd70467aff046Adam Powell    public ActionMode startActionMode(ActionMode.Callback callback) {
43836e34636749217654f43221885afb7a29bb5ca96aAdam Powell        return mWindow.getDecorView().startActionMode(callback);
43846e34636749217654f43221885afb7a29bb5ca96aAdam Powell    }
43856e34636749217654f43221885afb7a29bb5ca96aAdam Powell
4386debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell    /**
4387debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     * Give the Activity a chance to control the UI for an action mode requested
4388debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     * by the system.
4389debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     *
4390debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     * <p>Note: If you are looking for a notification callback that an action mode
4391debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     * has been started for this activity, see {@link #onActionModeStarted(ActionMode)}.</p>
4392debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     *
4393debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     * @param callback The callback that should control the new action mode
4394debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     * @return The new action mode, or <code>null</code> if the activity does not want to
4395debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     *         provide special handling for this action mode. (It will be handled by the system.)
4396debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     */
4397debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell    public ActionMode onWindowStartingActionMode(ActionMode.Callback callback) {
439842c0fe86521af507f597af6159f63879cb5be73eAdam Powell        initActionBar();
43996e34636749217654f43221885afb7a29bb5ca96aAdam Powell        if (mActionBar != null) {
44005d27977f9da482627ceb19317a2cd70467aff046Adam Powell            return mActionBar.startActionMode(callback);
44016e34636749217654f43221885afb7a29bb5ca96aAdam Powell        }
44026e34636749217654f43221885afb7a29bb5ca96aAdam Powell        return null;
44036e34636749217654f43221885afb7a29bb5ca96aAdam Powell    }
44046e34636749217654f43221885afb7a29bb5ca96aAdam Powell
4405debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell    /**
4406debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     * Notifies the Activity that an action mode has been started.
4407debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     * Activity subclasses overriding this method should call the superclass implementation.
4408debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     *
4409debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     * @param mode The new action mode.
4410debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     */
4411debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell    public void onActionModeStarted(ActionMode mode) {
4412debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell    }
4413debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell
4414debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell    /**
4415debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     * Notifies the activity that an action mode has finished.
4416debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     * Activity subclasses overriding this method should call the superclass implementation.
4417debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     *
4418debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     * @param mode The action mode that just finished.
4419debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     */
4420debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell    public void onActionModeFinished(ActionMode mode) {
4421debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell    }
4422debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell
44239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ------------------ Internal API ------------------
44249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void setParent(Activity parent) {
44269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mParent = parent;
44279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void attach(Context context, ActivityThread aThread, Instrumentation instr, IBinder token,
44309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Application application, Intent intent, ActivityInfo info, CharSequence title,
4431b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            Activity parent, String id, NonConfigurationInstances lastNonConfigurationInstances,
44329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Configuration config) {
4433b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn        attach(context, aThread, instr, token, 0, application, intent, info, title, parent, id,
4434b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            lastNonConfigurationInstances, config);
44359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4437b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn    final void attach(Context context, ActivityThread aThread,
4438b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn            Instrumentation instr, IBinder token, int ident,
4439b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn            Application application, Intent intent, ActivityInfo info,
4440b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn            CharSequence title, Activity parent, String id,
4441b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            NonConfigurationInstances lastNonConfigurationInstances,
4442b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn            Configuration config) {
44439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        attachBaseContext(context);
44449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44452dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        mFragments.attachActivity(this);
44462dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
44479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindow = PolicyManager.makeNewWindow(this);
44489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindow.setCallback(this);
4449420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn        mWindow.getLayoutInflater().setPrivateFactory(this);
44509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (info.softInputMode != WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED) {
44519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindow.setSoftInputMode(info.softInputMode);
44529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4453269248d112e35fe8e9f0d5d11c96dcb2ac1118b0Adam Powell        if (info.uiOptions != 0) {
4454269248d112e35fe8e9f0d5d11c96dcb2ac1118b0Adam Powell            mWindow.setUiOptions(info.uiOptions);
4455269248d112e35fe8e9f0d5d11c96dcb2ac1118b0Adam Powell        }
44569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUiThread = Thread.currentThread();
4457529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy
44589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread = aThread;
44599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mInstrumentation = instr;
44609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mToken = token;
4461b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn        mIdent = ident;
44629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mApplication = application;
44639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mIntent = intent;
44649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mComponent = intent.getComponent();
44659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mActivityInfo = info;
44669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTitle = title;
44679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mParent = parent;
44689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEmbeddedID = id;
4469b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mLastNonConfigurationInstances = lastNonConfigurationInstances;
44709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4471529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy        mWindow.setWindowManager(null, mToken, mComponent.flattenToString(),
4472529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy                (info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0);
44739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent != null) {
44749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindow.setContainer(mParent.getWindow());
44759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindowManager = mWindow.getWindowManager();
44779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCurrentConfig = config;
44789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final IBinder getActivityToken() {
44819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mParent != null ? mParent.getActivityToken() : mToken;
44829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44842dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    final void performCreate(Bundle icicle) {
44852dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        onCreate(icicle);
448630c9bd89556137157b2f686637ece961454ccabeDianne Hackborn        mVisibleFromClient = !mWindow.getWindowStyle().getBoolean(
448730c9bd89556137157b2f686637ece961454ccabeDianne Hackborn                com.android.internal.R.styleable.Window_windowNoDisplay, false);
4488c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn        mFragments.dispatchActivityCreated();
44892dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
44902dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
44919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performStart() {
4492fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn        mFragments.noteStateNotSaved();
44939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = false;
4494445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn        mFragments.execPendingActions();
44959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mInstrumentation.callActivityOnStart(this);
44969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mCalled) {
44979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SuperNotCalledException(
44989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "Activity " + mComponent.toShortString() +
44999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                " did not call through to super.onStart()");
45009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45012dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        mFragments.dispatchStart();
45022707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn        if (mAllLoaderManagers != null) {
45032707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn            for (int i=mAllLoaderManagers.size()-1; i>=0; i--) {
4504afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn                LoaderManagerImpl lm = mAllLoaderManagers.valueAt(i);
4505afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn                lm.finishRetain();
4506afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn                lm.doReportStart();
45072707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn            }
45082707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn        }
45099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performRestart() {
4512fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn        mFragments.noteStateNotSaved();
4513a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn
45149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mStopped) {
45159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStopped = false;
4516ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn            if (mToken != null && mParent == null) {
4517ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                WindowManagerImpl.getDefault().setStoppedState(mToken, false);
4518ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn            }
4519185e3e243ee1da136bcace854026b8abaf0c4c86Dianne Hackborn
4520185e3e243ee1da136bcace854026b8abaf0c4c86Dianne Hackborn            synchronized (mManagedCursors) {
4521185e3e243ee1da136bcace854026b8abaf0c4c86Dianne Hackborn                final int N = mManagedCursors.size();
4522185e3e243ee1da136bcace854026b8abaf0c4c86Dianne Hackborn                for (int i=0; i<N; i++) {
4523185e3e243ee1da136bcace854026b8abaf0c4c86Dianne Hackborn                    ManagedCursor mc = mManagedCursors.get(i);
4524185e3e243ee1da136bcace854026b8abaf0c4c86Dianne Hackborn                    if (mc.mReleased || mc.mUpdated) {
4525185e3e243ee1da136bcace854026b8abaf0c4c86Dianne Hackborn                        if (!mc.mCursor.requery()) {
4526a5445d3bbd7985ffeeeabc3813bec3d1e0463ceaDianne Hackborn                            if (getApplicationInfo().targetSdkVersion
4527a5445d3bbd7985ffeeeabc3813bec3d1e0463ceaDianne Hackborn                                    >= android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
4528a5445d3bbd7985ffeeeabc3813bec3d1e0463ceaDianne Hackborn                                throw new IllegalStateException(
4529a5445d3bbd7985ffeeeabc3813bec3d1e0463ceaDianne Hackborn                                        "trying to requery an already closed cursor  "
4530a5445d3bbd7985ffeeeabc3813bec3d1e0463ceaDianne Hackborn                                        + mc.mCursor);
4531a5445d3bbd7985ffeeeabc3813bec3d1e0463ceaDianne Hackborn                            }
4532185e3e243ee1da136bcace854026b8abaf0c4c86Dianne Hackborn                        }
4533185e3e243ee1da136bcace854026b8abaf0c4c86Dianne Hackborn                        mc.mReleased = false;
4534185e3e243ee1da136bcace854026b8abaf0c4c86Dianne Hackborn                        mc.mUpdated = false;
4535185e3e243ee1da136bcace854026b8abaf0c4c86Dianne Hackborn                    }
4536185e3e243ee1da136bcace854026b8abaf0c4c86Dianne Hackborn                }
4537185e3e243ee1da136bcace854026b8abaf0c4c86Dianne Hackborn            }
4538185e3e243ee1da136bcace854026b8abaf0c4c86Dianne Hackborn
4539185e3e243ee1da136bcace854026b8abaf0c4c86Dianne Hackborn            mCalled = false;
45409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mInstrumentation.callActivityOnRestart(this);
45419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mCalled) {
45429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new SuperNotCalledException(
45439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "Activity " + mComponent.toShortString() +
45449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    " did not call through to super.onRestart()");
45459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
45469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            performStart();
45479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performResume() {
45519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        performRestart();
45529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4553445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn        mFragments.execPendingActions();
4554445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn
4555b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mLastNonConfigurationInstances = null;
45569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = false;
455852d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamilton        // mResumed is set by the instrumentation
45599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mInstrumentation.callActivityOnResume(this);
45609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mCalled) {
45619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SuperNotCalledException(
45629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "Activity " + mComponent.toShortString() +
45639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                " did not call through to super.onResume()");
45649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Now really resume, and install the current status bar and menu.
45679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = false;
45682dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
45692dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        mFragments.dispatchResume();
4570445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn        mFragments.execPendingActions();
45712dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
45729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onPostResume();
45739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mCalled) {
45749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SuperNotCalledException(
45759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "Activity " + mComponent.toShortString() +
45769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                " did not call through to super.onPostResume()");
45779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performPause() {
45812dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        mFragments.dispatchPause();
4582e794e9f9b7599c1ad6b8760e601c81b19ecc80c6Dianne Hackborn        mCalled = false;
45839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onPause();
45844eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        mResumed = false;
4585e794e9f9b7599c1ad6b8760e601c81b19ecc80c6Dianne Hackborn        if (!mCalled && getApplicationInfo().targetSdkVersion
4586e794e9f9b7599c1ad6b8760e601c81b19ecc80c6Dianne Hackborn                >= android.os.Build.VERSION_CODES.GINGERBREAD) {
4587e794e9f9b7599c1ad6b8760e601c81b19ecc80c6Dianne Hackborn            throw new SuperNotCalledException(
4588e794e9f9b7599c1ad6b8760e601c81b19ecc80c6Dianne Hackborn                    "Activity " + mComponent.toShortString() +
4589e794e9f9b7599c1ad6b8760e601c81b19ecc80c6Dianne Hackborn                    " did not call through to super.onPause()");
4590e794e9f9b7599c1ad6b8760e601c81b19ecc80c6Dianne Hackborn        }
459152d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamilton        mResumed = false;
45929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performUserLeaving() {
45959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onUserInteraction();
45969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onUserLeaveHint();
45979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performStop() {
4600fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn        if (mLoadersStarted) {
4601fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn            mLoadersStarted = false;
46022707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn            if (mLoaderManager != null) {
46032707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn                if (!mChangingConfigurations) {
46042707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn                    mLoaderManager.doStop();
46052707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn                } else {
46062707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn                    mLoaderManager.doRetain();
46072707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn                }
46082707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn            }
46092707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn        }
46102707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn
46119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mStopped) {
46129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mWindow != null) {
46139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWindow.closeAllPanels();
46149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
46159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4616ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn            if (mToken != null && mParent == null) {
4617ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                WindowManagerImpl.getDefault().setStoppedState(mToken, true);
4618ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn            }
4619ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn
46202dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn            mFragments.dispatchStop();
46212dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
46229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCalled = false;
46239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mInstrumentation.callActivityOnStop(this);
46249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mCalled) {
46259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new SuperNotCalledException(
46269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "Activity " + mComponent.toShortString() +
46279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    " did not call through to super.onStop()");
46289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
46299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
46302f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki            synchronized (mManagedCursors) {
46312f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                final int N = mManagedCursors.size();
46322f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                for (int i=0; i<N; i++) {
46332f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                    ManagedCursor mc = mManagedCursors.get(i);
46342f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                    if (!mc.mReleased) {
46352f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                        mc.mCursor.deactivate();
46362f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                        mc.mReleased = true;
46372f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                    }
46389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
46399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
46409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
46419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStopped = true;
46429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
46439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mResumed = false;
46449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
46459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
46462dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    final void performDestroy() {
4647291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn        mWindow.destroy();
46482dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        mFragments.dispatchDestroy();
46492dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        onDestroy();
46505e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn        if (mLoaderManager != null) {
46515e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn            mLoaderManager.doDestroy();
46525e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn        }
46532dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
46542dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
465552d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamilton    /**
465652d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamilton     * @hide
465752d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamilton     */
465852d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamilton    public final boolean isResumed() {
46599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mResumed;
46609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
46619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
46629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void dispatchActivityResult(String who, int requestCode,
46639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int resultCode, Intent data) {
466443a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato        if (false) Log.v(
46659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            TAG, "Dispatching result: who=" + who + ", reqCode=" + requestCode
46669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            + ", resCode=" + resultCode + ", data=" + data);
4667fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn        mFragments.noteStateNotSaved();
46689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (who == null) {
46699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            onActivityResult(requestCode, resultCode, data);
46706e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        } else {
46716e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            Fragment frag = mFragments.findFragmentByWho(who);
46726e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            if (frag != null) {
46736e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                frag.onActivityResult(requestCode, resultCode, data);
46746e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            }
46759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
46769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
46779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4678