Activity.java revision debf3bed9ea913ac55c80e1f9f7f33217054a943
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
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentCallbacks;
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;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.Cursor;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Bitmap;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Canvas;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.media.AudioManager;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri;
418d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackbornimport android.os.Build;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder;
45b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackbornimport android.os.Parcelable;
4675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.os.RemoteException;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.Selection;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.SpannableStringBuilder;
4975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.text.TextUtils;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.method.TextKeyListener;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Config;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.EventLog;
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseArray;
566e34636749217654f43221885afb7a29bb5ca96aAdam Powellimport android.view.ActionMode;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ContextMenu;
586e34636749217654f43221885afb7a29bb5ca96aAdam Powellimport android.view.ContextMenu.ContextMenuInfo;
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ContextThemeWrapper;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyEvent;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.LayoutInflater;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Menu;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.MenuInflater;
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.MenuItem;
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.MotionEvent;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View;
676e34636749217654f43221885afb7a29bb5ca96aAdam Powellimport android.view.View.OnCreateContextMenuListener;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewGroup;
696e34636749217654f43221885afb7a29bb5ca96aAdam Powellimport android.view.ViewGroup.LayoutParams;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewManager;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Window;
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManager;
7375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.view.accessibility.AccessibilityEvent;
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.AdapterView;
750b2a6d0773211449fbde9d2706388714beeffebbJim Millerimport android.widget.FrameLayout;
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
77625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackbornimport java.io.FileDescriptor;
78625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackbornimport java.io.PrintWriter;
796e34636749217654f43221885afb7a29bb5ca96aAdam Powellimport java.util.ArrayList;
806e34636749217654f43221885afb7a29bb5ca96aAdam Powellimport java.util.HashMap;
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * An activity is a single, focused thing that the user can do.  Almost all
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activities interact with the user, so the Activity class takes care of
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * creating a window for you in which you can place your UI with
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #setContentView}.  While activities are often presented to the user
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as full-screen windows, they can also be used in other ways: as floating
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * windows (via a theme with {@link android.R.attr#windowIsFloating} set)
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or embedded inside of another activity (using {@link ActivityGroup}).
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * There are two methods almost all subclasses of Activity will implement:
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul>
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> {@link #onCreate} is where you initialize your activity.  Most
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     importantly, here you will usually call {@link #setContentView(int)}
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     with a layout resource defining your UI, and using {@link #findViewById}
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     to retrieve the widgets in that UI that you need to interact with
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     programmatically.
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> {@link #onPause} is where you deal with the user leaving your
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     activity.  Most importantly, any changes made by the user should at this
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     point be committed (usually to the
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     {@link android.content.ContentProvider} holding the data).
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>To be of use with {@link android.content.Context#startActivity Context.startActivity()}, all
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity classes must have a corresponding
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.styleable#AndroidManifestActivity &lt;activity&gt;}
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * declaration in their package's <code>AndroidManifest.xml</code>.</p>
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The Activity class is an important part of an application's overall lifecycle,
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and the way activities are launched and put together is a fundamental
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * part of the platform's application model. For a detailed perspective on the structure of
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Android applications and lifecycles, please read the <em>Dev Guide</em> document on
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a href="{@docRoot}guide/topics/fundamentals.html">Application Fundamentals</a>.</p>
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Topics covered here:
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ol>
119291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <li><a href="#Fragments">Fragments</a>
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#ActivityLifecycle">Activity Lifecycle</a>
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#ConfigurationChanges">Configuration Changes</a>
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#StartingActivities">Starting Activities and Getting Results</a>
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#SavingPersistentState">Saving Persistent State</a>
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#Permissions">Permissions</a>
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#ProcessLifecycle">Process Lifecycle</a>
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ol>
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
128291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <a name="Fragments"></a>
129291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <h3>Fragments</h3>
130291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn *
131291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <p>Starting with {@link android.os.Build.VERSION_CODES#HONEYCOMB}, Activity
132291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * implementations can make use of the {@link Fragment} class to better
133291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * modularize their code, build more sophisticated user interfaces for larger
134291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * screens, and help scale their application between small and large screens.
135291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn *
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="ActivityLifecycle"></a>
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Activity Lifecycle</h3>
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Activities in the system are managed as an <em>activity stack</em>.
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * When a new activity is started, it is placed on the top of the stack
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and becomes the running activity -- the previous activity always remains
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * below it in the stack, and will not come to the foreground again until
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the new activity exits.</p>
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>An activity has essentially four states:</p>
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul>
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> If an activity in the foreground of the screen (at the top of
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         the stack),
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         it is <em>active</em> or  <em>running</em>. </li>
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li>If an activity has lost focus but is still visible (that is, a new non-full-sized
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         or transparent activity has focus on top of your activity), it
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         is <em>paused</em>. A paused activity is completely alive (it
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         maintains all state and member information and remains attached to
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         the window manager), but can be killed by the system in extreme
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         low memory situations.
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li>If an activity is completely obscured by another activity,
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         it is <em>stopped</em>. It still retains all state and member information,
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         however, it is no longer visible to the user so its window is hidden
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         and it will often be killed by the system when memory is needed
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         elsewhere.</li>
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li>If an activity is paused or stopped, the system can drop the activity
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         from memory by either asking it to finish, or simply killing its
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         process.  When it is displayed again to the user, it must be
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         completely restarted and restored to its previous state.</li>
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The following diagram shows the important state paths of an Activity.
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The square rectangles represent callback methods you can implement to
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * perform operations when the Activity moves between states.  The colored
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ovals are major states the Activity can be in.</p>
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><img src="../../../images/activity_lifecycle.png"
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      alt="State diagram for an Android Activity Lifecycle." border="0" /></p>
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>There are three key loops you may be interested in monitoring within your
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity:
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul>
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>The <b>entire lifetime</b> of an activity happens between the first call
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to {@link android.app.Activity#onCreate} through to a single final call
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to {@link android.app.Activity#onDestroy}.  An activity will do all setup
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of "global" state in onCreate(), and release all remaining resources in
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * onDestroy().  For example, if it has a thread running in the background
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to download data from the network, it may create that thread in onCreate()
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and then stop the thread in onDestroy().
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>The <b>visible lifetime</b> of an activity happens between a call to
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#onStart} until a corresponding call to
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#onStop}.  During this time the user can see the
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity on-screen, though it may not be in the foreground and interacting
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with the user.  Between these two methods you can maintain resources that
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are needed to show the activity to the user.  For example, you can register
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a {@link android.content.BroadcastReceiver} in onStart() to monitor for changes
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that impact your UI, and unregister it in onStop() when the user an no
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * longer see what you are displaying.  The onStart() and onStop() methods
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can be called multiple times, as the activity becomes visible and hidden
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to the user.
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>The <b>foreground lifetime</b> of an activity happens between a call to
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#onResume} until a corresponding call to
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#onPause}.  During this time the activity is
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in front of all other activities and interacting with the user.  An activity
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can frequently go between the resumed and paused states -- for example when
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the device goes to sleep, when an activity result is delivered, when a new
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * intent is delivered -- so the code in these methods should be fairly
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * lightweight.
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The entire lifecycle of an activity is defined by the following
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Activity methods.  All of these are hooks that you can override
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to do appropriate work when the activity changes state.  All
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activities will implement {@link android.app.Activity#onCreate}
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to do their initial setup; many will also implement
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#onPause} to commit changes to data and
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * otherwise prepare to stop interacting with the user.  You should always
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * call up to your superclass when implementing these methods.</p>
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p>
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint">
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * public class Activity extends ApplicationContext {
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onCreate(Bundle savedInstanceState);
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onStart();
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onRestart();
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onResume();
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onPause();
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onStop();
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onDestroy();
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * }
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </pre>
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>In general the movement through an activity's lifecycle looks like
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this:</p>
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <table border="2" width="85%" align="center" frame="hsides" rules="rows">
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <colgroup align="left" span="3" />
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <colgroup align="left" />
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <colgroup align="center" />
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <colgroup align="center" />
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <thead>
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th colspan="3">Method</th> <th>Description</th> <th>Killable?</th> <th>Next</th></tr>
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </thead>
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tbody>
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th colspan="3" align="left" border="0">{@link android.app.Activity#onCreate onCreate()}</th>
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>Called when the activity is first created.
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             This is where you should do all of your normal static set up:
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             create views, bind data to lists, etc.  This method also
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             provides you with a Bundle containing the activity's previously
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             frozen state, if there was one.
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             <p>Always followed by <code>onStart()</code>.</td>
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center">No</td>
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center"><code>onStart()</code></td>
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><td rowspan="5" style="border-left: none; border-right: none;">&nbsp;&nbsp;&nbsp;&nbsp;</td>
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <th colspan="2" align="left" border="0">{@link android.app.Activity#onRestart onRestart()}</th>
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>Called after your activity has been stopped, prior to it being
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             started again.
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             <p>Always followed by <code>onStart()</code></td>
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center">No</td>
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center"><code>onStart()</code></td>
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th colspan="2" align="left" border="0">{@link android.app.Activity#onStart onStart()}</th>
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>Called when the activity is becoming visible to the user.
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             <p>Followed by <code>onResume()</code> if the activity comes
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             to the foreground, or <code>onStop()</code> if it becomes hidden.</td>
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center">No</td>
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center"><code>onResume()</code> or <code>onStop()</code></td>
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><td rowspan="2" style="border-left: none;">&nbsp;&nbsp;&nbsp;&nbsp;</td>
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <th align="left" border="0">{@link android.app.Activity#onResume onResume()}</th>
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>Called when the activity will start
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             interacting with the user.  At this point your activity is at
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             the top of the activity stack, with user input going to it.
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             <p>Always followed by <code>onPause()</code>.</td>
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center">No</td>
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center"><code>onPause()</code></td>
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th align="left" border="0">{@link android.app.Activity#onPause onPause()}</th>
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>Called when the system is about to start resuming a previous
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             activity.  This is typically used to commit unsaved changes to
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             persistent data, stop animations and other things that may be consuming
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             CPU, etc.  Implementations of this method must be very quick because
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             the next activity will not be resumed until this method returns.
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             <p>Followed by either <code>onResume()</code> if the activity
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             returns back to the front, or <code>onStop()</code> if it becomes
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             invisible to the user.</td>
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center"><font color="#800000"><strong>Yes</strong></font></td>
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center"><code>onResume()</code> or<br>
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 <code>onStop()</code></td>
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th colspan="2" align="left" border="0">{@link android.app.Activity#onStop onStop()}</th>
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>Called when the activity is no longer visible to the user, because
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             another activity has been resumed and is covering this one.  This
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             may happen either because a new activity is being started, an existing
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             one is being brought in front of this one, or this one is being
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             destroyed.
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             <p>Followed by either <code>onRestart()</code> if
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             this activity is coming back to interact with the user, or
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             <code>onDestroy()</code> if this activity is going away.</td>
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center"><font color="#800000"><strong>Yes</strong></font></td>
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center"><code>onRestart()</code> or<br>
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 <code>onDestroy()</code></td>
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th colspan="3" align="left" border="0">{@link android.app.Activity#onDestroy onDestroy()}</th>
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>The final call you receive before your
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             activity is destroyed.  This can happen either because the
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             activity is finishing (someone called {@link Activity#finish} on
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             it, or because the system is temporarily destroying this
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             instance of the activity to save space.  You can distinguish
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             between these two scenarios with the {@link
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             Activity#isFinishing} method.</td>
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center"><font color="#800000"><strong>Yes</strong></font></td>
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center"><em>nothing</em></td>
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tbody>
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </table>
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Note the "Killable" column in the above table -- for those methods that
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are marked as being killable, after that method returns the process hosting the
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity may killed by the system <em>at any time</em> without another line
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of its code being executed.  Because of this, you should use the
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #onPause} method to write any persistent data (such as user edits)
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to storage.  In addition, the method
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #onSaveInstanceState(Bundle)} is called before placing the activity
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in such a background state, allowing you to save away any dynamic instance
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * state in your activity into the given Bundle, to be later received in
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #onCreate} if the activity needs to be re-created.
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the <a href="#ProcessLifecycle">Process Lifecycle</a>
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * section for more information on how the lifecycle of a process is tied
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to the activities it is hosting.  Note that it is important to save
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * persistent data in {@link #onPause} instead of {@link #onSaveInstanceState}
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * because the later is not part of the lifecycle callbacks, so will not
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be called in every situation as described in its documentation.</p>
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>For those methods that are not marked as being killable, the activity's
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * process will not be killed by the system starting from the time the method
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is called and continuing after it returns.  Thus an activity is in the killable
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * state, for example, between after <code>onPause()</code> to the start of
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <code>onResume()</code>.</p>
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="ConfigurationChanges"></a>
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Configuration Changes</h3>
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>If the configuration of the device (as defined by the
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Configuration Resources.Configuration} class) changes,
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * then anything displaying a user interface will need to update to match that
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * configuration.  Because Activity is the primary mechanism for interacting
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with the user, it includes special support for handling configuration
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * changes.</p>
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Unless you specify otherwise, a configuration change (such as a change
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in screen orientation, language, input devices, etc) will cause your
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current activity to be <em>destroyed</em>, going through the normal activity
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * lifecycle process of {@link #onPause},
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #onStop}, and {@link #onDestroy} as appropriate.  If the activity
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * had been in the foreground or visible to the user, once {@link #onDestroy} is
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * called in that instance then a new instance of the activity will be
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * created, with whatever savedInstanceState the previous instance had generated
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * from {@link #onSaveInstanceState}.</p>
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>This is done because any application resource,
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * including layout files, can change based on any configuration value.  Thus
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the only safe way to handle a configuration change is to re-retrieve all
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * resources, including layouts, drawables, and strings.  Because activities
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * must already know how to save their state and re-create themselves from
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that state, this is a convenient way to have an activity restart itself
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with a new configuration.</p>
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>In some special cases, you may want to bypass restarting of your
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity based on one or more types of configuration changes.  This is
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * done with the {@link android.R.attr#configChanges android:configChanges}
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * attribute in its manifest.  For any types of configuration changes you say
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that you handle there, you will receive a call to your current activity's
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #onConfigurationChanged} method instead of being restarted.  If
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a configuration change involves any that you do not handle, however, the
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity will still be restarted and {@link #onConfigurationChanged}
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will not be called.</p>
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="StartingActivities"></a>
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Starting Activities and Getting Results</h3>
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The {@link android.app.Activity#startActivity}
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * method is used to start a
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * new activity, which will be placed at the top of the activity stack.  It
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * takes a single argument, an {@link android.content.Intent Intent},
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * which describes the activity
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to be executed.</p>
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Sometimes you want to get a result back from an activity when it
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ends.  For example, you may start an activity that lets the user pick
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a person in a list of contacts; when it ends, it returns the person
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that was selected.  To do this, you call the
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#startActivityForResult(Intent, int)}
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * version with a second integer parameter identifying the call.  The result
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will come back through your {@link android.app.Activity#onActivityResult}
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * method.</p>
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>When an activity exits, it can call
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#setResult(int)}
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to return data back to its parent.  It must always supply a result code,
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * which can be the standard results RESULT_CANCELED, RESULT_OK, or any
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * custom values starting at RESULT_FIRST_USER.  In addition, it can optionally
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * return back an Intent containing any additional data it wants.  All of this
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * information appears back on the
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * parent's <code>Activity.onActivityResult()</code>, along with the integer
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * identifier it originally supplied.</p>
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>If a child activity fails for any reason (such as crashing), the parent
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity will receive a result with the code RESULT_CANCELED.</p>
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint">
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * public class MyActivity extends Activity {
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     ...
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     static final int PICK_CONTACT_REQUEST = 0;
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected boolean onKeyDown(int keyCode, KeyEvent event) {
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             // When the user center presses, let them pick a contact.
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             startActivityForResult(
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 new Intent(Intent.ACTION_PICK,
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 new Uri("content://contacts")),
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 PICK_CONTACT_REQUEST);
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *            return true;
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         }
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         return false;
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     }
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onActivityResult(int requestCode, int resultCode,
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             Intent data) {
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         if (requestCode == PICK_CONTACT_REQUEST) {
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             if (resultCode == RESULT_OK) {
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 // A contact was picked.  Here we will just display it
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 // to the user.
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 startActivity(new Intent(Intent.ACTION_VIEW, data));
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             }
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         }
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     }
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * }
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </pre>
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="SavingPersistentState"></a>
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Saving Persistent State</h3>
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>There are generally two kinds of persistent state than an activity
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will deal with: shared document-like data (typically stored in a SQLite
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * database using a {@linkplain android.content.ContentProvider content provider})
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and internal state such as user preferences.</p>
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>For content provider data, we suggest that activities use a
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * "edit in place" user model.  That is, any edits a user makes are effectively
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * made immediately without requiring an additional confirmation step.
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Supporting this model is generally a simple matter of following two rules:</p>
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul>
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> <p>When creating a new document, the backing database entry or file for
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             it is created immediately.  For example, if the user chooses to write
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             a new e-mail, a new entry for that e-mail is created as soon as they
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             start entering data, so that if they go to any other activity after
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             that point this e-mail will now appear in the list of drafts.</p>
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> <p>When an activity's <code>onPause()</code> method is called, it should
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             commit to the backing content provider or file any changes the user
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             has made.  This ensures that those changes will be seen by any other
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             activity that is about to run.  You will probably want to commit
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             your data even more aggressively at key times during your
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             activity's lifecycle: for example before starting a new
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             activity, before finishing your own activity, when the user
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             switches between input fields, etc.</p>
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>This model is designed to prevent data loss when a user is navigating
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * between activities, and allows the system to safely kill an activity (because
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * system resources are needed somewhere else) at any time after it has been
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * paused.  Note this implies
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that the user pressing BACK from your activity does <em>not</em>
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mean "cancel" -- it means to leave the activity with its current contents
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * saved away.  Cancelling edits in an activity must be provided through
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * some other mechanism, such as an explicit "revert" or "undo" option.</p>
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>See the {@linkplain android.content.ContentProvider content package} for
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * more information about content providers.  These are a key aspect of how
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * different activities invoke and propagate data between themselves.</p>
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The Activity class also provides an API for managing internal persistent state
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * associated with an activity.  This can be used, for example, to remember
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the user's preferred initial display in a calendar (day view or week view)
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or the user's default home page in a web browser.</p>
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Activity persistent state is managed
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with the method {@link #getPreferences},
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * allowing you to retrieve and
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * modify a set of name/value pairs associated with the activity.  To use
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * preferences that are shared across multiple application components
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (activities, receivers, services, providers), you can use the underlying
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Context#getSharedPreferences Context.getSharedPreferences()} method
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to retrieve a preferences
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * object stored under a specific name.
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (Note that it is not possible to share settings data across application
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * packages -- for that you will need a content provider.)</p>
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Here is an excerpt from a calendar activity that stores the user's
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * preferred view mode in its persistent settings:</p>
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint">
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * public class CalendarActivity extends Activity {
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     ...
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     static final int DAY_VIEW_MODE = 0;
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     static final int WEEK_VIEW_MODE = 1;
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     private SharedPreferences mPrefs;
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     private int mCurViewMode;
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onCreate(Bundle savedInstanceState) {
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         super.onCreate(savedInstanceState);
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         SharedPreferences mPrefs = getSharedPreferences();
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         mCurViewMode = mPrefs.getInt("view_mode" DAY_VIEW_MODE);
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     }
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onPause() {
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         super.onPause();
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         SharedPreferences.Editor ed = mPrefs.edit();
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         ed.putInt("view_mode", mCurViewMode);
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         ed.commit();
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     }
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * }
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </pre>
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="Permissions"></a>
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Permissions</h3>
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The ability to start a particular Activity can be enforced when it is
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * declared in its
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * manifest's {@link android.R.styleable#AndroidManifestActivity &lt;activity&gt;}
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * tag.  By doing so, other applications will need to declare a corresponding
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.styleable#AndroidManifestUsesPermission &lt;uses-permission&gt;}
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * element in their own manifest to be able to start that activity.
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>See the <a href="{@docRoot}guide/topics/security/security.html">Security and Permissions</a>
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * document for more information on permissions and security in general.
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="ProcessLifecycle"></a>
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Process Lifecycle</h3>
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The Android system attempts to keep application process around for as
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * long as possible, but eventually will need to remove old processes when
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * memory runs low.  As described in <a href="#ActivityLifecycle">Activity
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Lifecycle</a>, the decision about which process to remove is intimately
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * tied to the state of the user's interaction with it.  In general, there
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are four states a process can be in based on the activities running in it,
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * listed here in order of importance.  The system will kill less important
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * processes (the last ones) before it resorts to killing more important
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * processes (the first ones).
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ol>
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <p>The <b>foreground activity</b> (the activity at the top of the screen
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that the user is currently interacting with) is considered the most important.
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Its process will only be killed as a last resort, if it uses more memory
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * than is available on the device.  Generally at this point the device has
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * reached a memory paging state, so this is required in order to keep the user
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * interface responsive.
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <p>A <b>visible activity</b> (an activity that is visible to the user
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * but not in the foreground, such as one sitting behind a foreground dialog)
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is considered extremely important and will not be killed unless that is
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * required to keep the foreground activity running.
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <p>A <b>background activity</b> (an activity that is not visible to
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the user and has been paused) is no longer critical, so the system may
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * safely kill its process to reclaim memory for other foreground or
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * visible processes.  If its process needs to be killed, when the user navigates
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * back to the activity (making it visible on the screen again), its
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #onCreate} method will be called with the savedInstanceState it had previously
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * supplied in {@link #onSaveInstanceState} so that it can restart itself in the same
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * state as the user last left it.
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <p>An <b>empty process</b> is one hosting no activities or other
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * application components (such as {@link Service} or
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.BroadcastReceiver} classes).  These are killed very
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * quickly by the system as memory becomes low.  For this reason, any
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * background operation you do outside of an activity must be executed in the
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * context of an activity BroadcastReceiver or Service to ensure that the system
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * knows it needs to keep your process around.
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ol>
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Sometimes an Activity may need to do a long-running operation that exists
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * independently of the activity lifecycle itself.  An example may be a camera
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * application that allows you to upload a picture to a web site.  The upload
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * may take a long time, and the application should allow the user to leave
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the application will it is executing.  To accomplish this, your Activity
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * should start a {@link Service} in which the upload takes place.  This allows
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the system to properly prioritize your process (considering it to be more
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * important than other non-visible applications) for the duration of the
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * upload, independent of whether the original activity is paused, stopped,
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or finished.
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Activity extends ContextThemeWrapper
610625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        implements LayoutInflater.Factory2,
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Window.Callback, KeyEvent.Callback,
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        OnCreateContextMenuListener, ComponentCallbacks {
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String TAG = "Activity";
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Standard activity result: operation canceled. */
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int RESULT_CANCELED    = 0;
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Standard activity result: operation succeeded. */
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int RESULT_OK           = -1;
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Start of user-defined activity results. */
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int RESULT_FIRST_USER   = 1;
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String WINDOW_HIERARCHY_TAG = "android:viewHierarchyState";
623b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    private static final String FRAGMENTS_TAG = "android:fragments";
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String SAVED_DIALOG_IDS_KEY = "android:savedDialogIds";
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String SAVED_DIALOGS_TAG = "android:savedDialogs";
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String SAVED_DIALOG_KEY_PREFIX = "android:dialog_";
6278ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    private static final String SAVED_DIALOG_ARGS_KEY_PREFIX = "android:dialog_args_";
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6298ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    private static class ManagedDialog {
6308ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        Dialog mDialog;
6318ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        Bundle mArgs;
6328ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    }
6338ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    private SparseArray<ManagedDialog> mManagedDialogs;
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // set by the thread after the constructor and before onCreate(Bundle savedInstanceState) is called.
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Instrumentation mInstrumentation;
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IBinder mToken;
638b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn    private int mIdent;
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ String mEmbeddedID;
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Application mApplication;
641b70f3dff01e7e1e85f77cf0b0b2eaba8200eb82cChristopher Tate    /*package*/ Intent mIntent;
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ComponentName mComponent;
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ ActivityInfo mActivityInfo;
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ ActivityThread mMainThread;
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Activity mParent;
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mCalled;
6475e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn    boolean mCheckedForLoaderManager;
648fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn    boolean mLoadersStarted;
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mResumed;
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mStopped;
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mFinished;
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mStartedActivity;
653fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn    /** true if the activity is going through a transient pause */
654fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn    /*package*/ boolean mTemporaryPause = false;
6553d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton    /** true if the activity is being destroyed in order to recreate it with a new configuration */
6563d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton    /*package*/ boolean mChangingConfigurations = false;
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ int mConfigChangeFlags;
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ Configuration mCurrentConfig;
6598d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert    private SearchManager mSearchManager;
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
661b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    static final class NonConfigurationInstances {
662b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        Object activity;
663b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        HashMap<String, Object> children;
664b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        ArrayList<Fragment> fragments;
6654911b783aa9f4af5ac919db861751d350471f5efDianne Hackborn        SparseArray<LoaderManagerImpl> loaders;
666b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
667b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    /* package */ NonConfigurationInstances mLastNonConfigurationInstances;
668b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Window mWindow;
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private WindowManager mWindowManager;
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ View mDecor = null;
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ boolean mWindowAdded = false;
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ boolean mVisibleFromServer = false;
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ boolean mVisibleFromClient = true;
676ac695c608ba620e2362f57126d7be453cf5b7e1bAdam Powell    /*package*/ ActionBarImpl mActionBar = null;
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private CharSequence mTitle;
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mTitleColor = 0;
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
681b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    final FragmentManagerImpl mFragments = new FragmentManagerImpl();
6822dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
6834911b783aa9f4af5ac919db861751d350471f5efDianne Hackborn    SparseArray<LoaderManagerImpl> mAllLoaderManagers;
6844911b783aa9f4af5ac919db861751d350471f5efDianne Hackborn    LoaderManagerImpl mLoaderManager;
685c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final class ManagedCursor {
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ManagedCursor(Cursor cursor) {
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCursor = cursor;
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mReleased = false;
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUpdated = false;
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final Cursor mCursor;
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private boolean mReleased;
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private boolean mUpdated;
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final ArrayList<ManagedCursor> mManagedCursors =
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new ArrayList<ManagedCursor>();
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // protected by synchronized (this)
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mResultCode = RESULT_CANCELED;
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Intent mResultData = null;
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mTitleReady = false;
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mDefaultKeyMode = DEFAULT_KEYS_DISABLE;
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private SpannableStringBuilder mDefaultKeySsb = null;
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static final int[] FOCUSED_STATE_SET = {com.android.internal.R.attr.state_focused};
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Thread mUiThread;
712b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    final Handler mHandler = new Handler();
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Return the intent that started this activity. */
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Intent getIntent() {
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mIntent;
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Change the intent returned by {@link #getIntent}.  This holds a
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * reference to the given intent; it does not copy it.  Often used in
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * conjunction with {@link #onNewIntent}.
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param newIntent The new Intent object to return from getIntent
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getIntent
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onNewIntent
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setIntent(Intent newIntent) {
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mIntent = newIntent;
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Return the application that owns this activity. */
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final Application getApplication() {
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mApplication;
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Is this activity embedded inside of another activity? */
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean isChild() {
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mParent != null;
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Return the parent activity if this view is an embedded child. */
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final Activity getParent() {
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mParent;
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Retrieve the window manager for showing custom windows. */
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public WindowManager getWindowManager() {
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mWindowManager;
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the current {@link android.view.Window} for the activity.
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This can be used to directly access parts of the Window API that
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * are not available through Activity/Screen.
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Window The current window, or null if the activity is not
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         visual.
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Window getWindow() {
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mWindow;
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
766c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn     * Return the LoaderManager for this fragment, creating it if needed.
767c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn     */
768c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn    public LoaderManager getLoaderManager() {
769c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn        if (mLoaderManager != null) {
770c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn            return mLoaderManager;
771c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn        }
7725e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn        mCheckedForLoaderManager = true;
773fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn        mLoaderManager = getLoaderManager(-1, mLoadersStarted, true);
774c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn        return mLoaderManager;
775c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn    }
776c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn
7775e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn    LoaderManagerImpl getLoaderManager(int index, boolean started, boolean create) {
778c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn        if (mAllLoaderManagers == null) {
7794911b783aa9f4af5ac919db861751d350471f5efDianne Hackborn            mAllLoaderManagers = new SparseArray<LoaderManagerImpl>();
780c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn        }
7814911b783aa9f4af5ac919db861751d350471f5efDianne Hackborn        LoaderManagerImpl lm = mAllLoaderManagers.get(index);
782fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn        if (lm == null) {
783fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn            if (create) {
784fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn                lm = new LoaderManagerImpl(this, started);
785fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn                mAllLoaderManagers.put(index, lm);
786fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn            }
787fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn        } else {
788fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn            lm.updateActivity(this);
789c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn        }
790c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn        return lm;
791c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn    }
792c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn
793c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn    /**
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Calls {@link android.view.Window#getCurrentFocus} on the
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Window of this Activity to return the currently focused view.
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return View The current View with focus or null.
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getWindow
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.view.Window#getCurrentFocus
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public View getCurrentFocus() {
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mWindow != null ? mWindow.getCurrentFocus() : null;
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getWallpaperDesiredMinimumWidth() {
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int width = super.getWallpaperDesiredMinimumWidth();
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return width <= 0 ? getWindowManager().getDefaultDisplay().getWidth() : width;
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getWallpaperDesiredMinimumHeight() {
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int height = super.getWallpaperDesiredMinimumHeight();
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return height <= 0 ? getWindowManager().getDefaultDisplay().getHeight() : height;
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when the activity is starting.  This is where most initialization
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * should go: calling {@link #setContentView(int)} to inflate the
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity's UI, using {@link #findViewById} to programmatically interact
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * with widgets in the UI, calling
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #managedQuery(android.net.Uri , String[], String, String[], String)} to retrieve
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * cursors for data being displayed, etc.
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>You can call {@link #finish} from within this function, in
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * which case onDestroy() will be immediately called without any of the rest
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of the activity lifecycle ({@link #onStart}, {@link #onResume},
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onPause}, etc) executing.
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Derived classes must call through to the super class's
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method.  If they do not, an exception will be
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thrown.</em></p>
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param savedInstanceState If the activity is being re-initialized after
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *     previously being shut down then this Bundle contains the data it most
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *     recently supplied in {@link #onSaveInstanceState}.  <b><i>Note: Otherwise it is null.</i></b>
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onStart
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onSaveInstanceState
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onRestoreInstanceState
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPostCreate
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onCreate(Bundle savedInstanceState) {
845bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn        mVisibleFromClient = !mWindow.getWindowStyle().getBoolean(
846bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn                com.android.internal.R.styleable.Window_windowNoDisplay, false);
8472707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn        if (mLastNonConfigurationInstances != null) {
8482707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn            mAllLoaderManagers = mLastNonConfigurationInstances.loaders;
8492707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn        }
850b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (savedInstanceState != null) {
851b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            Parcelable p = savedInstanceState.getParcelable(FRAGMENTS_TAG);
852b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            mFragments.restoreAllState(p, mLastNonConfigurationInstances != null
853b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    ? mLastNonConfigurationInstances.fragments : null);
854b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
855b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mFragments.dispatchCreate();
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The hook for {@link ActivityThread} to restore the state of this activity.
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Calls {@link #onSaveInstanceState(android.os.Bundle)} and
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #restoreManagedDialogs(android.os.Bundle)}.
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param savedInstanceState contains the saved state
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performRestoreInstanceState(Bundle savedInstanceState) {
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onRestoreInstanceState(savedInstanceState);
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        restoreManagedDialogs(savedInstanceState);
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This method is called after {@link #onStart} when the activity is
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * being re-initialized from a previously saved state, given here in
875305de9dbda4e40d60ca99dda307ccd5e3c23e0a0Mike LeBeau     * <var>savedInstanceState</var>.  Most implementations will simply use {@link #onCreate}
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to restore their state, but it is sometimes convenient to do it here
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * after all of the initialization has been done or to allow subclasses to
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * decide whether to use your default implementation.  The default
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method performs a restore of any view state that
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * had previously been frozen by {@link #onSaveInstanceState}.
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This method is called between {@link #onStart} and
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onPostCreate}.
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param savedInstanceState the data most recently supplied in {@link #onSaveInstanceState}.
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onCreate
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPostCreate
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onResume
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onSaveInstanceState
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onRestoreInstanceState(Bundle savedInstanceState) {
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mWindow != null) {
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Bundle windowState = savedInstanceState.getBundle(WINDOW_HIERARCHY_TAG);
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (windowState != null) {
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWindow.restoreHierarchyState(windowState);
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Restore the state of any saved managed dialogs.
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param savedInstanceState The bundle to restore from.
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void restoreManagedDialogs(Bundle savedInstanceState) {
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Bundle b = savedInstanceState.getBundle(SAVED_DIALOGS_TAG);
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (b == null) {
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int[] ids = b.getIntArray(SAVED_DIALOG_IDS_KEY);
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int numDialogs = ids.length;
9148ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        mManagedDialogs = new SparseArray<ManagedDialog>(numDialogs);
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < numDialogs; i++) {
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final Integer dialogId = ids[i];
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Bundle dialogState = b.getBundle(savedDialogKeyFor(dialogId));
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (dialogState != null) {
919e35c23514592efe07d54fdbed7e7ec0b717e8bbeRomain Guy                // Calling onRestoreInstanceState() below will invoke dispatchOnCreate
920e35c23514592efe07d54fdbed7e7ec0b717e8bbeRomain Guy                // so tell createDialog() not to do it, otherwise we get an exception
9218ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                final ManagedDialog md = new ManagedDialog();
9228ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                md.mArgs = b.getBundle(savedDialogArgsKeyFor(dialogId));
9238ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                md.mDialog = createDialog(dialogId, dialogState, md.mArgs);
9248ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                if (md.mDialog != null) {
9258ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                    mManagedDialogs.put(dialogId, md);
9268ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                    onPrepareDialog(dialogId, md.mDialog, md.mArgs);
9278ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                    md.mDialog.onRestoreInstanceState(dialogState);
9288ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                }
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9338ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    private Dialog createDialog(Integer dialogId, Bundle state, Bundle args) {
9348ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        final Dialog dialog = onCreateDialog(dialogId, args);
935764d5331d15c19162c938e617777b4bf15a6314dRomain Guy        if (dialog == null) {
9368ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            return null;
937764d5331d15c19162c938e617777b4bf15a6314dRomain Guy        }
9386de4aed1c67263269f83f579ec5b06263d173ef3Romain Guy        dialog.dispatchOnCreate(state);
939764d5331d15c19162c938e617777b4bf15a6314dRomain Guy        return dialog;
940764d5331d15c19162c938e617777b4bf15a6314dRomain Guy    }
941764d5331d15c19162c938e617777b4bf15a6314dRomain Guy
9428ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    private static String savedDialogKeyFor(int key) {
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return SAVED_DIALOG_KEY_PREFIX + key;
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9468ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    private static String savedDialogArgsKeyFor(int key) {
9478ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        return SAVED_DIALOG_ARGS_KEY_PREFIX + key;
9488ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    }
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when activity start-up is complete (after {@link #onStart}
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and {@link #onRestoreInstanceState} have been called).  Applications will
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * generally not implement this method; it is intended for system
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * classes to do final initialization after application code has run.
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Derived classes must call through to the super class's
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method.  If they do not, an exception will be
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thrown.</em></p>
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param savedInstanceState If the activity is being re-initialized after
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *     previously being shut down then this Bundle contains the data it most
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *     recently supplied in {@link #onSaveInstanceState}.  <b><i>Note: Otherwise it is null.</i></b>
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onCreate
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onPostCreate(Bundle savedInstanceState) {
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!isChild()) {
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTitleReady = true;
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            onTitleChanged(getTitle(), getTitleColor());
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called after {@link #onCreate} &mdash; or after {@link #onRestart} when
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the activity had been stopped, but is now again being displayed to the
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	 * user.  It will be followed by {@link #onResume}.
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Derived classes must call through to the super class's
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method.  If they do not, an exception will be
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thrown.</em></p>
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onCreate
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onStop
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onResume
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onStart() {
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
988fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn
989fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn        if (!mLoadersStarted) {
990fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn            mLoadersStarted = true;
991fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn            if (mLoaderManager != null) {
992fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn                mLoaderManager.doStart();
993fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn            } else if (!mCheckedForLoaderManager) {
994fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn                mLoaderManager = getLoaderManager(-1, mLoadersStarted, false);
995fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn            }
996fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn            mCheckedForLoaderManager = true;
9972707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn        }
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called after {@link #onStop} when the current activity is being
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * re-displayed to the user (the user has navigated back to it).  It will
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be followed by {@link #onStart} and then {@link #onResume}.
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>For activities that are using raw {@link Cursor} objects (instead of
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * creating them through
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #managedQuery(android.net.Uri , String[], String, String[], String)},
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this is usually the place
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * where the cursor should be requeried (because you had deactivated it in
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onStop}.
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Derived classes must call through to the super class's
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method.  If they do not, an exception will be
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thrown.</em></p>
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onStop
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onStart
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onResume
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onRestart() {
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called after {@link #onRestoreInstanceState}, {@link #onRestart}, or
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onPause}, for your activity to start interacting with the user.
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is a good place to begin animations, open exclusive-access devices
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * (such as the camera), etc.
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Keep in mind that onResume is not the best indicator that your activity
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is visible to the user; a system window such as the keyguard may be in
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * front.  Use {@link #onWindowFocusChanged} to know for certain that your
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity is visible to the user (for example, to resume a game).
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 #onRestoreInstanceState
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onRestart
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPostResume
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPause
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onResume() {
10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when activity resume is complete (after {@link #onResume} has
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * been called). Applications will generally not implement this method;
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * it is intended for system classes to do final setup after application
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * resume code has run.
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Derived classes must call through to the super class's
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method.  If they do not, an exception will be
10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thrown.</em></p>
10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onResume
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onPostResume() {
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Window win = getWindow();
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (win != null) win.makeActive();
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is called for activities that set launchMode to "singleTop" in
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * their package, or if a client used the {@link Intent#FLAG_ACTIVITY_SINGLE_TOP}
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * flag when calling {@link #startActivity}.  In either case, when the
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity is re-launched while at the top of the activity stack instead
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of a new instance of the activity being started, onNewIntent() will be
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * called on the existing instance with the Intent that was used to
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * re-launch it.
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>An activity will always be paused before receiving a new intent, so
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * you can count on {@link #onResume} being called after this method.
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note that {@link #getIntent} still returns the original Intent.  You
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * can use {@link #setIntent} to update it to this new Intent.
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param intent The new intent that was started for the activity.
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getIntent
10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setIntent
10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onResume
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onNewIntent(Intent intent) {
10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The hook for {@link ActivityThread} to save the state of this activity.
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Calls {@link #onSaveInstanceState(android.os.Bundle)}
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and {@link #saveManagedDialogs(android.os.Bundle)}.
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param outState The bundle to save the state to.
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performSaveInstanceState(Bundle outState) {
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onSaveInstanceState(outState);
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        saveManagedDialogs(outState);
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called to retrieve per-instance state from an activity before being killed
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * so that the state can be restored in {@link #onCreate} or
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onRestoreInstanceState} (the {@link Bundle} populated by this method
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will be passed to both).
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This method is called before an activity may be killed so that when it
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * comes back some time in the future it can restore its state.  For example,
11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if activity B is launched in front of activity A, and at some point activity
11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A is killed to reclaim resources, activity A will have a chance to save the
11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * current state of its user interface via this method so that when the user
11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returns to activity A, the state of the user interface can be restored
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * via {@link #onCreate} or {@link #onRestoreInstanceState}.
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Do not confuse this method with activity lifecycle callbacks such as
11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onPause}, which is always called when an activity is being placed
11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in the background or on its way to destruction, or {@link #onStop} which
11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is called before destruction.  One example of when {@link #onPause} and
11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onStop} is called and not this method is when a user navigates back
11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * from activity B to activity A: there is no need to call {@link #onSaveInstanceState}
11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * on B because that particular instance will never be restored, so the
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * system avoids calling it.  An example when {@link #onPause} is called and
11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not {@link #onSaveInstanceState} is when activity B is launched in front of activity A:
11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the system may avoid calling {@link #onSaveInstanceState} on activity A if it isn't
11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * killed during the lifetime of B since the state of the user interface of
11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A will stay intact.
11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The default implementation takes care of most of the UI per-instance
11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * state for you by calling {@link android.view.View#onSaveInstanceState()} on each
11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * view in the hierarchy that has an id, and by saving the id of the currently
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * focused view (all of which is restored by the default implementation of
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onRestoreInstanceState}).  If you override this method to save additional
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * information not captured by each individual view, you will likely want to
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * call through to the default implementation, otherwise be prepared to save
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * all of the state of each view yourself.
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>If called, this method will occur before {@link #onStop}.  There are
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * no guarantees about whether it will occur before or after {@link #onPause}.
11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param outState Bundle in which to place your saved state.
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onCreate
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onRestoreInstanceState
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPause
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onSaveInstanceState(Bundle outState) {
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outState.putBundle(WINDOW_HIERARCHY_TAG, mWindow.saveHierarchyState());
1150b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        Parcelable p = mFragments.saveAllState();
1151b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (p != null) {
1152b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            outState.putParcelable(FRAGMENTS_TAG, p);
1153b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Save the state of any managed dialogs.
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param outState place to store the saved state.
11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void saveManagedDialogs(Bundle outState) {
11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mManagedDialogs == null) {
11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int numDialogs = mManagedDialogs.size();
11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (numDialogs == 0) {
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Bundle dialogState = new Bundle();
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int[] ids = new int[mManagedDialogs.size()];
11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // save each dialog's bundle, gather the ids
11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < numDialogs; i++) {
11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int key = mManagedDialogs.keyAt(i);
11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ids[i] = key;
11798ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            final ManagedDialog md = mManagedDialogs.valueAt(i);
11808ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            dialogState.putBundle(savedDialogKeyFor(key), md.mDialog.onSaveInstanceState());
11818ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            if (md.mArgs != null) {
11828ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                dialogState.putBundle(savedDialogArgsKeyFor(key), md.mArgs);
11838ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            }
11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dialogState.putIntArray(SAVED_DIALOG_IDS_KEY, ids);
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outState.putBundle(SAVED_DIALOGS_TAG, dialogState);
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called as part of the activity lifecycle when an activity is going into
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the background, but has not (yet) been killed.  The counterpart to
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onResume}.
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>When activity B is launched in front of activity A, this callback will
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be invoked on A.  B will not be created until A's {@link #onPause} returns,
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * so be sure to not do anything lengthy here.
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This callback is mostly used for saving any persistent state the
12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity is editing, to present a "edit in place" model to the user and
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * making sure nothing is lost if there are not enough resources to start
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the new activity without first killing this one.  This is also a good
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * place to do things like stop animations and other things that consume a
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * noticeable mount of CPU in order to make the switch to the next activity
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * as fast as possible, or to close resources that are exclusive access
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * such as the camera.
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>In situations where the system needs more memory it may kill paused
12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * processes to reclaim resources.  Because of this, you should be sure
12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that all of your state is saved by the time you return from
12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this function.  In general {@link #onSaveInstanceState} is used to save
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * per-instance state in the activity and this method is used to store
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * global persistent data (in content providers, files, etc.)
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>After receiving this call you will usually receive a following call
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to {@link #onStop} (after the next activity has been resumed and
12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * displayed), however in some cases there will be a direct call back to
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onResume} without going through the stopped state.
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Derived classes must call through to the super class's
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method.  If they do not, an exception will be
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thrown.</em></p>
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onResume
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onSaveInstanceState
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onStop
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onPause() {
12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called as part of the activity lifecycle when an activity is about to go
12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * into the background as the result of user choice.  For example, when the
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * user presses the Home key, {@link #onUserLeaveHint} will be called, but
12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * when an incoming phone call causes the in-call Activity to be automatically
12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * brought to the foreground, {@link #onUserLeaveHint} will not be called on
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the activity being interrupted.  In cases when it is invoked, this method
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is called right before the activity's {@link #onPause} callback.
12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This callback and {@link #onUserInteraction} are intended to help
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activities manage status bar notifications intelligently; specifically,
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for helping activities determine the proper time to cancel a notfication.
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onUserInteraction()
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onUserLeaveHint() {
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Generate a new thumbnail for this activity.  This method is called before
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * pausing the activity, and should draw into <var>outBitmap</var> the
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * imagery for the desired thumbnail in the dimensions of that bitmap.  It
12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * can use the given <var>canvas</var>, which is configured to draw into the
12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * bitmap, for rendering if desired.
12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The default implementation renders the Screen's current view
12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * hierarchy into the canvas to generate a thumbnail.
12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>If you return false, the bitmap will be filled with a default
12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thumbnail.
12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param outBitmap The bitmap to contain the thumbnail.
12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param canvas Can be used to render into the bitmap.
12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Return true if you have drawn into the bitmap; otherwise after
12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         you return it will be filled with a default thumbnail.
12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onCreateDescription
12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onSaveInstanceState
12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPause
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onCreateThumbnail(Bitmap outBitmap, Canvas canvas) {
12750b2a6d0773211449fbde9d2706388714beeffebbJim Miller        if (mDecor == null) {
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12790b2a6d0773211449fbde9d2706388714beeffebbJim Miller        int paddingLeft = 0;
12800b2a6d0773211449fbde9d2706388714beeffebbJim Miller        int paddingRight = 0;
12810b2a6d0773211449fbde9d2706388714beeffebbJim Miller        int paddingTop = 0;
12820b2a6d0773211449fbde9d2706388714beeffebbJim Miller        int paddingBottom = 0;
12830b2a6d0773211449fbde9d2706388714beeffebbJim Miller
12840b2a6d0773211449fbde9d2706388714beeffebbJim Miller        // Find System window and use padding so we ignore space reserved for decorations
12850b2a6d0773211449fbde9d2706388714beeffebbJim Miller        // like the status bar and such.
12860b2a6d0773211449fbde9d2706388714beeffebbJim Miller        final FrameLayout top = (FrameLayout) mDecor;
12870b2a6d0773211449fbde9d2706388714beeffebbJim Miller        for (int i = 0; i < top.getChildCount(); i++) {
12880b2a6d0773211449fbde9d2706388714beeffebbJim Miller            View child = top.getChildAt(i);
12890b2a6d0773211449fbde9d2706388714beeffebbJim Miller            if (child.isFitsSystemWindowsFlagSet()) {
12900b2a6d0773211449fbde9d2706388714beeffebbJim Miller                paddingLeft = child.getPaddingLeft();
12910b2a6d0773211449fbde9d2706388714beeffebbJim Miller                paddingRight = child.getPaddingRight();
12920b2a6d0773211449fbde9d2706388714beeffebbJim Miller                paddingTop = child.getPaddingTop();
12930b2a6d0773211449fbde9d2706388714beeffebbJim Miller                paddingBottom = child.getPaddingBottom();
12940b2a6d0773211449fbde9d2706388714beeffebbJim Miller                break;
12950b2a6d0773211449fbde9d2706388714beeffebbJim Miller            }
12960b2a6d0773211449fbde9d2706388714beeffebbJim Miller        }
12970b2a6d0773211449fbde9d2706388714beeffebbJim Miller
12980b2a6d0773211449fbde9d2706388714beeffebbJim Miller        final int visibleWidth = mDecor.getWidth() - paddingLeft - paddingRight;
12990b2a6d0773211449fbde9d2706388714beeffebbJim Miller        final int visibleHeight = mDecor.getHeight() - paddingTop - paddingBottom;
13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        canvas.save();
13020b2a6d0773211449fbde9d2706388714beeffebbJim Miller        canvas.scale( (float) outBitmap.getWidth() / visibleWidth,
13030b2a6d0773211449fbde9d2706388714beeffebbJim Miller                (float) outBitmap.getHeight() / visibleHeight);
13040b2a6d0773211449fbde9d2706388714beeffebbJim Miller        canvas.translate(-paddingLeft, -paddingTop);
13050b2a6d0773211449fbde9d2706388714beeffebbJim Miller        mDecor.draw(canvas);
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        canvas.restore();
13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Generate a new description for this activity.  This method is called
13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * before pausing the activity and can, if desired, return some textual
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * description of its current state to be displayed to the user.
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The default implementation returns null, which will cause you to
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * inherit the description from the previous activity.  If all activities
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * return null, generally the label of the top activity will be used as the
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * description.
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return A description of what the user is doing.  It should be short and
13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         sweet (only a few words).
13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onCreateThumbnail
13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onSaveInstanceState
13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPause
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public CharSequence onCreateDescription() {
13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when you are no longer visible to the user.  You will next
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * receive either {@link #onRestart}, {@link #onDestroy}, or nothing,
13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * depending on later user activity.
13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note that this method may never be called, in low memory situations
13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * where the system does not have enough memory to keep your activity's
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * process running after its {@link #onPause} method is called.
13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Derived classes must call through to the super class's
13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method.  If they do not, an exception will be
13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thrown.</em></p>
13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onRestart
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onResume
13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onSaveInstanceState
13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onDestroy
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onStop() {
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Perform any final cleanup before an activity is destroyed.  This can
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * happen either because the activity is finishing (someone called
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #finish} on it, or because the system is temporarily destroying
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this instance of the activity to save space.  You can distinguish
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * between these two scenarios with the {@link #isFinishing} method.
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Note: do not count on this method being called as a place for
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * saving data! For example, if an activity is editing data in a content
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * provider, those edits should be committed in either {@link #onPause} or
13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onSaveInstanceState}, not here.</em> This method is usually implemented to
13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * free resources like threads that are associated with an activity, so
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that a destroyed activity does not leave such things around while the
13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * rest of its application is still running.  There are situations where
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the system will simply kill the activity's hosting process without
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * calling this method (or any others) in it, so it should not be used to
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * do things that are intended to remain around after the process goes
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * away.
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Derived classes must call through to the super class's
13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method.  If they do not, an exception will be
13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thrown.</em></p>
13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPause
13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onStop
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #finish
13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isFinishing
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onDestroy() {
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // dismiss any dialogs we are managing.
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mManagedDialogs != null) {
13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int numDialogs = mManagedDialogs.size();
13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i = 0; i < numDialogs; i++) {
13898ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                final ManagedDialog md = mManagedDialogs.valueAt(i);
13908ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                if (md.mDialog.isShowing()) {
13918ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                    md.mDialog.dismiss();
13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13948ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            mManagedDialogs = null;
13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // close any cursors we are managing.
13982f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki        synchronized (mManagedCursors) {
13992f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki            int numCursors = mManagedCursors.size();
14002f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki            for (int i = 0; i < numCursors; i++) {
14012f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                ManagedCursor c = mManagedCursors.get(i);
14022f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                if (c != null) {
14032f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                    c.mCursor.close();
14042f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                }
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14062f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki            mManagedCursors.clear();
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14084986044fd3bce877247e425374b47967775081a8Amith Yamasani
14094986044fd3bce877247e425374b47967775081a8Amith Yamasani        // Close any open search dialog
14104986044fd3bce877247e425374b47967775081a8Amith Yamasani        if (mSearchManager != null) {
14114986044fd3bce877247e425374b47967775081a8Amith Yamasani            mSearchManager.stopSearch();
14124986044fd3bce877247e425374b47967775081a8Amith Yamasani        }
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called by the system when the device configuration changes while your
14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity is running.  Note that this will <em>only</em> be called if
14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * you have selected configurations you would like to handle with the
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.R.attr#configChanges} attribute in your manifest.  If
14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * any configuration change occurs that is not selected to be reported
14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * by that attribute, then instead of reporting it the system will stop
14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and restart the activity (to have it launched with the new
14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * configuration).
14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>At the time that this function has been called, your Resources
14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * object will have been updated to return resource values matching the
14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * new configuration.
14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param newConfig The new device configuration.
14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onConfigurationChanged(Configuration newConfig) {
14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
1433444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert
14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mWindow != null) {
14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Pass the configuration changed event to the window
14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindow.onConfigurationChanged(newConfig);
14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If this activity is being destroyed because it can not handle a
14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * configuration parameter being changed (and thus its
14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onConfigurationChanged(Configuration)} method is
14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <em>not</em> being called), then you can use this method to discover
14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the set of changes that have occurred while in the process of being
14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * destroyed.  Note that there is no guarantee that these will be
14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * accurate (other changes could have happened at any time), so you should
14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * only use this as an optimization hint.
14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns a bit field of the configuration parameters that are
14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * changing, as defined by the {@link android.content.res.Configuration}
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * class.
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getChangingConfigurations() {
14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mConfigChangeFlags;
14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the non-configuration instance data that was previously
14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returned by {@link #onRetainNonConfigurationInstance()}.  This will
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be available from the initial {@link #onCreate} and
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onStart} calls to the new instance, allowing you to extract
14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * any useful dynamic state from the previous instance.
14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note that the data you retrieve here should <em>only</em> be used
14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * as an optimization for handling configuration changes.  You should always
14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be able to handle getting a null pointer back, and an activity must
14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * still be able to restore itself to its previous state (through the
14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * normal {@link #onSaveInstanceState(Bundle)} mechanism) even if this
14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * function returns null.
14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the object previously returned by
14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onRetainNonConfigurationInstance()}.
14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Object getLastNonConfigurationInstance() {
1476b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return mLastNonConfigurationInstances != null
1477b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                ? mLastNonConfigurationInstances.activity : null;
14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called by the system, as part of destroying an
14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity due to a configuration change, when it is known that a new
14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * instance will immediately be created for the new configuration.  You
14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * can return any object you like here, including the activity instance
14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * itself, which can later be retrieved by calling
14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getLastNonConfigurationInstance()} in the new activity
14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * instance.
14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1489291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * <em>If you are targeting {@link android.os.Build.VERSION_CODES#HONEYCOMB}
1490291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * or later, consider instead using a {@link Fragment} with
1491291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * {@link Fragment#setRetainInstance(boolean)
1492291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * Fragment.setRetainInstance(boolean}.</em>
1493291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     *
14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This function is called purely as an optimization, and you must
14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not rely on it being called.  When it is called, a number of guarantees
14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will be made to help optimize configuration switching:
14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <ul>
14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li> The function will be called between {@link #onStop} and
14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onDestroy}.
15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li> A new instance of the activity will <em>always</em> be immediately
1501ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn     * created after this one's {@link #onDestroy()} is called.  In particular,
1502ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn     * <em>no</em> messages will be dispatched during this time (when the returned
1503ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn     * object does not have an activity to be associated with).
15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li> The object you return here will <em>always</em> be available from
15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the {@link #getLastNonConfigurationInstance()} method of the following
15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity instance as described there.
15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </ul>
15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>These guarantees are designed so that an activity can use this API
15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to propagate extensive state from the old to new activity instance, from
15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * loaded bitmaps, to network connections, to evenly actively running
15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * threads.  Note that you should <em>not</em> propagate any data that
15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * may change based on the configuration, including any data loaded from
15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * resources such as strings, layouts, or drawables.
15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1516ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn     * <p>The guarantee of no message handling during the switch to the next
1517ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn     * activity simplifies use with active objects.  For example if your retained
1518ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn     * state is an {@link android.os.AsyncTask} you are guaranteed that its
1519ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn     * call back functions (like {@link android.os.AsyncTask#onPostExecute}) will
1520ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn     * not be called from the call here until you execute the next instance's
1521ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn     * {@link #onCreate(Bundle)}.  (Note however that there is of course no such
1522ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn     * guarantee for {@link android.os.AsyncTask#doInBackground} since that is
1523ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn     * running in a separate thread.)
1524ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn     *
15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Return any Object holding the desired state to propagate to the
15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * next activity instance.
15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Object onRetainNonConfigurationInstance() {
15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the non-configuration instance data that was previously
15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returned by {@link #onRetainNonConfigurationChildInstances()}.  This will
15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be available from the initial {@link #onCreate} and
15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onStart} calls to the new instance, allowing you to extract
15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * any useful dynamic state from the previous instance.
15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note that the data you retrieve here should <em>only</em> be used
15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * as an optimization for handling configuration changes.  You should always
15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be able to handle getting a null pointer back, and an activity must
15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * still be able to restore itself to its previous state (through the
15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * normal {@link #onSaveInstanceState(Bundle)} mechanism) even if this
15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * function returns null.
15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the object previously returned by
15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onRetainNonConfigurationChildInstances()}
15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1549b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    HashMap<String, Object> getLastNonConfigurationChildInstances() {
1550b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return mLastNonConfigurationInstances != null
1551b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                ? mLastNonConfigurationInstances.children : null;
15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This method is similar to {@link #onRetainNonConfigurationInstance()} except that
15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * it should return either a mapping from  child activity id strings to arbitrary objects,
15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * or null.  This method is intended to be used by Activity framework subclasses that control a
15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * set of child activities, such as ActivityGroup.  The same guarantees and restrictions apply
15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * as for {@link #onRetainNonConfigurationInstance()}.  The default implementation returns null.
15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    HashMap<String,Object> onRetainNonConfigurationChildInstances() {
15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1565b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    NonConfigurationInstances retainNonConfigurationInstances() {
1566b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        Object activity = onRetainNonConfigurationInstance();
1567b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        HashMap<String, Object> children = onRetainNonConfigurationChildInstances();
1568b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        ArrayList<Fragment> fragments = mFragments.retainNonConfig();
15692707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn        boolean retainLoaders = false;
15702707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn        if (mAllLoaderManagers != null) {
15715e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn            // prune out any loader managers that were already stopped and so
15722707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn            // have nothing useful to retain.
15732707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn            for (int i=mAllLoaderManagers.size()-1; i>=0; i--) {
15744911b783aa9f4af5ac919db861751d350471f5efDianne Hackborn                LoaderManagerImpl lm = mAllLoaderManagers.valueAt(i);
15752707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn                if (lm.mRetaining) {
15762707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn                    retainLoaders = true;
15772707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn                } else {
15785e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn                    lm.doDestroy();
15792707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn                    mAllLoaderManagers.removeAt(i);
15802707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn                }
15812707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn            }
15822707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn        }
15832707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn        if (activity == null && children == null && fragments == null && !retainLoaders) {
1584b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            return null;
1585b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
1586b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
1587b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        NonConfigurationInstances nci = new NonConfigurationInstances();
1588b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        nci.activity = activity;
1589b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        nci.children = children;
1590b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        nci.fragments = fragments;
15912707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn        nci.loaders = mAllLoaderManagers;
1592b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return nci;
1593b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
1594b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onLowMemory() {
15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1600b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * Return the FragmentManager for interacting with fragments associated
1601b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * with this activity.
1602b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     */
1603b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    public FragmentManager getFragmentManager() {
1604b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        return mFragments;
1605b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    }
1606b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn
1607b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    /**
16082dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn     * Start a series of edit operations on the Fragments associated with
16092dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn     * this activity.
1610def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn     * @deprecated use {@link #getFragmentManager}.
16112dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn     */
1612def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn    @Deprecated
16132dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    public FragmentTransaction openFragmentTransaction() {
1614b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        return mFragments.openTransaction();
16152dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
16162dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
16179e14e9f33a66b864b98c6ff9517988bafbca3301Dianne Hackborn    void invalidateFragmentIndex(int index) {
16185e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn        //Log.v(TAG, "invalidateFragmentIndex: index=" + index);
16199e14e9f33a66b864b98c6ff9517988bafbca3301Dianne Hackborn        if (mAllLoaderManagers != null) {
16205e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn            LoaderManagerImpl lm = mAllLoaderManagers.get(index);
16215e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn            if (lm != null) {
16225e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn                lm.doDestroy();
16235e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn            }
16249e14e9f33a66b864b98c6ff9517988bafbca3301Dianne Hackborn            mAllLoaderManagers.remove(index);
16259e14e9f33a66b864b98c6ff9517988bafbca3301Dianne Hackborn        }
16269e14e9f33a66b864b98c6ff9517988bafbca3301Dianne Hackborn    }
16279e14e9f33a66b864b98c6ff9517988bafbca3301Dianne Hackborn
16282dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    /**
1629c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn     * Called when a Fragment is being attached to this activity, immediately
1630c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn     * after the call to its {@link Fragment#onAttach Fragment.onAttach()}
1631c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn     * method and before {@link Fragment#onCreate Fragment.onCreate()}.
1632c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn     */
1633c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn    public void onAttachFragment(Fragment fragment) {
1634c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn    }
1635c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn
1636c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn    /**
16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Wrapper around
16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link ContentResolver#query(android.net.Uri , String[], String, String[], String)}
16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that gives the resulting {@link Cursor} to call
16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #startManagingCursor} so that the activity will manage its
16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * lifecycle for you.
16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1643291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * <em>If you are targeting {@link android.os.Build.VERSION_CODES#HONEYCOMB}
1644291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * or later, consider instead using {@link LoaderManager} instead, available
1645291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * via {@link #getLoaderManager()}.</em>
1646291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     *
16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param uri The URI of the content provider to query.
16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param projection List of columns to return.
16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param selection SQL WHERE clause.
16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param sortOrder SQL ORDER BY clause.
16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The Cursor that was returned by query().
16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see ContentResolver#query(android.net.Uri , String[], String, String[], String)
16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startManagingCursor
16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
16576ed50de6d1e5e27d11304cce226fefeee3105bd7Jason parks     *
16586ed50de6d1e5e27d11304cce226fefeee3105bd7Jason parks     * @deprecated Use {@link CursorLoader} instead.
16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
16606ed50de6d1e5e27d11304cce226fefeee3105bd7Jason parks    @Deprecated
1661291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn    public final Cursor managedQuery(Uri uri, String[] projection, String selection,
1662291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn            String sortOrder) {
16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Cursor c = getContentResolver().query(uri, projection, selection, null, sortOrder);
16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (c != null) {
16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            startManagingCursor(c);
16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return c;
16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Wrapper around
16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link ContentResolver#query(android.net.Uri , String[], String, String[], String)}
16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that gives the resulting {@link Cursor} to call
16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #startManagingCursor} so that the activity will manage its
16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * lifecycle for you.
16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1677291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * <em>If you are targeting {@link android.os.Build.VERSION_CODES#HONEYCOMB}
1678291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * or later, consider instead using {@link LoaderManager} instead, available
1679291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * via {@link #getLoaderManager()}.</em>
1680291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     *
16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param uri The URI of the content provider to query.
16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param projection List of columns to return.
16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param selection SQL WHERE clause.
16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param selectionArgs The arguments to selection, if any ?s are pesent
16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param sortOrder SQL ORDER BY clause.
16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The Cursor that was returned by query().
16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see ContentResolver#query(android.net.Uri , String[], String, String[], String)
16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startManagingCursor
16916ed50de6d1e5e27d11304cce226fefeee3105bd7Jason parks     *
16926ed50de6d1e5e27d11304cce226fefeee3105bd7Jason parks     * @deprecated Use {@link CursorLoader} instead.
16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
16946ed50de6d1e5e27d11304cce226fefeee3105bd7Jason parks    @Deprecated
1695291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn    public final Cursor managedQuery(Uri uri, String[] projection, String selection,
1696291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn            String[] selectionArgs, String sortOrder) {
16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Cursor c = getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder);
16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (c != null) {
16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            startManagingCursor(c);
17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return c;
17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This method allows the activity to take care of managing the given
17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link Cursor}'s lifecycle for you based on the activity's lifecycle.
17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * That is, when the activity is stopped it will automatically call
17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link Cursor#deactivate} on the given Cursor, and when it is later restarted
17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * it will call {@link Cursor#requery} for you.  When the activity is
17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * destroyed, all managed Cursors will be closed automatically.
17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1712291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * <em>If you are targeting {@link android.os.Build.VERSION_CODES#HONEYCOMB}
1713291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * or later, consider instead using {@link LoaderManager} instead, available
1714291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * via {@link #getLoaderManager()}.</em>
1715291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     *
17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param c The Cursor to be managed.
17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #managedQuery(android.net.Uri , String[], String, String[], String)
17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #stopManagingCursor
17206ed50de6d1e5e27d11304cce226fefeee3105bd7Jason parks     *
17216ed50de6d1e5e27d11304cce226fefeee3105bd7Jason parks     * @deprecated Use {@link CursorLoader} instead.
17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
17236ed50de6d1e5e27d11304cce226fefeee3105bd7Jason parks    @Deprecated
17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startManagingCursor(Cursor c) {
17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mManagedCursors) {
17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mManagedCursors.add(new ManagedCursor(c));
17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Given a Cursor that was previously given to
17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #startManagingCursor}, stop the activity's management of that
17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * cursor.
17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param c The Cursor that was being managed.
17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startManagingCursor
17386ed50de6d1e5e27d11304cce226fefeee3105bd7Jason parks     *
17396ed50de6d1e5e27d11304cce226fefeee3105bd7Jason parks     * @deprecated Use {@link CursorLoader} instead.
17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
17416ed50de6d1e5e27d11304cce226fefeee3105bd7Jason parks    @Deprecated
17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void stopManagingCursor(Cursor c) {
17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mManagedCursors) {
17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = mManagedCursors.size();
17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=0; i<N; i++) {
17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ManagedCursor mc = mManagedCursors.get(i);
17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mc.mCursor == c) {
17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mManagedCursors.remove(i);
17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
17563c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn     * @deprecated As of {@link android.os.Build.VERSION_CODES#GINGERBREAD}
17573c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn     * this is a no-op.
17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1759d3efa3924407da6d38aa5931ac29aa088d9eb986Dianne Hackborn    @Deprecated
17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setPersistent(boolean isPersistent) {
17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Finds a view that was identified by the id attribute from the XML that
17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * was processed in {@link #onCreate}.
17669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The view if found or null otherwise.
17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public View findViewById(int id) {
17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getWindow().findViewById(id);
17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
177233b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell
177333b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell    /**
177433b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell     * Retrieve a reference to this activity's ActionBar.
177542c0fe86521af507f597af6159f63879cb5be73eAdam Powell     *
177633b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell     * @return The Activity's ActionBar, or null if it does not have one.
177733b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell     */
177833b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell    public ActionBar getActionBar() {
177942c0fe86521af507f597af6159f63879cb5be73eAdam Powell        initActionBar();
178033b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell        return mActionBar;
178133b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell    }
178233b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell
17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
178433b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell     * Creates a new ActionBar, locates the inflated ActionBarView,
178533b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell     * initializes the ActionBar with the view, and sets mActionBar.
178633b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell     */
178733b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell    private void initActionBar() {
178889e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell        Window window = getWindow();
17899b4c804b9856d732e461bc7505d40aa4ea1f7bf7Adam Powell        if (isChild() || !window.hasFeature(Window.FEATURE_ACTION_BAR) || mActionBar != null) {
179033b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell            return;
179133b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell        }
179233b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell
1793661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell        mActionBar = new ActionBarImpl(this);
179433b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell    }
179533b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell
179633b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell    /**
1797b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * Finds a fragment that was identified by the given id either when inflated
1798b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * from XML or as the container ID when added in a transaction.  This only
1799b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * returns fragments that are currently added to the activity's content.
1800b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * @return The fragment if found or null otherwise.
1801def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn     * @deprecated use {@link #getFragmentManager}.
1802b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     */
1803def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn    @Deprecated
1804b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public Fragment findFragmentById(int id) {
1805b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return mFragments.findFragmentById(id);
1806b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
1807b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
1808b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    /**
1809b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * Finds a fragment that was identified by the given tag either when inflated
1810b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * from XML or as supplied when added in a transaction.  This only
1811b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * returns fragments that are currently added to the activity's content.
1812b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * @return The fragment if found or null otherwise.
1813def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn     * @deprecated use {@link #getFragmentManager}.
1814b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     */
1815def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn    @Deprecated
1816b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public Fragment findFragmentByTag(String tag) {
1817b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return mFragments.findFragmentByTag(tag);
1818b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
1819b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
1820b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    /**
18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the activity content from a layout resource.  The resource will be
18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * inflated, adding all top-level views to the activity.
18239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param layoutResID Resource ID to be inflated.
18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setContentView(int layoutResID) {
18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setContentView(layoutResID);
182833b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell        initActionBar();
18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the activity content to an explicit view.  This view is placed
18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * directly into the activity's view hierarchy.  It can itself be a complex
18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * view hierarhcy.
18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param view The desired content to display.
18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setContentView(View view) {
18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setContentView(view);
184033b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell        initActionBar();
18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the activity content to an explicit view.  This view is placed
18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * directly into the activity's view hierarchy.  It can itself be a complex
18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * view hierarhcy.
18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param view The desired content to display.
18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param params Layout parameters for the view.
18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setContentView(View view, ViewGroup.LayoutParams params) {
18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setContentView(view, params);
185333b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell        initActionBar();
18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Add an additional content view to the activity.  Added after any existing
18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ones in the activity -- existing views are NOT removed.
18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param view The desired content to display.
18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param params Layout parameters for the view.
18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void addContentView(View view, ViewGroup.LayoutParams params) {
18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().addContentView(view, params);
186533b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell        initActionBar();
18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
18699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setDefaultKeyMode} to turn off default handling of
18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * keys.
18719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setDefaultKeyMode
18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
18749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public final int DEFAULT_KEYS_DISABLE = 0;
18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setDefaultKeyMode} to launch the dialer during default
18779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * key handling.
18789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setDefaultKeyMode
18809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public final int DEFAULT_KEYS_DIALER = 1;
18829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setDefaultKeyMode} to execute a menu shortcut in
18849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * default key handling.
18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>That is, the user does not need to hold down the menu key to execute menu shortcuts.
18879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setDefaultKeyMode
18899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
18909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public final int DEFAULT_KEYS_SHORTCUT = 2;
18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setDefaultKeyMode} to specify that unhandled keystrokes
18939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will start an application-defined search.  (If the application or activity does not
18949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * actually define a search, the the keys will be ignored.)
18959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>See {@link android.app.SearchManager android.app.SearchManager} for more details.
18979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setDefaultKeyMode
18999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
19009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public final int DEFAULT_KEYS_SEARCH_LOCAL = 3;
19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
19039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setDefaultKeyMode} to specify that unhandled keystrokes
19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will start a global search (typically web search, but some platforms may define alternate
19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * methods for global search)
19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>See {@link android.app.SearchManager android.app.SearchManager} for more details.
19089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setDefaultKeyMode
19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public final int DEFAULT_KEYS_SEARCH_GLOBAL = 4;
19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Select the default key handling for this activity.  This controls what
19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will happen to key events that are not otherwise handled.  The default
19169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * mode ({@link #DEFAULT_KEYS_DISABLE}) will simply drop them on the
19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * floor. Other modes allow you to launch the dialer
19189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ({@link #DEFAULT_KEYS_DIALER}), execute a shortcut in your options
19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * menu without requiring the menu key be held down
19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ({@link #DEFAULT_KEYS_SHORTCUT}), or launch a search ({@link #DEFAULT_KEYS_SEARCH_LOCAL}
19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and {@link #DEFAULT_KEYS_SEARCH_GLOBAL}).
19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note that the mode selected here does not impact the default
19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * handling of system keys, such as the "back" and "menu" keys, and your
19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity and its views always get a first chance to receive and handle
19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * all application keys.
19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
19289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param mode The desired default key mode constant.
19299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
19309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #DEFAULT_KEYS_DISABLE
19319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #DEFAULT_KEYS_DIALER
19329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #DEFAULT_KEYS_SHORTCUT
19339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #DEFAULT_KEYS_SEARCH_LOCAL
19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #DEFAULT_KEYS_SEARCH_GLOBAL
19359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onKeyDown
19369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
19379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setDefaultKeyMode(int mode) {
19389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDefaultKeyMode = mode;
19399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Some modes use a SpannableStringBuilder to track & dispatch input events
19419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // This list must remain in sync with the switch in onKeyDown()
19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (mode) {
19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case DEFAULT_KEYS_DISABLE:
19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case DEFAULT_KEYS_SHORTCUT:
19459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDefaultKeySsb = null;      // not used in these modes
19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
19479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case DEFAULT_KEYS_DIALER:
19489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case DEFAULT_KEYS_SEARCH_LOCAL:
19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case DEFAULT_KEYS_SEARCH_GLOBAL:
19509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDefaultKeySsb = new SpannableStringBuilder();
19519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Selection.setSelection(mDefaultKeySsb,0);
19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
19539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        default:
19549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException();
19559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when a key was pressed down and not handled by any of the views
19609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * inside of the activity. So, for example, key presses while the cursor
19619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is inside a TextView will not trigger the event (unless it is a navigation
19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to another object) because TextView handles its own key presses.
19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
19649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>If the focused view didn't want this event, this method is called.
19659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
19668d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn     * <p>The default implementation takes care of {@link KeyEvent#KEYCODE_BACK}
19678d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn     * by calling {@link #onBackPressed()}, though the behavior varies based
19688d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn     * on the application compatibility mode: for
19698d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn     * {@link android.os.Build.VERSION_CODES#ECLAIR} or later applications,
19708d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn     * it will set up the dispatch to call {@link #onKeyUp} where the action
19718d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn     * will be performed; for earlier applications, it will perform the
19728d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn     * action immediately in on-down, as those versions of the platform
19738d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn     * behaved.
19748d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn     *
19758d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn     * <p>Other additional default key handling may be performed
197683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * if configured with {@link #setDefaultKeyMode}.
19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
19789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Return <code>true</code> to prevent this event from being propagated
19799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * further, or <code>false</code> to indicate that you have not handled
19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this event and it should continue to be propagated.
19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onKeyUp
19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.view.KeyEvent
19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onKeyDown(int keyCode, KeyEvent event)  {
198583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        if (keyCode == KeyEvent.KEYCODE_BACK) {
19868d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn            if (getApplicationInfo().targetSdkVersion
19878d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                    >= Build.VERSION_CODES.ECLAIR) {
19888d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                event.startTracking();
19898d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn            } else {
19908d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                onBackPressed();
19918d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn            }
19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
19939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mDefaultKeyMode == DEFAULT_KEYS_DISABLE) {
19969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (mDefaultKeyMode == DEFAULT_KEYS_SHORTCUT) {
199883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            if (getWindow().performPanelShortcut(Window.FEATURE_OPTIONS_PANEL,
199983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                    keyCode, event, Menu.FLAG_ALWAYS_PERFORM_CLOSE)) {
200083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                return true;
200183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            }
200283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            return false;
20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
20049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Common code for DEFAULT_KEYS_DIALER & DEFAULT_KEYS_SEARCH_*
20059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean clearSpannable = false;
20069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean handled;
20079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((event.getRepeatCount() != 0) || event.isSystem()) {
20089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                clearSpannable = true;
20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                handled = false;
20109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
201183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                handled = TextKeyListener.getInstance().onKeyDown(
201283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                        null, mDefaultKeySsb, keyCode, event);
20139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (handled && mDefaultKeySsb.length() > 0) {
20149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // something useable has been typed - dispatch it now.
20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final String str = mDefaultKeySsb.toString();
20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    clearSpannable = true;
20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    switch (mDefaultKeyMode) {
20209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    case DEFAULT_KEYS_DIALER:
20219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Intent intent = new Intent(Intent.ACTION_DIAL,  Uri.parse("tel:" + str));
20229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        startActivity(intent);
20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    case DEFAULT_KEYS_SEARCH_LOCAL:
20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        startSearch(str, false, null, false);
20279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
20289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    case DEFAULT_KEYS_SEARCH_GLOBAL:
20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        startSearch(str, false, null, true);
20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (clearSpannable) {
20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mDefaultKeySsb.clear();
20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mDefaultKeySsb.clearSpans();
20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Selection.setSelection(mDefaultKeySsb,0);
20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return handled;
20409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
204483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * Default implementation of {@link KeyEvent.Callback#onKeyLongPress(int, KeyEvent)
204583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * KeyEvent.Callback.onKeyLongPress()}: always returns false (doesn't handle
204683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * the event).
204783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
204883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public boolean onKeyLongPress(int keyCode, KeyEvent event) {
204983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        return false;
205083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    }
205183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
205283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
20539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when a key was released and not handled by any of the views
20549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * inside of the activity. So, for example, key presses while the cursor
20559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is inside a TextView will not trigger the event (unless it is a navigation
20569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to another object) because TextView handles its own key presses.
20579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
205883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * <p>The default implementation handles KEYCODE_BACK to stop the activity
205983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * and go back.
206083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     *
20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Return <code>true</code> to prevent this event from being propagated
20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * further, or <code>false</code> to indicate that you have not handled
20639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this event and it should continue to be propagated.
20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onKeyDown
20659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see KeyEvent
20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onKeyUp(int keyCode, KeyEvent event) {
20688d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn        if (getApplicationInfo().targetSdkVersion
20698d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                >= Build.VERSION_CODES.ECLAIR) {
20708d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn            if (keyCode == KeyEvent.KEYCODE_BACK && event.isTracking()
20718d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                    && !event.isCanceled()) {
20728d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                onBackPressed();
20738d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                return true;
20748d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn            }
207583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        }
20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default implementation of {@link KeyEvent.Callback#onKeyMultiple(int, int, KeyEvent)
20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * KeyEvent.Callback.onKeyMultiple()}: always returns false (doesn't handle
20829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the event).
20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
20849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event) {
20859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2089dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * Flag for {@link #popBackStack(String, int)}
2090dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * and {@link #popBackStack(int, int)}: If set, and the name or ID of
2091b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn     * a back stack entry has been supplied, then all matching entries will
2092b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn     * be consumed until one that doesn't match is found or the bottom of
2093b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn     * the stack is reached.  Otherwise, all entries up to but not including that entry
2094b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn     * will be removed.
2095dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     */
2096005cb6de0727c0b03b92d32f153d8b81caeab8f0Jean-Baptiste Queru    public static final int POP_BACK_STACK_INCLUSIVE = 1<<0;
2097dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
2098dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    /**
2099dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * Pop the top state off the back stack.  Returns true if there was one
2100dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * to pop, else false.
2101def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn     * @deprecated use {@link #getFragmentManager}.
2102dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     */
2103def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn    @Deprecated
2104dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public boolean popBackStack() {
2105b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        return mFragments.popBackStack();
2106dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
2107dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
2108dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    /**
2109ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn     * Pop the last fragment transition from the local activity's fragment
2110ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn     * back stack.  If there is nothing to pop, false is returned.
2111f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn     * @param name If non-null, this is the name of a previous back state
2112dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * to look for; if found, all states up to that state will be popped.  The
2113dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * {@link #POP_BACK_STACK_INCLUSIVE} flag can be used to control whether
2114dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * the named state itself is popped. If null, only the top state is popped.
2115dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * @param flags Either 0 or {@link #POP_BACK_STACK_INCLUSIVE}.
2116def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn     * @deprecated use {@link #getFragmentManager}.
2117dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     */
2118def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn    @Deprecated
2119dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public boolean popBackStack(String name, int flags) {
2120b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        return mFragments.popBackStack(name, flags);
2121dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
2122dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
2123dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    /**
2124dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * Pop all back stack states up to the one with the given identifier.
2125dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * @param id Identifier of the stated to be popped. If no identifier exists,
2126dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * false is returned.
2127dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * The identifier is the number returned by
2128dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * {@link FragmentTransaction#commit() FragmentTransaction.commit()}.  The
2129dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * {@link #POP_BACK_STACK_INCLUSIVE} flag can be used to control whether
2130dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * the named state itself is popped.
2131dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn     * @param flags Either 0 or {@link #POP_BACK_STACK_INCLUSIVE}.
2132def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn     * @deprecated use {@link #getFragmentManager}.
2133ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn     */
2134def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn    @Deprecated
2135dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public boolean popBackStack(int id, int flags) {
2136b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        return mFragments.popBackStack(id, flags);
2137ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn    }
2138ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn
2139ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn    /**
214083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * Called when the activity has detected the user's press of the back
214183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * key.  The default implementation simply finishes the current activity,
214283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * but you can override this to do whatever you want.
214383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
214483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public void onBackPressed() {
2145def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn        if (!mFragments.popBackStack()) {
2146ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn            finish();
2147ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        }
214883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    }
214983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
215083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
21519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when a touch screen event was not handled by any of the views
21529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * under it.  This is most useful to process touch events that happen
21539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * outside of your window bounds, where there is no view to receive it.
21549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
21559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param event The touch screen event being processed.
21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Return true if you have consumed the event, false if you haven't.
21589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The default implementation always returns false.
21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onTouchEvent(MotionEvent event) {
21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
21629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
21659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when the trackball was moved and not handled by any of the
21669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * views inside of the activity.  So, for example, if the trackball moves
21679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * while focus is on a button, you will receive a call here because
21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * buttons do not normally do anything with trackball events.  The call
21699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * here happens <em>before</em> trackball movements are converted to
21709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * DPAD key events, which then get sent back to the view hierarchy, and
21719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will be processed at the point for things like focus navigation.
21729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
21739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param event The trackball event being processed.
21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Return true if you have consumed the event, false if you haven't.
21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The default implementation always returns false.
21779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onTrackballEvent(MotionEvent event) {
21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
21839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called whenever a key, touch, or trackball event is dispatched to the
21849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity.  Implement this method if you wish to know that the user has
21859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * interacted with the device in some way while your activity is running.
21869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This callback and {@link #onUserLeaveHint} are intended to help
21879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activities manage status bar notifications intelligently; specifically,
21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for helping activities determine the proper time to cancel a notfication.
21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
21909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>All calls to your activity's {@link #onUserLeaveHint} callback will
21919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be accompanied by calls to {@link #onUserInteraction}.  This
21929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ensures that your activity will be told of relevant user activity such
21939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * as pulling down the notification pane and touching an item there.
21949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
21959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note that this callback will be invoked for the touch down action
21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that begins a touch gesture, but may not be invoked for the touch-moved
21979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and touch-up actions that follow.
21989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
21999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onUserLeaveHint()
22009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
22019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onUserInteraction() {
22029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onWindowAttributesChanged(WindowManager.LayoutParams params) {
22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Update window manager if: we have a view, that view is
22069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // attached to its parent (which will be a RootView), and
22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this activity is not embedded.
22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent == null) {
22099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            View decor = mDecor;
22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (decor != null && decor.getParent() != null) {
22119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                getWindowManager().updateViewLayout(decor, params);
22129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onContentChanged() {
22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
22209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when the current {@link Window} of the activity gains or loses
22219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * focus.  This is the best indicator of whether this activity is visible
222283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * to the user.  The default implementation clears the key tracking
222383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * state, so should always be called.
22249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
222583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * <p>Note that this provides information about global focus state, which
22269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is managed independently of activity lifecycles.  As such, while focus
22279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * changes will generally have some relation to lifecycle changes (an
22289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity that is stopped will not generally get window focus), you
22299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * should not rely on any particular order between the callbacks here and
22309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * those in the other lifecycle methods such as {@link #onResume}.
22319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
22329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>As a general rule, however, a resumed activity will have window
22339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * focus...  unless it has displayed other dialogs or popups that take
22349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * input focus, in which case the activity itself will not have focus
22359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * when the other windows have it.  Likewise, the system may display
22369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * system-level windows (such as the status bar notification panel or
22379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a system alert) which will temporarily take window input focus without
22389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * pausing the foreground activity.
22399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
22409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param hasFocus Whether the window of this activity has focus.
22419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
22429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #hasWindowFocus()
22439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onResume
22443be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     * @see View#onWindowFocusChanged(boolean)
22459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
22469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onWindowFocusChanged(boolean hasFocus) {
22479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
22503be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     * Called when the main window associated with the activity has been
22513be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     * attached to the window manager.
22523be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     * See {@link View#onAttachedToWindow() View.onAttachedToWindow()}
22533be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     * for more information.
22543be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     * @see View#onAttachedToWindow
22553be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     */
22563be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn    public void onAttachedToWindow() {
22573be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn    }
22583be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn
22593be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn    /**
22603be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     * Called when the main window associated with the activity has been
22613be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     * detached from the window manager.
22623be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     * See {@link View#onDetachedFromWindow() View.onDetachedFromWindow()}
22633be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     * for more information.
22643be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     * @see View#onDetachedFromWindow
22653be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     */
22663be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn    public void onDetachedFromWindow() {
22673be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn    }
22683be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn
22693be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn    /**
22709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns true if this activity's <em>main</em> window currently has window focus.
22719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Note that this is not the same as the view itself having focus.
22729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
22739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if this activity's main window currently has window focus.
22749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
22759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onWindowAttributesChanged(android.view.WindowManager.LayoutParams)
22769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
22779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean hasWindowFocus() {
22789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Window w = getWindow();
22799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (w != null) {
22809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            View d = w.getDecorView();
22819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (d != null) {
22829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return d.hasWindowFocus();
22839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
22869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
22899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called to process key events.  You can override this to intercept all
22909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * key events before they are dispatched to the window.  Be sure to call
22919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this implementation for key events that should be handled normally.
22929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
22939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param event The key event.
22949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
22959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return boolean Return true if this event was consumed.
22969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
22979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean dispatchKeyEvent(KeyEvent event) {
22989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onUserInteraction();
22998d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn        Window win = getWindow();
23008d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn        if (win.superDispatchKeyEvent(event)) {
23019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
23029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23038d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn        View decor = mDecor;
23048d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn        if (decor == null) decor = win.getDecorView();
23058d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn        return event.dispatch(this, decor != null
23068d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                ? decor.getKeyDispatcherState() : null, this);
23079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
23109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called to process touch screen events.  You can override this to
23119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * intercept all touch screen events before they are dispatched to the
23129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * window.  Be sure to call this implementation for touch screen events
23139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that should be handled normally.
23149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param ev The touch screen event.
23169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return boolean Return true if this event was consumed.
23189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
23199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean dispatchTouchEvent(MotionEvent ev) {
23209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
23219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            onUserInteraction();
23229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (getWindow().superDispatchTouchEvent(ev)) {
23249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
23259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return onTouchEvent(ev);
23279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
23309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called to process trackball events.  You can override this to
23319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * intercept all trackball events before they are dispatched to the
23329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * window.  Be sure to call this implementation for trackball events
23339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that should be handled normally.
23349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param ev The trackball event.
23369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return boolean Return true if this event was consumed.
23389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
23399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean dispatchTrackballEvent(MotionEvent ev) {
23409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onUserInteraction();
23419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (getWindow().superDispatchTrackballEvent(ev)) {
23429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
23439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return onTrackballEvent(ev);
23459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
234675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
234775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
234875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        event.setClassName(getClass().getName());
234975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        event.setPackageName(getPackageName());
235075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
235175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        LayoutParams params = getWindow().getAttributes();
2352980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy        boolean isFullScreen = (params.width == LayoutParams.MATCH_PARENT) &&
2353980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy            (params.height == LayoutParams.MATCH_PARENT);
235475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        event.setFullScreen(isFullScreen);
235575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
235675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        CharSequence title = getTitle();
235775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        if (!TextUtils.isEmpty(title)) {
235875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov           event.getText().add(title);
235975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        }
236075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
236175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        return true;
236275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    }
236375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
23649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
23659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default implementation of
23669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window.Callback#onCreatePanelView}
23679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for activities. This
23689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * simply returns null so that all panel sub-windows will have the default
23699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * menu behavior.
23709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
23719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public View onCreatePanelView(int featureId) {
23729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
23739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
23769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default implementation of
23779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window.Callback#onCreatePanelMenu}
23789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for activities.  This calls through to the new
23799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onCreateOptionsMenu} method for the
23809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window#FEATURE_OPTIONS_PANEL} panel,
23819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * so that subclasses of Activity don't need to deal with feature codes.
23829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
23839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onCreatePanelMenu(int featureId, Menu menu) {
23849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (featureId == Window.FEATURE_OPTIONS_PANEL) {
2385b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn            boolean show = onCreateOptionsMenu(menu);
2386b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn            show |= mFragments.dispatchCreateOptionsMenu(menu, getMenuInflater());
2387b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn            return show;
23889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
23909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
23939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default implementation of
23949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window.Callback#onPreparePanel}
23959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for activities.  This
23969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * calls through to the new {@link #onPrepareOptionsMenu} method for the
23979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window#FEATURE_OPTIONS_PANEL}
23989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * panel, so that subclasses of
23999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Activity don't need to deal with feature codes.
24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
24019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onPreparePanel(int featureId, View view, Menu menu) {
24029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (featureId == Window.FEATURE_OPTIONS_PANEL && menu != null) {
24039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean goforit = onPrepareOptionsMenu(menu);
2404b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn            goforit |= mFragments.dispatchPrepareOptionsMenu(menu);
24059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return goforit && menu.hasVisibleItems();
24069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
24089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
24119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
24129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
24139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The default implementation returns true.
24149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
24159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onMenuOpened(int featureId, Menu menu) {
24169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
24179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
24209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default implementation of
24219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window.Callback#onMenuItemSelected}
24229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for activities.  This calls through to the new
24239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onOptionsItemSelected} method for the
24249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window#FEATURE_OPTIONS_PANEL}
24259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * panel, so that subclasses of
24269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Activity don't need to deal with feature codes.
24279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
24289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onMenuItemSelected(int featureId, MenuItem item) {
24299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (featureId) {
24309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case Window.FEATURE_OPTIONS_PANEL:
24319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Put event logging here so it gets called even if subclass
24329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // doesn't call through to superclass's implmeentation of each
24339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // of these methods below
24349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                EventLog.writeEvent(50000, 0, item.getTitleCondensed());
2435b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                if (onOptionsItemSelected(item)) {
2436b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                    return true;
2437b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                }
2438b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                return mFragments.dispatchOptionsItemSelected(item);
24399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case Window.FEATURE_CONTEXT_MENU:
24419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                EventLog.writeEvent(50000, 1, item.getTitleCondensed());
24425ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn                if (onContextItemSelected(item)) {
24435ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn                    return true;
24445ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn                }
24455ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn                return mFragments.dispatchContextItemSelected(item);
24469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default:
24489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
24499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
24539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default implementation of
24549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window.Callback#onPanelClosed(int, Menu)} for
24559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activities. This calls through to {@link #onOptionsMenuClosed(Menu)}
24569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * method for the {@link android.view.Window#FEATURE_OPTIONS_PANEL} panel,
24579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * so that subclasses of Activity don't need to deal with feature codes.
24589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * For context menus ({@link Window#FEATURE_CONTEXT_MENU}), the
24599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onContextMenuClosed(Menu)} will be called.
24609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
24619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onPanelClosed(int featureId, Menu menu) {
24629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (featureId) {
24639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case Window.FEATURE_OPTIONS_PANEL:
2464b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                mFragments.dispatchOptionsMenuClosed(menu);
24659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                onOptionsMenuClosed(menu);
24669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
24679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case Window.FEATURE_CONTEXT_MENU:
24699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                onContextMenuClosed(menu);
24709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
24719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2475b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     * Declare that the options menu has changed, so should be recreated.
2476b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     * The {@link #onCreateOptionsMenu(Menu)} method will be called the next
2477b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     * time it needs to be displayed.
2478b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     */
2479b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    public void invalidateOptionsMenu() {
2480b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn        mWindow.invalidatePanelMenu(Window.FEATURE_OPTIONS_PANEL);
2481b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    }
2482b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn
2483b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    /**
24849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Initialize the contents of the Activity's standard options menu.  You
24859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * should place your menu items in to <var>menu</var>.
24869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
24879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This is only called once, the first time the options menu is
24889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * displayed.  To update the menu every time it is displayed, see
24899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onPrepareOptionsMenu}.
24909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
24919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The default implementation populates the menu with standard system
24929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * menu items.  These are placed in the {@link Menu#CATEGORY_SYSTEM} group so that
24939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * they will be correctly ordered with application-defined menu items.
24949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Deriving classes should always call through to the base implementation.
24959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
24969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>You can safely hold on to <var>menu</var> (and any items created
24979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * from it), making modifications to it as desired, until the next
24989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * time onCreateOptionsMenu() is called.
24999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
25009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>When you add items to the menu, you can implement the Activity's
25019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onOptionsItemSelected} method to handle them there.
25029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
25039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param menu The options menu in which you place your items.
25049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
25059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return You must return true for the menu to be displayed;
25069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         if you return false it will not be shown.
25079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
25089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPrepareOptionsMenu
25099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onOptionsItemSelected
25109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
25119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onCreateOptionsMenu(Menu menu) {
25129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent != null) {
25139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mParent.onCreateOptionsMenu(menu);
25149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
25169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
25199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Prepare the Screen's standard options menu to be displayed.  This is
25209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * called right before the menu is shown, every time it is shown.  You can
25219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * use this method to efficiently enable/disable items or otherwise
25229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * dynamically modify the contents.
25239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
25249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The default implementation updates the system menu items based on the
25259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity's state.  Deriving classes should always call through to the
25269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * base class implementation.
25279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
25289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param menu The options menu as last shown or first initialized by
25299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             onCreateOptionsMenu().
25309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
25319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return You must return true for the menu to be displayed;
25329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         if you return false it will not be shown.
25339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
25349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onCreateOptionsMenu
25359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
25369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onPrepareOptionsMenu(Menu menu) {
25379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent != null) {
25389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mParent.onPrepareOptionsMenu(menu);
25399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
25419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
25449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This hook is called whenever an item in your options menu is selected.
25459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The default implementation simply returns false to have the normal
25469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * processing happen (calling the item's Runnable or sending a message to
25479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * its Handler as appropriate).  You can use this method for any items
25489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for which you would like to do processing without those other
25499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * facilities.
25509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
25519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Derived classes should call through to the base class for it to
25529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * perform the default menu handling.
25539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
25549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param item The menu item that was selected.
25559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
25569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return boolean Return false to allow normal menu processing to
25579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         proceed, true to consume it here.
25589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
25599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onCreateOptionsMenu
25609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
25619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onOptionsItemSelected(MenuItem item) {
25629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent != null) {
25639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mParent.onOptionsItemSelected(item);
25649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
25669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
25699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This hook is called whenever the options menu is being closed (either by the user canceling
25709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the menu with the back/menu button, or when an item is selected).
25719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
25729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param menu The options menu as last shown or first initialized by
25739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             onCreateOptionsMenu().
25749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
25759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onOptionsMenuClosed(Menu menu) {
25769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent != null) {
25779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParent.onOptionsMenuClosed(menu);
25789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
25829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Programmatically opens the options menu. If the options menu is already
25839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * open, this method does nothing.
25849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
25859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void openOptionsMenu() {
25869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindow.openPanel(Window.FEATURE_OPTIONS_PANEL, null);
25879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
25909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Progammatically closes the options menu. If the options menu is already
25919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * closed, this method does nothing.
25929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
25939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void closeOptionsMenu() {
25949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindow.closePanel(Window.FEATURE_OPTIONS_PANEL);
25959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
25989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when a context menu for the {@code view} is about to be shown.
25999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Unlike {@link #onCreateOptionsMenu(Menu)}, this will be called every
26009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * time the context menu is about to be shown and should be populated for
26019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the view (or item inside the view for {@link AdapterView} subclasses,
26029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this can be found in the {@code menuInfo})).
26039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
26049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use {@link #onContextItemSelected(android.view.MenuItem)} to know when an
26059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * item has been selected.
26069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
26079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * It is not safe to hold onto the context menu after this method returns.
26089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
26099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
26109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
26119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
26149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Registers a context menu to be shown for the given view (multiple views
26159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * can show the context menu). This method will set the
26169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link OnCreateContextMenuListener} on the view to this activity, so
26179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onCreateContextMenu(ContextMenu, View, ContextMenuInfo)} will be
26189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * called when it is time to show the context menu.
26199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #unregisterForContextMenu(View)
26219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param view The view that should show a context menu.
26229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
26239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void registerForContextMenu(View view) {
26249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        view.setOnCreateContextMenuListener(this);
26259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
26289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Prevents a context menu to be shown for the given view. This method will remove the
26299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link OnCreateContextMenuListener} on the view.
26309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #registerForContextMenu(View)
26329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param view The view that should stop showing a context menu.
26339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
26349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void unregisterForContextMenu(View view) {
26359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        view.setOnCreateContextMenuListener(null);
26369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
26399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Programmatically opens the context menu for a particular {@code view}.
26409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The {@code view} should have been added via
26419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #registerForContextMenu(View)}.
26429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param view The view to show the context menu for.
26449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
26459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void openContextMenu(View view) {
26469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        view.showContextMenu();
26479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
26509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Programmatically closes the most recently opened context menu, if showing.
26519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
26529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void closeContextMenu() {
26539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindow.closePanel(Window.FEATURE_CONTEXT_MENU);
26549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
26579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This hook is called whenever an item in a context menu is selected. The
26589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * default implementation simply returns false to have the normal processing
26599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * happen (calling the item's Runnable or sending a message to its Handler
26609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * as appropriate). You can use this method for any items for which you
26619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * would like to do processing without those other facilities.
26629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
26639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use {@link MenuItem#getMenuInfo()} to get extra information set by the
26649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * View that added this menu item.
26659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
26669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Derived classes should call through to the base class for it to perform
26679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the default menu handling.
26689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param item The context menu item that was selected.
26709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return boolean Return false to allow normal context menu processing to
26719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         proceed, true to consume it here.
26729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
26739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onContextItemSelected(MenuItem item) {
26749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent != null) {
26759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mParent.onContextItemSelected(item);
26769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
26789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
26819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This hook is called whenever the context menu is being closed (either by
26829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the user canceling the menu with the back/menu button, or when an item is
26839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * selected).
26849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param menu The context menu that is being closed.
26869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
26879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onContextMenuClosed(Menu menu) {
26889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent != null) {
26899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParent.onContextMenuClosed(menu);
26909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
26948ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @deprecated Old no-arguments version of {@link #onCreateDialog(int, Bundle)}.
26958ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     */
26968ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    @Deprecated
26978ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    protected Dialog onCreateDialog(int id) {
26988ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        return null;
26998ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    }
27008ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn
27018ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    /**
27029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Callback for creating dialogs that are managed (saved and restored) for you
27038ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * by the activity.  The default implementation calls through to
27048ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * {@link #onCreateDialog(int)} for compatibility.
27059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2706291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * <em>If you are targeting {@link android.os.Build.VERSION_CODES#HONEYCOMB}
2707291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * or later, consider instead using a {@link DialogFragment} instead.</em>
2708291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     *
27098ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * <p>If you use {@link #showDialog(int)}, the activity will call through to
27109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this method the first time, and hang onto it thereafter.  Any dialog
27119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that is created by this method will automatically be saved and restored
27129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for you, including whether it is showing.
27139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
27148ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * <p>If you would like the activity to manage saving and restoring dialogs
27159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for you, you should override this method and handle any ids that are
27169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * passed to {@link #showDialog}.
27179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
27188ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * <p>If you would like an opportunity to prepare your dialog before it is shown,
27198ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * override {@link #onPrepareDialog(int, Dialog, Bundle)}.
27209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
27219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param id The id of the dialog.
27228ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @param args The dialog arguments provided to {@link #showDialog(int, Bundle)}.
27238ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @return The dialog.  If you return null, the dialog will not be created.
27249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
27258ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @see #onPrepareDialog(int, Dialog, Bundle)
27268ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @see #showDialog(int, Bundle)
27279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #dismissDialog(int)
27289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #removeDialog(int)
27299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
27308ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    protected Dialog onCreateDialog(int id, Bundle args) {
27318ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        return onCreateDialog(id);
27328ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    }
27338ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn
27348ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    /**
27358ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @deprecated Old no-arguments version of
27368ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * {@link #onPrepareDialog(int, Dialog, Bundle)}.
27378ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     */
27388ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    @Deprecated
27398ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    protected void onPrepareDialog(int id, Dialog dialog) {
27408ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        dialog.setOwnerActivity(this);
27419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
27449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Provides an opportunity to prepare a managed dialog before it is being
27458ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * shown.  The default implementation calls through to
27468ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * {@link #onPrepareDialog(int, Dialog)} for compatibility.
27478ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     *
27489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
27499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Override this if you need to update a managed dialog based on the state
27509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of the application each time it is shown. For example, a time picker
27519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * dialog might want to be updated with the current time. You should call
27529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * through to the superclass's implementation. The default implementation
27539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will set this Activity as the owner activity on the Dialog.
27549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
27559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param id The id of the managed dialog.
27569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param dialog The dialog.
27578ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @param args The dialog arguments provided to {@link #showDialog(int, Bundle)}.
27588ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @see #onCreateDialog(int, Bundle)
27599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #showDialog(int)
27609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #dismissDialog(int)
27619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #removeDialog(int)
27629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
27638ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    protected void onPrepareDialog(int id, Dialog dialog, Bundle args) {
27648ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        onPrepareDialog(id, dialog);
27659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
27688ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * Simple version of {@link #showDialog(int, Bundle)} that does not
27698ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * take any arguments.  Simply calls {@link #showDialog(int, Bundle)}
27708ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * with null arguments.
27718ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     */
27728ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    public final void showDialog(int id) {
27738ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        showDialog(id, null);
27748ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    }
27758ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn
27768ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    /**
27778ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * Show a dialog managed by this activity.  A call to {@link #onCreateDialog(int, Bundle)}
27789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will be made with the same id the first time this is called for a given
27799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * id.  From thereafter, the dialog will be automatically saved and restored.
27809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2781291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * <em>If you are targeting {@link android.os.Build.VERSION_CODES#HONEYCOMB}
2782291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * or later, consider instead using a {@link DialogFragment} instead.</em>
2783291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     *
27848ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * <p>Each time a dialog is shown, {@link #onPrepareDialog(int, Dialog, Bundle)} will
27859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be made to provide an opportunity to do any timely preparation.
27869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
27879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param id The id of the managed dialog.
27888ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @param args Arguments to pass through to the dialog.  These will be saved
27898ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * and restored for you.  Note that if the dialog is already created,
27908ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * {@link #onCreateDialog(int, Bundle)} will not be called with the new
27918ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * arguments but {@link #onPrepareDialog(int, Dialog, Bundle)} will be.
2792d47c6ed4a9f2b5bd31f6c806b74701428efe458bDianne Hackborn     * If you need to rebuild the dialog, call {@link #removeDialog(int)} first.
27938ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @return Returns true if the Dialog was created; false is returned if
27948ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * it is not created because {@link #onCreateDialog(int, Bundle)} returns false.
27958ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     *
279637296dc4edae8d1383179e956dff2ecf806ac166Joe Onorato     * @see Dialog
27978ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @see #onCreateDialog(int, Bundle)
27988ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @see #onPrepareDialog(int, Dialog, Bundle)
27999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #dismissDialog(int)
28009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #removeDialog(int)
28019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
28028ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    public final boolean showDialog(int id, Bundle args) {
28039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mManagedDialogs == null) {
28048ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            mManagedDialogs = new SparseArray<ManagedDialog>();
28059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28068ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        ManagedDialog md = mManagedDialogs.get(id);
28078ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        if (md == null) {
28088ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            md = new ManagedDialog();
28098ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            md.mDialog = createDialog(id, null, args);
28108ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            if (md.mDialog == null) {
28118ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                return false;
28128ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            }
28138ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            mManagedDialogs.put(id, md);
28149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28168ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        md.mArgs = args;
28178ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        onPrepareDialog(id, md.mDialog, args);
28188ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        md.mDialog.show();
28198ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        return true;
28209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
28239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Dismiss a dialog that was previously shown via {@link #showDialog(int)}.
28249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param id The id of the managed dialog.
28269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalArgumentException if the id was not previously shown via
28289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *   {@link #showDialog(int)}.
28299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28308ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @see #onCreateDialog(int, Bundle)
28318ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @see #onPrepareDialog(int, Dialog, Bundle)
28329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #showDialog(int)
28339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #removeDialog(int)
28349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
28359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void dismissDialog(int id) {
28369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mManagedDialogs == null) {
28379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw missingDialog(id);
28389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28398ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn
28408ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        final ManagedDialog md = mManagedDialogs.get(id);
28418ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        if (md == null) {
28429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw missingDialog(id);
28439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28448ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        md.mDialog.dismiss();
28459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
28489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Creates an exception to throw if a user passed in a dialog id that is
28499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * unexpected.
28509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
28519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IllegalArgumentException missingDialog(int id) {
28529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new IllegalArgumentException("no dialog with id " + id + " was ever "
28539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + "shown via Activity#showDialog");
28549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
28579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Removes any internal references to a dialog managed by this Activity.
28589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If the dialog is showing, it will dismiss it as part of the clean up.
28599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28608ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * <p>This can be useful if you know that you will never show a dialog again and
28619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * want to avoid the overhead of saving and restoring it in the future.
28629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2863d2ce8bbb84607b1f456b9af00d8d7b84a4610a79Dianne Hackborn     * <p>As of {@link android.os.Build.VERSION_CODES#GINGERBREAD}, this function
2864d2ce8bbb84607b1f456b9af00d8d7b84a4610a79Dianne Hackborn     * will not throw an exception if you try to remove an ID that does not
2865d2ce8bbb84607b1f456b9af00d8d7b84a4610a79Dianne Hackborn     * currently have an associated dialog.</p>
2866d2ce8bbb84607b1f456b9af00d8d7b84a4610a79Dianne Hackborn     *
28679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param id The id of the managed dialog.
28689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28698ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @see #onCreateDialog(int, Bundle)
28708ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @see #onPrepareDialog(int, Dialog, Bundle)
28719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #showDialog(int)
28729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #dismissDialog(int)
28739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
28749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void removeDialog(int id) {
2875d2ce8bbb84607b1f456b9af00d8d7b84a4610a79Dianne Hackborn        if (mManagedDialogs != null) {
2876d2ce8bbb84607b1f456b9af00d8d7b84a4610a79Dianne Hackborn            final ManagedDialog md = mManagedDialogs.get(id);
2877d2ce8bbb84607b1f456b9af00d8d7b84a4610a79Dianne Hackborn            if (md != null) {
2878d2ce8bbb84607b1f456b9af00d8d7b84a4610a79Dianne Hackborn                md.mDialog.dismiss();
2879d2ce8bbb84607b1f456b9af00d8d7b84a4610a79Dianne Hackborn                mManagedDialogs.remove(id);
2880d2ce8bbb84607b1f456b9af00d8d7b84a4610a79Dianne Hackborn            }
28819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
28859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This hook is called when the user signals the desire to start a search.
28869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28876266e40a754d82afa717ef068898c8418a0bb5c3Bjorn Bringert     * <p>You can use this function as a simple way to launch the search UI, in response to a
28886266e40a754d82afa717ef068898c8418a0bb5c3Bjorn Bringert     * menu item, search button, or other widgets within your activity. Unless overidden,
28896266e40a754d82afa717ef068898c8418a0bb5c3Bjorn Bringert     * calling this function is the same as calling
28906266e40a754d82afa717ef068898c8418a0bb5c3Bjorn Bringert     * {@link #startSearch startSearch(null, false, null, false)}, which launches
28916266e40a754d82afa717ef068898c8418a0bb5c3Bjorn Bringert     * search for the current activity as specified in its manifest, see {@link SearchManager}.
28929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>You can override this function to force global search, e.g. in response to a dedicated
28949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * search key, or to block search entirely (by simply returning false).
28959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28966266e40a754d82afa717ef068898c8418a0bb5c3Bjorn Bringert     * @return Returns {@code true} if search launched, and {@code false} if activity blocks it.
28976266e40a754d82afa717ef068898c8418a0bb5c3Bjorn Bringert     *         The default implementation always returns {@code true}.
28989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.app.SearchManager
29009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
29019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onSearchRequested() {
29029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        startSearch(null, false, null, false);
29039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
29049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
29079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This hook is called to launch the search UI.
29089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
29099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>It is typically called from onSearchRequested(), either directly from
29109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Activity.onSearchRequested() or from an overridden version in any given
29119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Activity.  If your goal is simply to activate search, it is preferred to call
29129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * onSearchRequested(), which may have been overriden elsewhere in your Activity.  If your goal
29139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is to inject specific data such as context data, it is preferred to <i>override</i>
29149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * onSearchRequested(), so that any callers to it will benefit from the override.
29159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
29169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param initialQuery Any non-null non-empty string will be inserted as
29179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * pre-entered text in the search query box.
29189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param selectInitialQuery If true, the intial query will be preselected, which means that
29199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * any further typing will replace it.  This is useful for cases where an entire pre-formed
29209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * query is being inserted.  If false, the selection point will be placed at the end of the
29219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * inserted query.  This is useful when the inserted query is text that the user entered,
29229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and the user would expect to be able to keep typing.  <i>This parameter is only meaningful
29239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if initialQuery is a non-empty string.</i>
29249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param appSearchData An application can insert application-specific
29259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * context here, in order to improve quality or specificity of its own
29269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * searches.  This data will be returned with SEARCH intent(s).  Null if
29279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * no extra data is required.
29289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param globalSearch If false, this will only launch the search that has been specifically
29299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * defined by the application (which is usually defined as a local search).  If no default
2930cfa419b754332e12f8cd45244c2f3bee9d6a74bbMike LeBeau     * search is defined in the current application or activity, global search will be launched.
29319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If true, this will always launch a platform-global (e.g. web-based) search instead.
29329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
29339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.app.SearchManager
29349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onSearchRequested
29359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
29369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startSearch(String initialQuery, boolean selectInitialQuery,
29379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Bundle appSearchData, boolean globalSearch) {
2938b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn        ensureSearchManager();
29398d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert        mSearchManager.startSearch(initialQuery, selectInitialQuery, getComponentName(),
29409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        appSearchData, globalSearch);
29419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2944d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     * Similar to {@link #startSearch}, but actually fires off the search query after invoking
2945d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     * the search dialog.  Made available for testing purposes.
2946d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     *
2947d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     * @param query The query to trigger.  If empty, the request will be ignored.
2948d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     * @param appSearchData An application can insert application-specific
2949d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     * context here, in order to improve quality or specificity of its own
2950d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     * searches.  This data will be returned with SEARCH intent(s).  Null if
2951d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     * no extra data is required.
2952d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     */
2953b782a2f4f0a3072f2677f6f10fb255c77468ae66Bjorn Bringert    public void triggerSearch(String query, Bundle appSearchData) {
2954d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen        ensureSearchManager();
2955b782a2f4f0a3072f2677f6f10fb255c77468ae66Bjorn Bringert        mSearchManager.triggerSearch(query, getComponentName(), appSearchData);
2956d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen    }
2957d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen
2958d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen    /**
29599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Request that key events come to this activity. Use this if your
29609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity has no views with focus, but the activity still wants
29619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a chance to process key events.
29629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
29639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.view.Window#takeKeyEvents
29649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
29659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void takeKeyEvents(boolean get) {
29669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().takeKeyEvents(get);
29679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
29709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Enable extended window features.  This is a convenience for calling
29719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window#requestFeature getWindow().requestFeature()}.
29729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
29739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param featureId The desired feature as defined in
29749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                  {@link android.view.Window}.
29759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns true if the requested feature is supported and now
29769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         enabled.
29779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
29789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.view.Window#requestFeature
29799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
29809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean requestWindowFeature(int featureId) {
29819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getWindow().requestFeature(featureId);
29829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
29859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Convenience for calling
29869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window#setFeatureDrawableResource}.
29879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
29889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setFeatureDrawableResource(int featureId, int resId) {
29899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setFeatureDrawableResource(featureId, resId);
29909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
29939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Convenience for calling
29949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window#setFeatureDrawableUri}.
29959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
29969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setFeatureDrawableUri(int featureId, Uri uri) {
29979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setFeatureDrawableUri(featureId, uri);
29989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
30019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Convenience for calling
30029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window#setFeatureDrawable(int, Drawable)}.
30039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
30049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setFeatureDrawable(int featureId, Drawable drawable) {
30059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setFeatureDrawable(featureId, drawable);
30069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
30099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Convenience for calling
30109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window#setFeatureDrawableAlpha}.
30119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
30129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setFeatureDrawableAlpha(int featureId, int alpha) {
30139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setFeatureDrawableAlpha(featureId, alpha);
30149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
30179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Convenience for calling
30189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window#getLayoutInflater}.
30199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
30209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public LayoutInflater getLayoutInflater() {
30219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getWindow().getLayoutInflater();
30229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
30259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns a {@link MenuInflater} with this context.
30269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
30279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public MenuInflater getMenuInflater() {
30289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new MenuInflater(this);
30299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3032bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn    protected void onApplyThemeResource(Resources.Theme theme, int resid,
3033bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            boolean first) {
30349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent == null) {
30359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super.onApplyThemeResource(theme, resid, first);
30369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
30379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
30389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                theme.setTo(mParent.getTheme());
30399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (Exception e) {
30409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Empty
30419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
30429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            theme.applyStyle(resid, false);
30439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
30479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Launch an activity for which you would like a result when it finished.
30489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * When this activity exits, your
30499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * onActivityResult() method will be called with the given requestCode.
30509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Using a negative requestCode is the same as calling
30519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #startActivity} (the activity is not launched as a sub-activity).
30529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
30539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note that this method should only be used with Intent protocols
30549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that are defined to return a result.  In other protocols (such as
30559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link Intent#ACTION_MAIN} or {@link Intent#ACTION_VIEW}), you may
30569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not get the result when you expect.  For example, if the activity you
30579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * are launching uses the singleTask launch mode, it will not run in your
30589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * task and thus you will immediately receive a cancel result.
30599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
30609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>As a special case, if you call startActivityForResult() with a requestCode
30619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * >= 0 during the initial onCreate(Bundle savedInstanceState)/onResume() of your
30629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity, then your window will not be displayed until a result is
30639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returned back from the started activity.  This is to avoid visible
30649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * flickering when redirecting to another activity.
30659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
30669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This method throws {@link android.content.ActivityNotFoundException}
30679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if there was no Activity found to run the given Intent.
30689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
30699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param intent The intent to start.
30709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param requestCode If >= 0, this code will be returned in
30719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                    onActivityResult() when the activity exits.
30729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
30739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws android.content.ActivityNotFoundException
30749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
30759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startActivity
30769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
30779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startActivityForResult(Intent intent, int requestCode) {
30789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent == null) {
30799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Instrumentation.ActivityResult ar =
30809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mInstrumentation.execStartActivity(
30819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    this, mMainThread.getApplicationThread(), mToken, this,
30829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    intent, requestCode);
30839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ar != null) {
30849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.sendActivityResult(
30859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mToken, mEmbeddedID, requestCode, ar.getResultCode(),
30869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ar.getResultData());
30879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
30889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (requestCode >= 0) {
30899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If this start is requesting a result, we can avoid making
30909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // the activity visible until the result is received.  Setting
30919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // this code during onCreate(Bundle savedInstanceState) or onResume() will keep the
30929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // activity hidden during this time, to avoid flickering.
30939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // This can only be done when a result is requested because
30949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // that guarantees we will get information back when the
30959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // activity is finished, no matter what happens to it.
30969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mStartedActivity = true;
30979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
30989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
30999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParent.startActivityFromChild(this, intent, requestCode);
31009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3104bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * Like {@link #startActivityForResult(Intent, int)}, but allowing you
3105fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * to use a IntentSender to describe the activity to be started.  If
3106fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * the IntentSender is for an activity, that activity will be started
3107fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * as if you had called the regular {@link #startActivityForResult(Intent, int)}
3108fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * here; otherwise, its associated action will be executed (such as
3109fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * sending a broadcast) as if you had called
3110fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * {@link IntentSender#sendIntent IntentSender.sendIntent} on it.
3111fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     *
3112fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * @param intent The IntentSender to launch.
3113bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * @param requestCode If >= 0, this code will be returned in
3114bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     *                    onActivityResult() when the activity exits.
3115bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * @param fillInIntent If non-null, this will be provided as the
3116fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * intent parameter to {@link IntentSender#sendIntent}.
3117fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * @param flagsMask Intent flags in the original IntentSender that you
3118bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * would like to change.
3119bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * @param flagsValues Desired values for any bits set in
3120bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * <var>flagsMask</var>
3121fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * @param extraFlags Always set to 0.
3122bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     */
3123fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn    public void startIntentSenderForResult(IntentSender intent, int requestCode,
3124fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)
3125fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            throws IntentSender.SendIntentException {
3126bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn        if (mParent == null) {
3127fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            startIntentSenderForResultInner(intent, requestCode, fillInIntent,
3128bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                    flagsMask, flagsValues, this);
3129bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn        } else {
3130fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            mParent.startIntentSenderFromChild(this, intent, requestCode,
3131fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                    fillInIntent, flagsMask, flagsValues, extraFlags);
3132bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn        }
3133bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn    }
3134bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn
3135fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn    private void startIntentSenderForResultInner(IntentSender intent, int requestCode,
3136bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            Intent fillInIntent, int flagsMask, int flagsValues, Activity activity)
3137fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            throws IntentSender.SendIntentException {
3138bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn        try {
3139bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            String resolvedType = null;
3140bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            if (fillInIntent != null) {
3141bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                resolvedType = fillInIntent.resolveTypeIfNeeded(getContentResolver());
3142bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            }
3143bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            int result = ActivityManagerNative.getDefault()
3144fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                .startActivityIntentSender(mMainThread.getApplicationThread(), intent,
3145bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        fillInIntent, resolvedType, mToken, activity.mEmbeddedID,
3146bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        requestCode, flagsMask, flagsValues);
3147bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            if (result == IActivityManager.START_CANCELED) {
3148fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                throw new IntentSender.SendIntentException();
3149bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            }
3150bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            Instrumentation.checkStartActivityResult(result, null);
3151bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn        } catch (RemoteException e) {
3152bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn        }
3153bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn        if (requestCode >= 0) {
3154bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            // If this start is requesting a result, we can avoid making
3155bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            // the activity visible until the result is received.  Setting
3156bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            // this code during onCreate(Bundle savedInstanceState) or onResume() will keep the
3157bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            // activity hidden during this time, to avoid flickering.
3158bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            // This can only be done when a result is requested because
3159bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            // that guarantees we will get information back when the
3160bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            // activity is finished, no matter what happens to it.
3161bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            mStartedActivity = true;
3162bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn        }
3163bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn    }
3164bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn
3165bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn    /**
31669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Launch a new activity.  You will not receive any information about when
31679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the activity exits.  This implementation overrides the base version,
31689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * providing information about
31699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the activity performing the launch.  Because of this additional
31709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * information, the {@link Intent#FLAG_ACTIVITY_NEW_TASK} launch flag is not
31719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * required; if not specified, the new activity will be added to the
31729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * task of the caller.
31739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
31749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This method throws {@link android.content.ActivityNotFoundException}
31759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if there was no Activity found to run the given Intent.
31769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
31779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param intent The intent to start.
31789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
31799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws android.content.ActivityNotFoundException
31809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
31819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startActivityForResult
31829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
31839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
31849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startActivity(Intent intent) {
31859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        startActivityForResult(intent, -1);
31869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3189fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * Like {@link #startActivity(Intent)}, but taking a IntentSender
3190bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * to start; see
3191ae22c05b91d1e7a458066792eb5cfc0974c1be9eDianne Hackborn     * {@link #startIntentSenderForResult(IntentSender, int, Intent, int, int, int)}
3192bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * for more information.
3193bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     *
3194fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * @param intent The IntentSender to launch.
3195bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * @param fillInIntent If non-null, this will be provided as the
3196fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * intent parameter to {@link IntentSender#sendIntent}.
3197fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * @param flagsMask Intent flags in the original IntentSender that you
3198bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * would like to change.
3199bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * @param flagsValues Desired values for any bits set in
3200bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * <var>flagsMask</var>
3201fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * @param extraFlags Always set to 0.
3202bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     */
3203fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn    public void startIntentSender(IntentSender intent,
3204fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)
3205fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            throws IntentSender.SendIntentException {
3206fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn        startIntentSenderForResult(intent, -1, fillInIntent, flagsMask,
3207fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                flagsValues, extraFlags);
3208bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn    }
3209bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn
3210bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn    /**
32119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A special variation to launch an activity only if a new activity
32129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * instance is needed to handle the given Intent.  In other words, this is
32139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * just like {@link #startActivityForResult(Intent, int)} except: if you are
32149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * using the {@link Intent#FLAG_ACTIVITY_SINGLE_TOP} flag, or
32159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * singleTask or singleTop
32169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.R.styleable#AndroidManifestActivity_launchMode launchMode},
32179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and the activity
32189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that handles <var>intent</var> is the same as your currently running
32199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity, then a new instance is not needed.  In this case, instead of
32209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the normal behavior of calling {@link #onNewIntent} this function will
32219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * return and you can handle the Intent yourself.
32229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
32239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This function can only be called from a top-level activity; if it is
32249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * called from a child activity, a runtime exception will be thrown.
32259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
32269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param intent The intent to start.
32279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param requestCode If >= 0, this code will be returned in
32289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         onActivityResult() when the activity exits, as described in
32299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         {@link #startActivityForResult}.
32309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
32319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return If a new activity was launched then true is returned; otherwise
32329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         false is returned and you must handle the Intent yourself.
32339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
32349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startActivity
32359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startActivityForResult
32369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
32379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean startActivityIfNeeded(Intent intent, int requestCode) {
32389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent == null) {
32399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int result = IActivityManager.START_RETURN_INTENT_TO_CALLER;
32409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
32419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                result = ActivityManagerNative.getDefault()
32429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    .startActivity(mMainThread.getApplicationThread(),
32439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            intent, intent.resolveTypeIfNeeded(
32449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    getContentResolver()),
32459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            null, 0,
32469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mToken, mEmbeddedID, requestCode, true, false);
32479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
32489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Empty
32499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
32509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Instrumentation.checkStartActivityResult(result, intent);
32529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (requestCode >= 0) {
32549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If this start is requesting a result, we can avoid making
32559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // the activity visible until the result is received.  Setting
32569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // this code during onCreate(Bundle savedInstanceState) or onResume() will keep the
32579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // activity hidden during this time, to avoid flickering.
32589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // This can only be done when a result is requested because
32599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // that guarantees we will get information back when the
32609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // activity is finished, no matter what happens to it.
32619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mStartedActivity = true;
32629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
32639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return result != IActivityManager.START_RETURN_INTENT_TO_CALLER;
32649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new UnsupportedOperationException(
32679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "startActivityIfNeeded can only be called from a top-level activity");
32689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
32719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Special version of starting an activity, for use when you are replacing
32729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * other activity components.  You can use this to hand the Intent off
32739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to the next Activity that can handle it.  You typically call this in
32749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onCreate} with the Intent returned by {@link #getIntent}.
32759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
32769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param intent The intent to dispatch to the next activity.  For
32779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * correct behavior, this must be the same as the Intent that started
32789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * your own activity; the only changes you can make are to the extras
32799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * inside of it.
32809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
32819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns a boolean indicating whether there was another Activity
32829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to start: true if there was a next activity to start, false if there
32839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * wasn't.  In general, if true is returned you will then want to call
32849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * finish() on yourself.
32859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
32869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean startNextMatchingActivity(Intent intent) {
32879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent == null) {
32889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
32899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return ActivityManagerNative.getDefault()
32909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    .startNextMatchingActivity(mToken, intent);
32919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
32929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Empty
32939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
32949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
32959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new UnsupportedOperationException(
32989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "startNextMatchingActivity can only be called from a top-level activity");
32999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
33009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
33029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is called when a child activity of this one calls its
33039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #startActivity} or {@link #startActivityForResult} method.
33049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
33059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This method throws {@link android.content.ActivityNotFoundException}
33069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if there was no Activity found to run the given Intent.
33079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
33089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param child The activity making the call.
33099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param intent The intent to start.
33109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param requestCode Reply request code.  < 0 if reply is not requested.
33119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
33129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws android.content.ActivityNotFoundException
33139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
33149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startActivity
33159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startActivityForResult
33169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
33179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startActivityFromChild(Activity child, Intent intent,
33189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int requestCode) {
33199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Instrumentation.ActivityResult ar =
33209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mInstrumentation.execStartActivity(
33219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                this, mMainThread.getApplicationThread(), mToken, child,
33229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                intent, requestCode);
33239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ar != null) {
33249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mMainThread.sendActivityResult(
33259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mToken, child.mEmbeddedID, requestCode,
33269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ar.getResultCode(), ar.getResultData());
33279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
33289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
33299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
33316e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * This is called when a Fragment in this activity calls its
33326e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * {@link Fragment#startActivity} or {@link Fragment#startActivityForResult}
33336e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * method.
33346e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     *
33356e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * <p>This method throws {@link android.content.ActivityNotFoundException}
33366e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * if there was no Activity found to run the given Intent.
33376e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     *
33386e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * @param fragment The fragment making the call.
33396e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * @param intent The intent to start.
33406e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * @param requestCode Reply request code.  < 0 if reply is not requested.
33416e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     *
33426e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * @throws android.content.ActivityNotFoundException
33436e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     *
33446e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * @see Fragment#startActivity
33456e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * @see Fragment#startActivityForResult
33466e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     */
33476e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    public void startActivityFromFragment(Fragment fragment, Intent intent,
33486e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            int requestCode) {
33496e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        Instrumentation.ActivityResult ar =
33506e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            mInstrumentation.execStartActivity(
33516e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                this, mMainThread.getApplicationThread(), mToken, fragment,
33526e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                intent, requestCode);
33536e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (ar != null) {
33546e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            mMainThread.sendActivityResult(
33556e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                mToken, fragment.mWho, requestCode,
33566e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                ar.getResultCode(), ar.getResultData());
33576e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        }
33586e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    }
33596e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn
33606e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    /**
3361bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * Like {@link #startActivityFromChild(Activity, Intent, int)}, but
3362fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * taking a IntentSender; see
3363ae22c05b91d1e7a458066792eb5cfc0974c1be9eDianne Hackborn     * {@link #startIntentSenderForResult(IntentSender, int, Intent, int, int, int)}
3364bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * for more information.
3365bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     */
3366fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn    public void startIntentSenderFromChild(Activity child, IntentSender intent,
3367fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            int requestCode, Intent fillInIntent, int flagsMask, int flagsValues,
3368fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            int extraFlags)
3369fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            throws IntentSender.SendIntentException {
3370fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn        startIntentSenderForResultInner(intent, requestCode, fillInIntent,
3371bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                flagsMask, flagsValues, child);
3372bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn    }
3373bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn
3374bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn    /**
33753b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn     * Call immediately after one of the flavors of {@link #startActivity(Intent)}
33763b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn     * or {@link #finish} to specify an explicit transition animation to
33773b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn     * perform next.
33783b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn     * @param enterAnim A resource ID of the animation resource to use for
33798b571a817cc953ce96750f440645f104c7f55157Dianne Hackborn     * the incoming activity.  Use 0 for no animation.
33803b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn     * @param exitAnim A resource ID of the animation resource to use for
33818b571a817cc953ce96750f440645f104c7f55157Dianne Hackborn     * the outgoing activity.  Use 0 for no animation.
33823b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn     */
33833b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn    public void overridePendingTransition(int enterAnim, int exitAnim) {
33843b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        try {
33853b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            ActivityManagerNative.getDefault().overridePendingTransition(
33863b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    mToken, getPackageName(), enterAnim, exitAnim);
33873b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        } catch (RemoteException e) {
33883b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        }
33893b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn    }
33903b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn
33913b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn    /**
33929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Call this to set the result that your activity will return to its
33939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * caller.
33949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
33959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param resultCode The result code to propagate back to the originating
33969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                   activity, often RESULT_CANCELED or RESULT_OK
33979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
33989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #RESULT_CANCELED
33999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #RESULT_OK
34009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #RESULT_FIRST_USER
34019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setResult(int, Intent)
34029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
34039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setResult(int resultCode) {
34049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (this) {
34059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mResultCode = resultCode;
34069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mResultData = null;
34079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
34099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
34119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Call this to set the result that your activity will return to its
34129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * caller.
34139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
34149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param resultCode The result code to propagate back to the originating
34159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                   activity, often RESULT_CANCELED or RESULT_OK
34169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param data The data to propagate back to the originating activity.
34179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
34189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #RESULT_CANCELED
34199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #RESULT_OK
34209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #RESULT_FIRST_USER
34219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setResult(int)
34229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
34239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setResult(int resultCode, Intent data) {
34249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (this) {
34259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mResultCode = resultCode;
34269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mResultData = data;
34279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
34299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
34319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the name of the package that invoked this activity.  This is who
34329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the data in {@link #setResult setResult()} will be sent to.  You can
34339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * use this information to validate that the recipient is allowed to
34349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * receive the data.
34359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
34369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note: if the calling activity is not expecting a result (that is it
34379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * did not use the {@link #startActivityForResult}
34389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * form that includes a request code), then the calling package will be
34399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * null.
34409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
34419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The package of the activity that will receive your
34429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         reply, or null if none.
34439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
34449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getCallingPackage() {
34459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
34469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().getCallingPackage(mToken);
34479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
34489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
34499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
34519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
34539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the name of the activity that invoked this activity.  This is
34549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * who the data in {@link #setResult setResult()} will be sent to.  You
34559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * can use this information to validate that the recipient is allowed to
34569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * receive the data.
34579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
34589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note: if the calling activity is not expecting a result (that is it
34599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * did not use the {@link #startActivityForResult}
34609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * form that includes a request code), then the calling package will be
34619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * null.
34629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
34639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return String The full name of the activity that will receive your
34649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         reply, or null if none.
34659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
34669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ComponentName getCallingActivity() {
34679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
34689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().getCallingActivity(mToken);
34699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
34709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
34719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
34739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
34759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Control whether this activity's main window is visible.  This is intended
34769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * only for the special case of an activity that is not going to show a
34779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * UI itself, but can't just finish prior to onResume() because it needs
34789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to wait for a service binding or such.  Setting this to false allows
34799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * you to prevent your UI from being shown during that time.
34809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
34819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The default value for this is taken from the
34829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.R.attr#windowNoDisplay} attribute of the activity's theme.
34839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
34849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setVisible(boolean visible) {
34859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mVisibleFromClient != visible) {
34869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mVisibleFromClient = visible;
34879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mVisibleFromServer) {
34889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (visible) makeVisible();
34899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                else mDecor.setVisibility(View.INVISIBLE);
34909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
34919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
34939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void makeVisible() {
34959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mWindowAdded) {
34969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ViewManager wm = getWindowManager();
34979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wm.addView(mDecor, getWindow().getAttributes());
34989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindowAdded = true;
34999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
35009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDecor.setVisibility(View.VISIBLE);
35019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
35029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
35049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Check to see whether this activity is in the process of finishing,
35059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * either because you called {@link #finish} on it or someone else
35069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * has requested that it finished.  This is often used in
35079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onPause} to determine whether the activity is simply pausing or
35089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * completely finishing.
35099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
35109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return If the activity is finishing, returns true; else returns false.
35119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
35129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #finish
35139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
35149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isFinishing() {
35159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mFinished;
35169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
35179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
35193d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton     * Check to see whether this activity is in the process of being destroyed in order to be
35203d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton     * recreated with a new configuration. This is often used in
35213d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton     * {@link #onStop} to determine whether the state needs to be cleaned up or will be passed
35223d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton     * on to the next instance of the activity via {@link #onRetainNonConfigurationInstance()}.
35233d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton     *
35243d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton     * @return If the activity is being torn down in order to be recreated with a new configuration,
35253d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton     * returns true; else returns false.
35263d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton     */
35273d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton    public boolean isChangingConfigurations() {
35283d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton        return mChangingConfigurations;
35293d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton    }
35303d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton
35313d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton    /**
35329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Call this when your activity is done and should be closed.  The
35339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ActivityResult is propagated back to whoever launched you via
35349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * onActivityResult().
35359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
35369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void finish() {
35379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent == null) {
35389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int resultCode;
35399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Intent resultData;
35409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (this) {
35419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                resultCode = mResultCode;
35429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                resultData = mResultData;
35439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (Config.LOGV) Log.v(TAG, "Finishing self: token=" + mToken);
35459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
35469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ActivityManagerNative.getDefault()
35479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    .finishActivity(mToken, resultCode, resultData)) {
35489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mFinished = true;
35499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
35509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
35519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Empty
35529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
35549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParent.finishFromChild(this);
35559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
35569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
35579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
35599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is called when a child activity of this one calls its
35609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #finish} method.  The default implementation simply calls
35619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * finish() on this activity (the parent), finishing the entire group.
35629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
35639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param child The activity making the call.
35649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
35659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #finish
35669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
35679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void finishFromChild(Activity child) {
35689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        finish();
35699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
35709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
35729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Force finish another activity that you had previously started with
35739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #startActivityForResult}.
35749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
35759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param requestCode The request code of the activity that you had
35769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                    given to startActivityForResult().  If there are multiple
35779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                    activities started with this request code, they
35789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                    will all be finished.
35799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
35809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void finishActivity(int requestCode) {
35819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent == null) {
35829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
35839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityManagerNative.getDefault()
35849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    .finishSubActivity(mToken, mEmbeddedID, requestCode);
35859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
35869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Empty
35879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
35899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParent.finishActivityFromChild(this, requestCode);
35909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
35919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
35929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
35949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is called when a child activity of this one calls its
35959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * finishActivity().
35969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
35979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param child The activity making the call.
35989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param requestCode Request code that had been used to start the
35999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                    activity.
36009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
36019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void finishActivityFromChild(Activity child, int requestCode) {
36029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
36039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault()
36049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                .finishSubActivity(mToken, child.mEmbeddedID, requestCode);
36059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
36069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Empty
36079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
36089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
36099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
36119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when an activity you launched exits, giving you the requestCode
36129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * you started it with, the resultCode it returned, and any additional
36139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * data from it.  The <var>resultCode</var> will be
36149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #RESULT_CANCELED} if the activity explicitly returned that,
36159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * didn't return any result, or crashed during its operation.
36169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
36179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>You will receive this call immediately before onResume() when your
36189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity is re-starting.
36199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
36209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param requestCode The integer request code originally supplied to
36219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                    startActivityForResult(), allowing you to identify who this
36229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                    result came from.
36239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param resultCode The integer result code returned by the child activity
36249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                   through its setResult().
36259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param data An Intent, which can return result data to the caller
36269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *               (various data can be attached to Intent "extras").
36279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
36289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startActivityForResult
36299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #createPendingResult
36309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setResult(int)
36319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
36326e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
36339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
36349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
36369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new PendingIntent object which you can hand to others
36379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for them to use to send result data back to your
36389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onActivityResult} callback.  The created object will be either
36399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * one-shot (becoming invalid after a result is sent back) or multiple
36409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * (allowing any number of results to be sent through it).
36419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
36429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param requestCode Private request code for the sender that will be
36439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * associated with the result data when it is returned.  The sender can not
36449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * modify this value, allowing you to identify incoming results.
36459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param data Default data to supply in the result, which may be modified
36469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * by the sender.
36479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param flags May be {@link PendingIntent#FLAG_ONE_SHOT PendingIntent.FLAG_ONE_SHOT},
36489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link PendingIntent#FLAG_NO_CREATE PendingIntent.FLAG_NO_CREATE},
36499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link PendingIntent#FLAG_CANCEL_CURRENT PendingIntent.FLAG_CANCEL_CURRENT},
36509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link PendingIntent#FLAG_UPDATE_CURRENT PendingIntent.FLAG_UPDATE_CURRENT},
36519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * or any of the flags as supported by
36529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link Intent#fillIn Intent.fillIn()} to control which unspecified parts
36539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of the intent that can be supplied when the actual send happens.
36549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
36559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns an existing or new PendingIntent matching the given
36569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * parameters.  May return null only if
36579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link PendingIntent#FLAG_NO_CREATE PendingIntent.FLAG_NO_CREATE} has been
36589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * supplied.
36599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
36609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see PendingIntent
36619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
36629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public PendingIntent createPendingResult(int requestCode, Intent data,
36639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int flags) {
36649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String packageName = getPackageName();
36659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
36669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IIntentSender target =
36679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityManagerNative.getDefault().getIntentSender(
36689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        IActivityManager.INTENT_SENDER_ACTIVITY_RESULT, packageName,
36699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mParent == null ? mToken : mParent.mToken,
36709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mEmbeddedID, requestCode, data, null, flags);
36719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return target != null ? new PendingIntent(target) : null;
36729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
36739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Empty
36749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
36759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
36769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
36779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
36799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Change the desired orientation of this activity.  If the activity
36809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is currently in the foreground or otherwise impacting the screen
36819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * orientation, the screen will immediately be changed (possibly causing
36829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the activity to be restarted). Otherwise, this will be used the next
36839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * time the activity is visible.
36849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
36859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param requestedOrientation An orientation constant as used in
36869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link ActivityInfo#screenOrientation ActivityInfo.screenOrientation}.
36879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
36889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setRequestedOrientation(int requestedOrientation) {
36899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent == null) {
36909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
36919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityManagerNative.getDefault().setRequestedOrientation(
36929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mToken, requestedOrientation);
36939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
36949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Empty
36959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
36969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
36979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParent.setRequestedOrientation(requestedOrientation);
36989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
36999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
37009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
37029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the current requested orientation of the activity.  This will
37039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * either be the orientation requested in its component's manifest, or
37049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the last requested orientation given to
37059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setRequestedOrientation(int)}.
37069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
37079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns an orientation constant as used in
37089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link ActivityInfo#screenOrientation ActivityInfo.screenOrientation}.
37099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
37109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getRequestedOrientation() {
37119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent == null) {
37129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
37139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return ActivityManagerNative.getDefault()
37149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        .getRequestedOrientation(mToken);
37159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
37169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Empty
37179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
37189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
37199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mParent.getRequestedOrientation();
37209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
37219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
37229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
37239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
37259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the identifier of the task this activity is in.  This identifier
37269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will remain the same for the lifetime of the activity.
37279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
37289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Task identifier, an opaque integer.
37299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
37309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getTaskId() {
37319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
37329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault()
37339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                .getTaskForActivity(mToken, false);
37349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
37359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return -1;
37369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
37379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
37389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
37409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return whether this activity is the root of a task.  The root is the
37419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * first activity in a task.
37429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
37439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if this is the root activity, else false.
37449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
37459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isTaskRoot() {
37469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
37479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault()
37489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                .getTaskForActivity(mToken, true) >= 0;
37499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
37509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
37519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
37529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
37539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
37559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Move the task containing this activity to the back of the activity
37569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * stack.  The activity's order within the task is unchanged.
37579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
37589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param nonRoot If false then this only works if the activity is the root
37599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                of a task; if true it will work for any activity in
37609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                a task.
37619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
37629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return If the task was moved (or it was already at the
37639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         back) true is returned, else false.
37649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
37659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean moveTaskToBack(boolean nonRoot) {
37669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
37679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().moveActivityTaskToBack(
37689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mToken, nonRoot);
37699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
37709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Empty
37719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
37729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
37739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
37749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
37769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns class name for this activity with the package prefix removed.
37779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is the default name used to read and write settings.
37789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
37799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The local class name.
37809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
37819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getLocalClassName() {
37829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String pkg = getPackageName();
37839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String cls = mComponent.getClassName();
37849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int packageLen = pkg.length();
37859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!cls.startsWith(pkg) || cls.length() <= packageLen
37869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                || cls.charAt(packageLen) != '.') {
37879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return cls;
37889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
37899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return cls.substring(packageLen+1);
37909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
37919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
37939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns complete component name of this activity.
37949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
37959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the complete component name for this activity
37969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
37979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ComponentName getComponentName()
37989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
37999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mComponent;
38009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
38019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
38039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve a {@link SharedPreferences} object for accessing preferences
38049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that are private to this activity.  This simply calls the underlying
38059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getSharedPreferences(String, int)} method by passing in this activity's
38069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * class name as the preferences name.
38079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
38089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param mode Operating mode.  Use {@link #MODE_PRIVATE} for the default
38099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             operation, {@link #MODE_WORLD_READABLE} and
38109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             {@link #MODE_WORLD_WRITEABLE} to control permissions.
38119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
38129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the single SharedPreferences instance that can be used
38139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         to retrieve and modify the preference values.
38149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
38159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public SharedPreferences getPreferences(int mode) {
38169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getSharedPreferences(getLocalClassName(), mode);
38179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
38189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3819b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn    private void ensureSearchManager() {
3820b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn        if (mSearchManager != null) {
3821b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn            return;
3822b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn        }
3823b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn
3824e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani        mSearchManager = new SearchManager(this, null);
3825b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn    }
3826b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn
38279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
38289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Object getSystemService(String name) {
38299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (getBaseContext() == null) {
38309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalStateException(
38319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "System services not available to Activities before onCreate()");
38329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
38339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (WINDOW_SERVICE.equals(name)) {
38359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mWindowManager;
38368d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert        } else if (SEARCH_SERVICE.equals(name)) {
3837b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn            ensureSearchManager();
38388d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert            return mSearchManager;
38399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
38409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return super.getSystemService(name);
38419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
38429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
38449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Change the title associated with this activity.  If this is a
38459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * top-level activity, the title for its window will change.  If it
38469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is an embedded activity, the parent can do whatever it wants
38479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * with it.
38489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
38499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setTitle(CharSequence title) {
38509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTitle = title;
38519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onTitleChanged(title, mTitleColor);
38529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent != null) {
38549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParent.onChildTitleChanged(this, title);
38559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
38569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
38579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
38599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Change the title associated with this activity.  If this is a
38609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * top-level activity, the title for its window will change.  If it
38619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is an embedded activity, the parent can do whatever it wants
38629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * with it.
38639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
38649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setTitle(int titleId) {
38659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setTitle(getText(titleId));
38669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
38679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setTitleColor(int textColor) {
38699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTitleColor = textColor;
38709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onTitleChanged(mTitle, textColor);
38719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
38729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final CharSequence getTitle() {
38749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mTitle;
38759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
38769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getTitleColor() {
38789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mTitleColor;
38799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
38809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onTitleChanged(CharSequence title, int color) {
38829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mTitleReady) {
38839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final Window win = getWindow();
38849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win != null) {
38859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.setTitle(title);
38869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (color != 0) {
38879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.setTitleColor(color);
38889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
38899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
38909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
38919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
38929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onChildTitleChanged(Activity childActivity, CharSequence title) {
38949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
38959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
38979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the visibility of the progress bar in the title.
38989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
38999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * In order for the progress bar to be shown, the feature must be requested
39009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * via {@link #requestWindowFeature(int)}.
39019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
39029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param visible Whether to show the progress bars in the title.
39039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
39049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setProgressBarVisibility(boolean visible) {
39059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setFeatureInt(Window.FEATURE_PROGRESS, visible ? Window.PROGRESS_VISIBILITY_ON :
39069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Window.PROGRESS_VISIBILITY_OFF);
39079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
39089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
39109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the visibility of the indeterminate progress bar in the title.
39119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
39129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * In order for the progress bar to be shown, the feature must be requested
39139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * via {@link #requestWindowFeature(int)}.
39149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
39159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param visible Whether to show the progress bars in the title.
39169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
39179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setProgressBarIndeterminateVisibility(boolean visible) {
39189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setFeatureInt(Window.FEATURE_INDETERMINATE_PROGRESS,
39199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                visible ? Window.PROGRESS_VISIBILITY_ON : Window.PROGRESS_VISIBILITY_OFF);
39209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
39219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
39239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets whether the horizontal progress bar in the title should be indeterminate (the circular
39249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is always indeterminate).
39259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
39269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * In order for the progress bar to be shown, the feature must be requested
39279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * via {@link #requestWindowFeature(int)}.
39289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
39299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param indeterminate Whether the horizontal progress bar should be indeterminate.
39309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
39319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setProgressBarIndeterminate(boolean indeterminate) {
39329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setFeatureInt(Window.FEATURE_PROGRESS,
39339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                indeterminate ? Window.PROGRESS_INDETERMINATE_ON : Window.PROGRESS_INDETERMINATE_OFF);
39349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
39359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
39379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the progress for the progress bars in the title.
39389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
39399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * In order for the progress bar to be shown, the feature must be requested
39409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * via {@link #requestWindowFeature(int)}.
39419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
39429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param progress The progress for the progress bar. Valid ranges are from
39439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            0 to 10000 (both inclusive). If 10000 is given, the progress
39449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            bar will be completely filled and will fade out.
39459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
39469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setProgress(int progress) {
39479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setFeatureInt(Window.FEATURE_PROGRESS, progress + Window.PROGRESS_START);
39489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
39499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
39519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the secondary progress for the progress bar in the title. This
39529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * progress is drawn between the primary progress (set via
39539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setProgress(int)} and the background. It can be ideal for media
39549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * scenarios such as showing the buffering progress while the default
39559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * progress shows the play progress.
39569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
39579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * In order for the progress bar to be shown, the feature must be requested
39589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * via {@link #requestWindowFeature(int)}.
39599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
39609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param secondaryProgress The secondary progress for the progress bar. Valid ranges are from
39619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            0 to 10000 (both inclusive).
39629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
39639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setSecondaryProgress(int secondaryProgress) {
39649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setFeatureInt(Window.FEATURE_PROGRESS,
39659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                secondaryProgress + Window.PROGRESS_SECONDARY_START);
39669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
39679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
39699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Suggests an audio stream whose volume should be changed by the hardware
39709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * volume controls.
39719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
39729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The suggested audio stream will be tied to the window of this Activity.
39739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If the Activity is switched, the stream set here is no longer the
39749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * suggested stream. The client does not need to save and restore the old
39759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * suggested stream value in onPause and onResume.
39769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
39779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param streamType The type of the audio stream whose volume should be
39789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        changed by the hardware volume controls. It is not guaranteed that
39799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        the hardware volume controls will always change this stream's
39809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        volume (for example, if a call is in progress, its stream's volume
39819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        may be changed instead). To reset back to the default, use
39829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        {@link AudioManager#USE_DEFAULT_STREAM_TYPE}.
39839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
39849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setVolumeControlStream(int streamType) {
39859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setVolumeControlStream(streamType);
39869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
39879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
39899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the suggested audio stream whose volume should be changed by the
39909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * harwdare volume controls.
39919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
39929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The suggested audio stream type whose volume should be changed by
39939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         the hardware volume controls.
39949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setVolumeControlStream(int)
39959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
39969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getVolumeControlStream() {
39979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getWindow().getVolumeControlStream();
39989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
39999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
40019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Runs the specified action on the UI thread. If the current thread is the UI
40029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thread, then the action is executed immediately. If the current thread is
40039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not the UI thread, the action is posted to the event queue of the UI thread.
40049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
40059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param action the action to run on the UI thread
40069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
40079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void runOnUiThread(Runnable action) {
40089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (Thread.currentThread() != mUiThread) {
40099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mHandler.post(action);
40109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
40119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            action.run();
40129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4016ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn     * Standard implementation of
4017ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn     * {@link android.view.LayoutInflater.Factory#onCreateView} used when
4018ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn     * inflating with the LayoutInflater returned by {@link #getSystemService}.
4019625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * This implementation does nothing and is for
4020625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * pre-{@link android.os.Build.VERSION_CODES#HONEYCOMB} apps.  Newer apps
4021625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * should use {@link #onCreateView(View, String, Context, AttributeSet)}.
4022625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     *
4023625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * @see android.view.LayoutInflater#createView
4024625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * @see android.view.Window#getLayoutInflater
4025625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     */
4026625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn    public View onCreateView(String name, Context context, AttributeSet attrs) {
4027625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        return null;
4028625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn    }
4029625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn
4030625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn    /**
4031625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * Standard implementation of
4032625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * {@link android.view.LayoutInflater.Factory2#onCreateView(View, String, Context, AttributeSet)}
4033625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * used when inflating with the LayoutInflater returned by {@link #getSystemService}.
4034ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn     * This implementation handles <fragment> tags to embed fragments inside
4035ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn     * of the activity.
40369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
40379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.view.LayoutInflater#createView
40389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.view.Window#getLayoutInflater
40399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4040625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn    public View onCreateView(View parent, String name, Context context, AttributeSet attrs) {
4041ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        if (!"fragment".equals(name)) {
4042625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            return onCreateView(name, context, attrs);
4043ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        }
4044ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn
4045def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn        String fname = attrs.getAttributeValue(null, "class");
4046ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        TypedArray a =
4047ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn            context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.Fragment);
4048def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn        if (fname == null) {
4049def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn            fname = a.getString(com.android.internal.R.styleable.Fragment_name);
4050def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn        }
4051625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        int id = a.getResourceId(com.android.internal.R.styleable.Fragment_id, View.NO_ID);
4052ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        String tag = a.getString(com.android.internal.R.styleable.Fragment_tag);
4053ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        a.recycle();
4054ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn
4055625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        int containerId = parent != null ? parent.getId() : 0;
4056625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        if (containerId == View.NO_ID && id == View.NO_ID && tag == null) {
4057b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            throw new IllegalArgumentException(attrs.getPositionDescription()
4058625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                    + ": Must specify unique android:id, android:tag, or have a parent with an id for " + fname);
4059b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
4060625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn
4061b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        // If we restored from a previous state, we may already have
4062b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        // instantiated this fragment from the state and should use
4063b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        // that instance instead of making a new one.
4064625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        Fragment fragment = id != View.NO_ID ? mFragments.findFragmentById(id) : null;
4065625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        if (fragment == null && tag != null) {
4066625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            fragment = mFragments.findFragmentByTag(tag);
4067625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        }
4068625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        if (fragment == null && containerId != View.NO_ID) {
4069625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            fragment = mFragments.findFragmentById(containerId);
4070625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        }
4071625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn
4072b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        if (FragmentManagerImpl.DEBUG) Log.v(TAG, "onCreateView: id=0x"
4073b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn                + Integer.toHexString(id) + " fname=" + fname
4074b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn                + " existing=" + fragment);
4075b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        if (fragment == null) {
4076b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn            fragment = Fragment.instantiate(this, fname);
4077b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn            fragment.mFromLayout = true;
4078625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            fragment.mFragmentId = id != 0 ? id : containerId;
4079625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            fragment.mContainerId = containerId;
4080b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn            fragment.mTag = tag;
4081625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            fragment.mInLayout = true;
4082b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn            fragment.mImmediateActivity = this;
40833e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn            fragment.mFragmentManager = mFragments;
4084625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            fragment.onInflate(attrs, fragment.mSavedFragmentState);
4085625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            mFragments.addFragment(fragment, true);
4086625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn
4087625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        } else if (fragment.mInLayout) {
4088625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            // A fragment already exists and it is not one we restored from
4089625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            // previous state.
4090625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            throw new IllegalArgumentException(attrs.getPositionDescription()
4091625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                    + ": Duplicate id 0x" + Integer.toHexString(id)
4092625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                    + ", tag " + tag + ", or parent id 0x" + Integer.toHexString(containerId)
4093625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                    + " with another fragment for " + fname);
4094625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        } else {
4095625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            // This fragment was retained from a previous instance; get it
4096625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            // going now.
4097625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            fragment.mInLayout = true;
4098625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            fragment.mImmediateActivity = this;
4099def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn            // If this fragment is newly instantiated (either right now, or
4100def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn            // from last saved state), then give it the attributes to
4101def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn            // initialize itself.
4102def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn            if (!fragment.mRetaining) {
4103def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn                fragment.onInflate(attrs, fragment.mSavedFragmentState);
4104def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn            }
4105625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            mFragments.moveToState(fragment);
4106b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        }
4107625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn
4108b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        if (fragment.mView == null) {
4109b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn            throw new IllegalStateException("Fragment " + fname
4110b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn                    + " did not create a view.");
4111b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        }
4112625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        if (id != 0) {
4113625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            fragment.mView.setId(id);
4114625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        }
4115b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        if (fragment.mView.getTag() == null) {
4116b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn            fragment.mView.setTag(tag);
4117b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        }
4118b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        return fragment.mView;
41199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
412169a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler    /**
4122625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * Print the Activity's state into the given stream.  This gets invoked if
4123625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * you run "adb shell dumpsys activity <youractivityname>".
4124625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     *
4125625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * @param fd The raw file descriptor that the dump is being sent to.
4126625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * @param writer The PrintWriter to which you should dump your state.  This will be
4127625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * closed for you after you return.
4128625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * @param args additional arguments to the dump request.
4129625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     */
4130625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn    public void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
4131625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        mFragments.dump("", fd, writer, args);
4132625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn    }
4133625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn
4134625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn    /**
413569a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * Bit indicating that this activity is "immersive" and should not be
413669a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * interrupted by notifications if possible.
413769a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     *
413869a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * This value is initially set by the manifest property
413969a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * <code>android:immersive</code> but may be changed at runtime by
414069a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * {@link #setImmersive}.
414169a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     *
414269a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * @see android.content.pm.ActivityInfo#FLAG_IMMERSIVE
414302486b1327e3007c62d253dd89ba9db1852b87f8Dianne Hackborn     * @hide
414469a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     */
414569a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler    public boolean isImmersive() {
414669a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler        try {
414769a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler            return ActivityManagerNative.getDefault().isImmersive(mToken);
414869a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler        } catch (RemoteException e) {
414969a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler            return false;
415069a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler        }
415169a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler    }
415269a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler
415369a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler    /**
415469a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * Adjust the current immersive mode setting.
415569a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     *
415669a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * Note that changing this value will have no effect on the activity's
415769a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * {@link android.content.pm.ActivityInfo} structure; that is, if
415869a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * <code>android:immersive</code> is set to <code>true</code>
415969a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * in the application's manifest entry for this activity, the {@link
416069a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * android.content.pm.ActivityInfo#flags ActivityInfo.flags} member will
416169a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * always have its {@link android.content.pm.ActivityInfo#FLAG_IMMERSIVE
416269a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * FLAG_IMMERSIVE} bit set.
416369a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     *
416469a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * @see #isImmersive
416569a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * @see android.content.pm.ActivityInfo#FLAG_IMMERSIVE
416602486b1327e3007c62d253dd89ba9db1852b87f8Dianne Hackborn     * @hide
416769a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     */
416869a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler    public void setImmersive(boolean i) {
416969a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler        try {
417069a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler            ActivityManagerNative.getDefault().setImmersive(mToken, i);
417169a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler        } catch (RemoteException e) {
417269a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler            // pass
417369a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler        }
417469a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler    }
417569a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler
41766e34636749217654f43221885afb7a29bb5ca96aAdam Powell    /**
4177debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     * Start an action mode.
41786e34636749217654f43221885afb7a29bb5ca96aAdam Powell     *
41796e34636749217654f43221885afb7a29bb5ca96aAdam Powell     * @param callback Callback that will manage lifecycle events for this context mode
41806e34636749217654f43221885afb7a29bb5ca96aAdam Powell     * @return The ContextMode that was started, or null if it was canceled
41816e34636749217654f43221885afb7a29bb5ca96aAdam Powell     *
41826e34636749217654f43221885afb7a29bb5ca96aAdam Powell     * @see ActionMode
41836e34636749217654f43221885afb7a29bb5ca96aAdam Powell     */
41845d27977f9da482627ceb19317a2cd70467aff046Adam Powell    public ActionMode startActionMode(ActionMode.Callback callback) {
41856e34636749217654f43221885afb7a29bb5ca96aAdam Powell        return mWindow.getDecorView().startActionMode(callback);
41866e34636749217654f43221885afb7a29bb5ca96aAdam Powell    }
41876e34636749217654f43221885afb7a29bb5ca96aAdam Powell
4188debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell    /**
4189debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     * Give the Activity a chance to control the UI for an action mode requested
4190debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     * by the system.
4191debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     *
4192debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     * <p>Note: If you are looking for a notification callback that an action mode
4193debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     * has been started for this activity, see {@link #onActionModeStarted(ActionMode)}.</p>
4194debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     *
4195debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     * @param callback The callback that should control the new action mode
4196debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     * @return The new action mode, or <code>null</code> if the activity does not want to
4197debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     *         provide special handling for this action mode. (It will be handled by the system.)
4198debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     */
4199debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell    public ActionMode onWindowStartingActionMode(ActionMode.Callback callback) {
420042c0fe86521af507f597af6159f63879cb5be73eAdam Powell        initActionBar();
42016e34636749217654f43221885afb7a29bb5ca96aAdam Powell        if (mActionBar != null) {
42025d27977f9da482627ceb19317a2cd70467aff046Adam Powell            return mActionBar.startActionMode(callback);
42036e34636749217654f43221885afb7a29bb5ca96aAdam Powell        }
42046e34636749217654f43221885afb7a29bb5ca96aAdam Powell        return null;
42056e34636749217654f43221885afb7a29bb5ca96aAdam Powell    }
42066e34636749217654f43221885afb7a29bb5ca96aAdam Powell
4207debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell    /**
4208debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     * Notifies the Activity that an action mode has been started.
4209debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     * Activity subclasses overriding this method should call the superclass implementation.
4210debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     *
4211debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     * @param mode The new action mode.
4212debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     */
4213debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell    public void onActionModeStarted(ActionMode mode) {
4214debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell    }
4215debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell
4216debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell    /**
4217debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     * Notifies the activity that an action mode has finished.
4218debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     * Activity subclasses overriding this method should call the superclass implementation.
4219debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     *
4220debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     * @param mode The action mode that just finished.
4221debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     */
4222debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell    public void onActionModeFinished(ActionMode mode) {
4223debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell    }
4224debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell
42259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ------------------ Internal API ------------------
42269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void setParent(Activity parent) {
42289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mParent = parent;
42299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
42309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void attach(Context context, ActivityThread aThread, Instrumentation instr, IBinder token,
42329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Application application, Intent intent, ActivityInfo info, CharSequence title,
4233b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            Activity parent, String id, NonConfigurationInstances lastNonConfigurationInstances,
42349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Configuration config) {
4235b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn        attach(context, aThread, instr, token, 0, application, intent, info, title, parent, id,
4236b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            lastNonConfigurationInstances, config);
42379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
42389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4239b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn    final void attach(Context context, ActivityThread aThread,
4240b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn            Instrumentation instr, IBinder token, int ident,
4241b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn            Application application, Intent intent, ActivityInfo info,
4242b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn            CharSequence title, Activity parent, String id,
4243b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            NonConfigurationInstances lastNonConfigurationInstances,
4244b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn            Configuration config) {
42459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        attachBaseContext(context);
42469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42472dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        mFragments.attachActivity(this);
42482dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
42499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindow = PolicyManager.makeNewWindow(this);
42509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindow.setCallback(this);
4251625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        mWindow.getLayoutInflater().setFactory2(this);
42529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (info.softInputMode != WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED) {
42539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindow.setSoftInputMode(info.softInputMode);
42549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUiThread = Thread.currentThread();
4256529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy
42579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread = aThread;
42589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mInstrumentation = instr;
42599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mToken = token;
4260b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn        mIdent = ident;
42619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mApplication = application;
42629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mIntent = intent;
42639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mComponent = intent.getComponent();
42649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mActivityInfo = info;
42659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTitle = title;
42669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mParent = parent;
42679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEmbeddedID = id;
4268b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mLastNonConfigurationInstances = lastNonConfigurationInstances;
42699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4270529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy        mWindow.setWindowManager(null, mToken, mComponent.flattenToString(),
4271529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy                (info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0);
42729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent != null) {
42739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindow.setContainer(mParent.getWindow());
42749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindowManager = mWindow.getWindowManager();
42769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCurrentConfig = config;
42779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
42789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final IBinder getActivityToken() {
42809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mParent != null ? mParent.getActivityToken() : mToken;
42819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
42829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42832dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    final void performCreate(Bundle icicle) {
42842dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        onCreate(icicle);
4285c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn        mFragments.dispatchActivityCreated();
42862dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
42872dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
42889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performStart() {
4289fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn        mFragments.noteStateNotSaved();
42909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = false;
4291445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn        mFragments.execPendingActions();
42929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mInstrumentation.callActivityOnStart(this);
42939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mCalled) {
42949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SuperNotCalledException(
42959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "Activity " + mComponent.toShortString() +
42969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                " did not call through to super.onStart()");
42979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42982dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        mFragments.dispatchStart();
42992707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn        if (mAllLoaderManagers != null) {
43002707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn            for (int i=mAllLoaderManagers.size()-1; i>=0; i--) {
43012707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn                mAllLoaderManagers.valueAt(i).finishRetain();
43022707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn            }
43032707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn        }
43049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
43059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performRestart() {
4307fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn        mFragments.noteStateNotSaved();
4308a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn
43092f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki        synchronized (mManagedCursors) {
43102f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki            final int N = mManagedCursors.size();
43112f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki            for (int i=0; i<N; i++) {
43122f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                ManagedCursor mc = mManagedCursors.get(i);
43132f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                if (mc.mReleased || mc.mUpdated) {
4314a7dd5eab33d1a87135ae5bd40a02f2e3c564f5deVasu Nori                    if (!mc.mCursor.requery()) {
4315a7dd5eab33d1a87135ae5bd40a02f2e3c564f5deVasu Nori                        throw new IllegalStateException(
4316a7dd5eab33d1a87135ae5bd40a02f2e3c564f5deVasu Nori                                "trying to requery an already closed cursor");
4317a7dd5eab33d1a87135ae5bd40a02f2e3c564f5deVasu Nori                    }
43182f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                    mc.mReleased = false;
43192f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                    mc.mUpdated = false;
43202f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                }
43219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
43229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
43239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mStopped) {
43259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStopped = false;
43269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCalled = false;
43279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mInstrumentation.callActivityOnRestart(this);
43289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mCalled) {
43299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new SuperNotCalledException(
43309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "Activity " + mComponent.toShortString() +
43319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    " did not call through to super.onRestart()");
43329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
43339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            performStart();
43349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
43359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
43369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performResume() {
43389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        performRestart();
43399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4340445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn        mFragments.execPendingActions();
4341445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn
4342b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mLastNonConfigurationInstances = null;
43439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // First call onResume() -before- setting mResumed, so we don't
43459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // send out any status bar / menu notifications the client makes.
43469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = false;
43479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mInstrumentation.callActivityOnResume(this);
43489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mCalled) {
43499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SuperNotCalledException(
43509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "Activity " + mComponent.toShortString() +
43519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                " did not call through to super.onResume()");
43529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
43539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Now really resume, and install the current status bar and menu.
43559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mResumed = true;
43569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = false;
43572dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
43582dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        mFragments.dispatchResume();
4359445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn        mFragments.execPendingActions();
43602dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
43619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onPostResume();
43629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mCalled) {
43639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SuperNotCalledException(
43649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "Activity " + mComponent.toShortString() +
43659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                " did not call through to super.onPostResume()");
43669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
43679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
43689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performPause() {
43702dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        mFragments.dispatchPause();
4371e794e9f9b7599c1ad6b8760e601c81b19ecc80c6Dianne Hackborn        mCalled = false;
43729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onPause();
4373e794e9f9b7599c1ad6b8760e601c81b19ecc80c6Dianne Hackborn        if (!mCalled && getApplicationInfo().targetSdkVersion
4374e794e9f9b7599c1ad6b8760e601c81b19ecc80c6Dianne Hackborn                >= android.os.Build.VERSION_CODES.GINGERBREAD) {
4375e794e9f9b7599c1ad6b8760e601c81b19ecc80c6Dianne Hackborn            throw new SuperNotCalledException(
4376e794e9f9b7599c1ad6b8760e601c81b19ecc80c6Dianne Hackborn                    "Activity " + mComponent.toShortString() +
4377e794e9f9b7599c1ad6b8760e601c81b19ecc80c6Dianne Hackborn                    " did not call through to super.onPause()");
4378e794e9f9b7599c1ad6b8760e601c81b19ecc80c6Dianne Hackborn        }
43799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
43809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performUserLeaving() {
43829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onUserInteraction();
43839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onUserLeaveHint();
43849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
43859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performStop() {
4387fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn        if (mLoadersStarted) {
4388fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn            mLoadersStarted = false;
43892707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn            if (mLoaderManager != null) {
43902707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn                if (!mChangingConfigurations) {
43912707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn                    mLoaderManager.doStop();
43922707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn                } else {
43932707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn                    mLoaderManager.doRetain();
43942707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn                }
43952707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn            }
43962707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn        }
43972707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn
43989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mStopped) {
43999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mWindow != null) {
44009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWindow.closeAllPanels();
44019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
44029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44032dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn            mFragments.dispatchStop();
44042dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
44059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCalled = false;
44069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mInstrumentation.callActivityOnStop(this);
44079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mCalled) {
44089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new SuperNotCalledException(
44099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "Activity " + mComponent.toShortString() +
44109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    " did not call through to super.onStop()");
44119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
44129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44132f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki            synchronized (mManagedCursors) {
44142f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                final int N = mManagedCursors.size();
44152f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                for (int i=0; i<N; i++) {
44162f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                    ManagedCursor mc = mManagedCursors.get(i);
44172f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                    if (!mc.mReleased) {
44182f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                        mc.mCursor.deactivate();
44192f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                        mc.mReleased = true;
44202f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                    }
44219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
44229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
44239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStopped = true;
44259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mResumed = false;
44279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44292dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    final void performDestroy() {
4430291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn        mWindow.destroy();
44312dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        mFragments.dispatchDestroy();
44322dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        onDestroy();
44335e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn        if (mLoaderManager != null) {
44345e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn            mLoaderManager.doDestroy();
44355e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn        }
44362dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
44372dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
44389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final boolean isResumed() {
44399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mResumed;
44409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void dispatchActivityResult(String who, int requestCode,
44439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int resultCode, Intent data) {
44449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (Config.LOGV) Log.v(
44459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            TAG, "Dispatching result: who=" + who + ", reqCode=" + requestCode
44469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            + ", resCode=" + resultCode + ", data=" + data);
4447fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn        mFragments.noteStateNotSaved();
44489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (who == null) {
44499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            onActivityResult(requestCode, resultCode, data);
44506e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        } else {
44516e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            Fragment frag = mFragments.findFragmentByWho(who);
44526e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            if (frag != null) {
44536e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                frag.onActivityResult(requestCode, resultCode, data);
44546e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            }
44559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4458