19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.app;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
196e34636749217654f43221885afb7a29bb5ca96aAdam Powellimport com.android.internal.app.ActionBarImpl;
206e34636749217654f43221885afb7a29bb5ca96aAdam Powellimport com.android.internal.policy.PolicyManager;
2175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
22c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackbornimport android.content.ComponentCallbacks2;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentResolver;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
266ed50de6d1e5e27d11304cce226fefeee3105bd7Jason parksimport android.content.CursorLoader;
271ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapuimport android.content.IIntentSender;
2833b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powellimport android.content.Intent;
29fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackbornimport android.content.IntentSender;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.SharedPreferences;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ActivityInfo;
32dd8fab2629131b09367df747afd9a61e42dd1992Adam Powellimport android.content.pm.PackageManager;
33dd8fab2629131b09367df747afd9a61e42dd1992Adam Powellimport android.content.pm.PackageManager.NameNotFoundException;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Configuration;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources;
36ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackbornimport android.content.res.TypedArray;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.Cursor;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Bitmap;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Canvas;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.media.AudioManager;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri;
438d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackbornimport android.os.Build;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder;
4730c9bd89556137157b2f686637ece961454ccabeDianne Hackbornimport android.os.Looper;
48b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackbornimport android.os.Parcelable;
4975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.os.RemoteException;
50758035757f11a085a12b54daa9467f1d6bb251efBrad Fitzpatrickimport android.os.StrictMode;
51f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackbornimport android.os.UserHandle;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.Selection;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.SpannableStringBuilder;
5475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.text.TextUtils;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.method.TextKeyListener;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.EventLog;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
59162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackbornimport android.util.Slog;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseArray;
616e34636749217654f43221885afb7a29bb5ca96aAdam Powellimport android.view.ActionMode;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ContextMenu;
636e34636749217654f43221885afb7a29bb5ca96aAdam Powellimport android.view.ContextMenu.ContextMenuInfo;
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ContextThemeWrapper;
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyEvent;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.LayoutInflater;
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Menu;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.MenuInflater;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.MenuItem;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.MotionEvent;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View;
726e34636749217654f43221885afb7a29bb5ca96aAdam Powellimport android.view.View.OnCreateContextMenuListener;
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewGroup;
746e34636749217654f43221885afb7a29bb5ca96aAdam Powellimport android.view.ViewGroup.LayoutParams;
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewManager;
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Window;
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManager;
7898365d7663cbd82979a5700faf0050220b01084dJeff Brownimport android.view.WindowManagerGlobal;
7975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.view.accessibility.AccessibilityEvent;
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.AdapterView;
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
82625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackbornimport java.io.FileDescriptor;
83625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackbornimport java.io.PrintWriter;
846e34636749217654f43221885afb7a29bb5ca96aAdam Powellimport java.util.ArrayList;
856e34636749217654f43221885afb7a29bb5ca96aAdam Powellimport java.util.HashMap;
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * An activity is a single, focused thing that the user can do.  Almost all
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activities interact with the user, so the Activity class takes care of
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * creating a window for you in which you can place your UI with
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #setContentView}.  While activities are often presented to the user
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as full-screen windows, they can also be used in other ways: as floating
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * windows (via a theme with {@link android.R.attr#windowIsFloating} set)
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or embedded inside of another activity (using {@link ActivityGroup}).
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * There are two methods almost all subclasses of Activity will implement:
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul>
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> {@link #onCreate} is where you initialize your activity.  Most
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     importantly, here you will usually call {@link #setContentView(int)}
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     with a layout resource defining your UI, and using {@link #findViewById}
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     to retrieve the widgets in that UI that you need to interact with
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     programmatically.
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> {@link #onPause} is where you deal with the user leaving your
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     activity.  Most importantly, any changes made by the user should at this
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     point be committed (usually to the
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     {@link android.content.ContentProvider} holding the data).
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>To be of use with {@link android.content.Context#startActivity Context.startActivity()}, all
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity classes must have a corresponding
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.styleable#AndroidManifestActivity &lt;activity&gt;}
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * declaration in their package's <code>AndroidManifest.xml</code>.</p>
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Topics covered here:
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ol>
118291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <li><a href="#Fragments">Fragments</a>
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#ActivityLifecycle">Activity Lifecycle</a>
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#ConfigurationChanges">Configuration Changes</a>
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#StartingActivities">Starting Activities and Getting Results</a>
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#SavingPersistentState">Saving Persistent State</a>
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#Permissions">Permissions</a>
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#ProcessLifecycle">Process Lifecycle</a>
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ol>
126b54e7a3d9f60ac605f404f9eb3c5e92ca51bbd23Joe Fernandez *
127b54e7a3d9f60ac605f404f9eb3c5e92ca51bbd23Joe Fernandez * <div class="special reference">
128b54e7a3d9f60ac605f404f9eb3c5e92ca51bbd23Joe Fernandez * <h3>Developer Guides</h3>
129b54e7a3d9f60ac605f404f9eb3c5e92ca51bbd23Joe Fernandez * <p>The Activity class is an important part of an application's overall lifecycle,
130b54e7a3d9f60ac605f404f9eb3c5e92ca51bbd23Joe Fernandez * and the way activities are launched and put together is a fundamental
131b54e7a3d9f60ac605f404f9eb3c5e92ca51bbd23Joe Fernandez * part of the platform's application model. For a detailed perspective on the structure of an
132b54e7a3d9f60ac605f404f9eb3c5e92ca51bbd23Joe Fernandez * Android application and how activities behave, please read the
133b54e7a3d9f60ac605f404f9eb3c5e92ca51bbd23Joe Fernandez * <a href="{@docRoot}guide/topics/fundamentals.html">Application Fundamentals</a> and
134b54e7a3d9f60ac605f404f9eb3c5e92ca51bbd23Joe Fernandez * <a href="{@docRoot}guide/topics/fundamentals/tasks-and-back-stack.html">Tasks and Back Stack</a>
135b54e7a3d9f60ac605f404f9eb3c5e92ca51bbd23Joe Fernandez * developer guides.</p>
136b54e7a3d9f60ac605f404f9eb3c5e92ca51bbd23Joe Fernandez *
137b54e7a3d9f60ac605f404f9eb3c5e92ca51bbd23Joe Fernandez * <p>You can also find a detailed discussion about how to create activities in the
138b54e7a3d9f60ac605f404f9eb3c5e92ca51bbd23Joe Fernandez * <a href="{@docRoot}guide/topics/fundamentals/activities.html">Activities</a>
139b54e7a3d9f60ac605f404f9eb3c5e92ca51bbd23Joe Fernandez * developer guide.</p>
140b54e7a3d9f60ac605f404f9eb3c5e92ca51bbd23Joe Fernandez * </div>
141b54e7a3d9f60ac605f404f9eb3c5e92ca51bbd23Joe Fernandez *
142291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <a name="Fragments"></a>
143291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <h3>Fragments</h3>
144291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn *
145291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <p>Starting with {@link android.os.Build.VERSION_CODES#HONEYCOMB}, Activity
146291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * implementations can make use of the {@link Fragment} class to better
147291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * modularize their code, build more sophisticated user interfaces for larger
148291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * screens, and help scale their application between small and large screens.
149291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn *
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="ActivityLifecycle"></a>
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Activity Lifecycle</h3>
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Activities in the system are managed as an <em>activity stack</em>.
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * When a new activity is started, it is placed on the top of the stack
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and becomes the running activity -- the previous activity always remains
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * below it in the stack, and will not come to the foreground again until
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the new activity exits.</p>
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>An activity has essentially four states:</p>
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul>
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> If an activity in the foreground of the screen (at the top of
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         the stack),
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         it is <em>active</em> or  <em>running</em>. </li>
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li>If an activity has lost focus but is still visible (that is, a new non-full-sized
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         or transparent activity has focus on top of your activity), it
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         is <em>paused</em>. A paused activity is completely alive (it
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         maintains all state and member information and remains attached to
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         the window manager), but can be killed by the system in extreme
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         low memory situations.
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li>If an activity is completely obscured by another activity,
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         it is <em>stopped</em>. It still retains all state and member information,
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         however, it is no longer visible to the user so its window is hidden
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         and it will often be killed by the system when memory is needed
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         elsewhere.</li>
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li>If an activity is paused or stopped, the system can drop the activity
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         from memory by either asking it to finish, or simply killing its
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         process.  When it is displayed again to the user, it must be
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         completely restarted and restored to its previous state.</li>
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The following diagram shows the important state paths of an Activity.
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The square rectangles represent callback methods you can implement to
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * perform operations when the Activity moves between states.  The colored
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ovals are major states the Activity can be in.</p>
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><img src="../../../images/activity_lifecycle.png"
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      alt="State diagram for an Android Activity Lifecycle." border="0" /></p>
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>There are three key loops you may be interested in monitoring within your
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity:
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul>
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>The <b>entire lifetime</b> of an activity happens between the first call
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to {@link android.app.Activity#onCreate} through to a single final call
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to {@link android.app.Activity#onDestroy}.  An activity will do all setup
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of "global" state in onCreate(), and release all remaining resources in
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * onDestroy().  For example, if it has a thread running in the background
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to download data from the network, it may create that thread in onCreate()
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and then stop the thread in onDestroy().
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>The <b>visible lifetime</b> of an activity happens between a call to
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#onStart} until a corresponding call to
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#onStop}.  During this time the user can see the
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity on-screen, though it may not be in the foreground and interacting
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with the user.  Between these two methods you can maintain resources that
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are needed to show the activity to the user.  For example, you can register
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a {@link android.content.BroadcastReceiver} in onStart() to monitor for changes
208f76a50ce8fdc6aea22cabc77b2977a1a15a79630Ken Wakasa * that impact your UI, and unregister it in onStop() when the user no
209f76a50ce8fdc6aea22cabc77b2977a1a15a79630Ken Wakasa * longer sees what you are displaying.  The onStart() and onStop() methods
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can be called multiple times, as the activity becomes visible and hidden
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to the user.
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>The <b>foreground lifetime</b> of an activity happens between a call to
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#onResume} until a corresponding call to
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#onPause}.  During this time the activity is
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in front of all other activities and interacting with the user.  An activity
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can frequently go between the resumed and paused states -- for example when
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the device goes to sleep, when an activity result is delivered, when a new
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * intent is delivered -- so the code in these methods should be fairly
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * lightweight.
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The entire lifecycle of an activity is defined by the following
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Activity methods.  All of these are hooks that you can override
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to do appropriate work when the activity changes state.  All
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activities will implement {@link android.app.Activity#onCreate}
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to do their initial setup; many will also implement
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#onPause} to commit changes to data and
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * otherwise prepare to stop interacting with the user.  You should always
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * call up to your superclass when implementing these methods.</p>
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p>
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint">
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * public class Activity extends ApplicationContext {
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onCreate(Bundle savedInstanceState);
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onStart();
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onRestart();
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onResume();
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onPause();
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onStop();
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onDestroy();
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * }
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </pre>
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>In general the movement through an activity's lifecycle looks like
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this:</p>
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <table border="2" width="85%" align="center" frame="hsides" rules="rows">
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <colgroup align="left" span="3" />
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <colgroup align="left" />
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <colgroup align="center" />
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <colgroup align="center" />
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <thead>
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th colspan="3">Method</th> <th>Description</th> <th>Killable?</th> <th>Next</th></tr>
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </thead>
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tbody>
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th colspan="3" align="left" border="0">{@link android.app.Activity#onCreate onCreate()}</th>
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>Called when the activity is first created.
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             This is where you should do all of your normal static set up:
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             create views, bind data to lists, etc.  This method also
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             provides you with a Bundle containing the activity's previously
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             frozen state, if there was one.
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             <p>Always followed by <code>onStart()</code>.</td>
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center">No</td>
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center"><code>onStart()</code></td>
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><td rowspan="5" style="border-left: none; border-right: none;">&nbsp;&nbsp;&nbsp;&nbsp;</td>
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <th colspan="2" align="left" border="0">{@link android.app.Activity#onRestart onRestart()}</th>
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>Called after your activity has been stopped, prior to it being
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             started again.
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             <p>Always followed by <code>onStart()</code></td>
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center">No</td>
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center"><code>onStart()</code></td>
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th colspan="2" align="left" border="0">{@link android.app.Activity#onStart onStart()}</th>
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>Called when the activity is becoming visible to the user.
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             <p>Followed by <code>onResume()</code> if the activity comes
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             to the foreground, or <code>onStop()</code> if it becomes hidden.</td>
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center">No</td>
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center"><code>onResume()</code> or <code>onStop()</code></td>
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><td rowspan="2" style="border-left: none;">&nbsp;&nbsp;&nbsp;&nbsp;</td>
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <th align="left" border="0">{@link android.app.Activity#onResume onResume()}</th>
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>Called when the activity will start
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             interacting with the user.  At this point your activity is at
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             the top of the activity stack, with user input going to it.
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             <p>Always followed by <code>onPause()</code>.</td>
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center">No</td>
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center"><code>onPause()</code></td>
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th align="left" border="0">{@link android.app.Activity#onPause onPause()}</th>
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>Called when the system is about to start resuming a previous
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             activity.  This is typically used to commit unsaved changes to
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             persistent data, stop animations and other things that may be consuming
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             CPU, etc.  Implementations of this method must be very quick because
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             the next activity will not be resumed until this method returns.
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             <p>Followed by either <code>onResume()</code> if the activity
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             returns back to the front, or <code>onStop()</code> if it becomes
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             invisible to the user.</td>
3120aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn *         <td align="center"><font color="#800000"><strong>Pre-{@link android.os.Build.VERSION_CODES#HONEYCOMB}</strong></font></td>
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center"><code>onResume()</code> or<br>
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 <code>onStop()</code></td>
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th colspan="2" align="left" border="0">{@link android.app.Activity#onStop onStop()}</th>
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>Called when the activity is no longer visible to the user, because
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             another activity has been resumed and is covering this one.  This
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             may happen either because a new activity is being started, an existing
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             one is being brought in front of this one, or this one is being
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             destroyed.
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             <p>Followed by either <code>onRestart()</code> if
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             this activity is coming back to interact with the user, or
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             <code>onDestroy()</code> if this activity is going away.</td>
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center"><font color="#800000"><strong>Yes</strong></font></td>
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center"><code>onRestart()</code> or<br>
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 <code>onDestroy()</code></td>
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th colspan="3" align="left" border="0">{@link android.app.Activity#onDestroy onDestroy()}</th>
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>The final call you receive before your
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             activity is destroyed.  This can happen either because the
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             activity is finishing (someone called {@link Activity#finish} on
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             it, or because the system is temporarily destroying this
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             instance of the activity to save space.  You can distinguish
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             between these two scenarios with the {@link
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             Activity#isFinishing} method.</td>
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center"><font color="#800000"><strong>Yes</strong></font></td>
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center"><em>nothing</em></td>
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tbody>
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </table>
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Note the "Killable" column in the above table -- for those methods that
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are marked as being killable, after that method returns the process hosting the
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity may killed by the system <em>at any time</em> without another line
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of its code being executed.  Because of this, you should use the
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #onPause} method to write any persistent data (such as user edits)
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to storage.  In addition, the method
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #onSaveInstanceState(Bundle)} is called before placing the activity
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in such a background state, allowing you to save away any dynamic instance
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * state in your activity into the given Bundle, to be later received in
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #onCreate} if the activity needs to be re-created.
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the <a href="#ProcessLifecycle">Process Lifecycle</a>
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * section for more information on how the lifecycle of a process is tied
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to the activities it is hosting.  Note that it is important to save
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * persistent data in {@link #onPause} instead of {@link #onSaveInstanceState}
3595c40f3fcc966ecde3347cd7ddbe965440318c35aDaisuke Miyakawa * because the latter is not part of the lifecycle callbacks, so will not
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be called in every situation as described in its documentation.</p>
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3620aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn * <p class="note">Be aware that these semantics will change slightly between
3630aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn * applications targeting platforms starting with {@link android.os.Build.VERSION_CODES#HONEYCOMB}
3640aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn * vs. those targeting prior platforms.  Starting with Honeycomb, an application
3650aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn * is not in the killable state until its {@link #onStop} has returned.  This
3660aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn * impacts when {@link #onSaveInstanceState(Bundle)} may be called (it may be
3670aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn * safely called after {@link #onPause()} and allows and application to safely
3680aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn * wait until {@link #onStop()} to save persistent state.</p>
3690aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn *
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>For those methods that are not marked as being killable, the activity's
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * process will not be killed by the system starting from the time the method
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is called and continuing after it returns.  Thus an activity is in the killable
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * state, for example, between after <code>onPause()</code> to the start of
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <code>onResume()</code>.</p>
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="ConfigurationChanges"></a>
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Configuration Changes</h3>
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>If the configuration of the device (as defined by the
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Configuration Resources.Configuration} class) changes,
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * then anything displaying a user interface will need to update to match that
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * configuration.  Because Activity is the primary mechanism for interacting
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with the user, it includes special support for handling configuration
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * changes.</p>
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Unless you specify otherwise, a configuration change (such as a change
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in screen orientation, language, input devices, etc) will cause your
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current activity to be <em>destroyed</em>, going through the normal activity
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * lifecycle process of {@link #onPause},
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #onStop}, and {@link #onDestroy} as appropriate.  If the activity
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * had been in the foreground or visible to the user, once {@link #onDestroy} is
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * called in that instance then a new instance of the activity will be
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * created, with whatever savedInstanceState the previous instance had generated
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * from {@link #onSaveInstanceState}.</p>
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>This is done because any application resource,
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * including layout files, can change based on any configuration value.  Thus
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the only safe way to handle a configuration change is to re-retrieve all
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * resources, including layouts, drawables, and strings.  Because activities
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * must already know how to save their state and re-create themselves from
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that state, this is a convenient way to have an activity restart itself
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with a new configuration.</p>
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>In some special cases, you may want to bypass restarting of your
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity based on one or more types of configuration changes.  This is
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * done with the {@link android.R.attr#configChanges android:configChanges}
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * attribute in its manifest.  For any types of configuration changes you say
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that you handle there, you will receive a call to your current activity's
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #onConfigurationChanged} method instead of being restarted.  If
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a configuration change involves any that you do not handle, however, the
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity will still be restarted and {@link #onConfigurationChanged}
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will not be called.</p>
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="StartingActivities"></a>
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Starting Activities and Getting Results</h3>
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The {@link android.app.Activity#startActivity}
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * method is used to start a
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * new activity, which will be placed at the top of the activity stack.  It
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * takes a single argument, an {@link android.content.Intent Intent},
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * which describes the activity
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to be executed.</p>
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Sometimes you want to get a result back from an activity when it
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ends.  For example, you may start an activity that lets the user pick
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a person in a list of contacts; when it ends, it returns the person
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that was selected.  To do this, you call the
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#startActivityForResult(Intent, int)}
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * version with a second integer parameter identifying the call.  The result
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will come back through your {@link android.app.Activity#onActivityResult}
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * method.</p>
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>When an activity exits, it can call
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#setResult(int)}
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to return data back to its parent.  It must always supply a result code,
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * which can be the standard results RESULT_CANCELED, RESULT_OK, or any
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * custom values starting at RESULT_FIRST_USER.  In addition, it can optionally
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * return back an Intent containing any additional data it wants.  All of this
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * information appears back on the
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * parent's <code>Activity.onActivityResult()</code>, along with the integer
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * identifier it originally supplied.</p>
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>If a child activity fails for any reason (such as crashing), the parent
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity will receive a result with the code RESULT_CANCELED.</p>
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint">
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * public class MyActivity extends Activity {
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     ...
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     static final int PICK_CONTACT_REQUEST = 0;
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected boolean onKeyDown(int keyCode, KeyEvent event) {
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             // When the user center presses, let them pick a contact.
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             startActivityForResult(
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 new Intent(Intent.ACTION_PICK,
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 new Uri("content://contacts")),
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 PICK_CONTACT_REQUEST);
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *            return true;
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         }
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         return false;
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     }
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onActivityResult(int requestCode, int resultCode,
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             Intent data) {
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         if (requestCode == PICK_CONTACT_REQUEST) {
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             if (resultCode == RESULT_OK) {
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 // A contact was picked.  Here we will just display it
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 // to the user.
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 startActivity(new Intent(Intent.ACTION_VIEW, data));
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             }
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         }
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     }
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * }
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </pre>
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="SavingPersistentState"></a>
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Saving Persistent State</h3>
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>There are generally two kinds of persistent state than an activity
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will deal with: shared document-like data (typically stored in a SQLite
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * database using a {@linkplain android.content.ContentProvider content provider})
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and internal state such as user preferences.</p>
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>For content provider data, we suggest that activities use a
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * "edit in place" user model.  That is, any edits a user makes are effectively
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * made immediately without requiring an additional confirmation step.
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Supporting this model is generally a simple matter of following two rules:</p>
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul>
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> <p>When creating a new document, the backing database entry or file for
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             it is created immediately.  For example, if the user chooses to write
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             a new e-mail, a new entry for that e-mail is created as soon as they
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             start entering data, so that if they go to any other activity after
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             that point this e-mail will now appear in the list of drafts.</p>
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> <p>When an activity's <code>onPause()</code> method is called, it should
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             commit to the backing content provider or file any changes the user
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             has made.  This ensures that those changes will be seen by any other
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             activity that is about to run.  You will probably want to commit
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             your data even more aggressively at key times during your
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             activity's lifecycle: for example before starting a new
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             activity, before finishing your own activity, when the user
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             switches between input fields, etc.</p>
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>This model is designed to prevent data loss when a user is navigating
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * between activities, and allows the system to safely kill an activity (because
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * system resources are needed somewhere else) at any time after it has been
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * paused.  Note this implies
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that the user pressing BACK from your activity does <em>not</em>
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mean "cancel" -- it means to leave the activity with its current contents
5120aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn * saved away.  Canceling edits in an activity must be provided through
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * some other mechanism, such as an explicit "revert" or "undo" option.</p>
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>See the {@linkplain android.content.ContentProvider content package} for
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * more information about content providers.  These are a key aspect of how
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * different activities invoke and propagate data between themselves.</p>
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The Activity class also provides an API for managing internal persistent state
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * associated with an activity.  This can be used, for example, to remember
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the user's preferred initial display in a calendar (day view or week view)
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or the user's default home page in a web browser.</p>
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Activity persistent state is managed
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with the method {@link #getPreferences},
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * allowing you to retrieve and
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * modify a set of name/value pairs associated with the activity.  To use
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * preferences that are shared across multiple application components
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (activities, receivers, services, providers), you can use the underlying
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Context#getSharedPreferences Context.getSharedPreferences()} method
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to retrieve a preferences
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * object stored under a specific name.
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (Note that it is not possible to share settings data across application
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * packages -- for that you will need a content provider.)</p>
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Here is an excerpt from a calendar activity that stores the user's
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * preferred view mode in its persistent settings:</p>
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint">
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * public class CalendarActivity extends Activity {
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     ...
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     static final int DAY_VIEW_MODE = 0;
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     static final int WEEK_VIEW_MODE = 1;
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     private SharedPreferences mPrefs;
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     private int mCurViewMode;
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onCreate(Bundle savedInstanceState) {
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         super.onCreate(savedInstanceState);
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         SharedPreferences mPrefs = getSharedPreferences();
5533fa98cb02c8f748b82869cd784db82094e950e4bQuddus Chong *         mCurViewMode = mPrefs.getInt("view_mode", DAY_VIEW_MODE);
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     }
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onPause() {
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         super.onPause();
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         SharedPreferences.Editor ed = mPrefs.edit();
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         ed.putInt("view_mode", mCurViewMode);
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         ed.commit();
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     }
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * }
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </pre>
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="Permissions"></a>
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Permissions</h3>
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The ability to start a particular Activity can be enforced when it is
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * declared in its
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * manifest's {@link android.R.styleable#AndroidManifestActivity &lt;activity&gt;}
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * tag.  By doing so, other applications will need to declare a corresponding
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.styleable#AndroidManifestUsesPermission &lt;uses-permission&gt;}
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * element in their own manifest to be able to start that activity.
57521c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn *
57621c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn * <p>When starting an Activity you can set {@link Intent#FLAG_GRANT_READ_URI_PERMISSION
57721c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn * Intent.FLAG_GRANT_READ_URI_PERMISSION} and/or {@link Intent#FLAG_GRANT_WRITE_URI_PERMISSION
57821c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn * Intent.FLAG_GRANT_WRITE_URI_PERMISSION} on the Intent.  This will grant the
57921c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn * Activity access to the specific URIs in the Intent.  Access will remain
58021c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn * until the Activity has finished (it will remain across the hosting
58121c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn * process being killed and other temporary destruction).  As of
58221c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn * {@link android.os.Build.VERSION_CODES#GINGERBREAD}, if the Activity
58321c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn * was already created and a new Intent is being delivered to
58421c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn * {@link #onNewIntent(Intent)}, any newly granted URI permissions will be added
58521c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn * to the existing ones it holds.
58621c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn *
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>See the <a href="{@docRoot}guide/topics/security/security.html">Security and Permissions</a>
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * document for more information on permissions and security in general.
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="ProcessLifecycle"></a>
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Process Lifecycle</h3>
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The Android system attempts to keep application process around for as
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * long as possible, but eventually will need to remove old processes when
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * memory runs low.  As described in <a href="#ActivityLifecycle">Activity
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Lifecycle</a>, the decision about which process to remove is intimately
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * tied to the state of the user's interaction with it.  In general, there
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are four states a process can be in based on the activities running in it,
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * listed here in order of importance.  The system will kill less important
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * processes (the last ones) before it resorts to killing more important
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * processes (the first ones).
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ol>
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <p>The <b>foreground activity</b> (the activity at the top of the screen
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that the user is currently interacting with) is considered the most important.
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Its process will only be killed as a last resort, if it uses more memory
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * than is available on the device.  Generally at this point the device has
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * reached a memory paging state, so this is required in order to keep the user
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * interface responsive.
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <p>A <b>visible activity</b> (an activity that is visible to the user
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * but not in the foreground, such as one sitting behind a foreground dialog)
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is considered extremely important and will not be killed unless that is
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * required to keep the foreground activity running.
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <p>A <b>background activity</b> (an activity that is not visible to
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the user and has been paused) is no longer critical, so the system may
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * safely kill its process to reclaim memory for other foreground or
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * visible processes.  If its process needs to be killed, when the user navigates
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * back to the activity (making it visible on the screen again), its
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #onCreate} method will be called with the savedInstanceState it had previously
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * supplied in {@link #onSaveInstanceState} so that it can restart itself in the same
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * state as the user last left it.
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <p>An <b>empty process</b> is one hosting no activities or other
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * application components (such as {@link Service} or
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.BroadcastReceiver} classes).  These are killed very
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * quickly by the system as memory becomes low.  For this reason, any
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * background operation you do outside of an activity must be executed in the
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * context of an activity BroadcastReceiver or Service to ensure that the system
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * knows it needs to keep your process around.
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ol>
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Sometimes an Activity may need to do a long-running operation that exists
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * independently of the activity lifecycle itself.  An example may be a camera
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * application that allows you to upload a picture to a web site.  The upload
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * may take a long time, and the application should allow the user to leave
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the application will it is executing.  To accomplish this, your Activity
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * should start a {@link Service} in which the upload takes place.  This allows
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the system to properly prioritize your process (considering it to be more
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * important than other non-visible applications) for the duration of the
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * upload, independent of whether the original activity is paused, stopped,
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or finished.
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Activity extends ContextThemeWrapper
643625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        implements LayoutInflater.Factory2,
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Window.Callback, KeyEvent.Callback,
645c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        OnCreateContextMenuListener, ComponentCallbacks2 {
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String TAG = "Activity";
647162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn    private static final boolean DEBUG_LIFECYCLE = false;
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Standard activity result: operation canceled. */
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int RESULT_CANCELED    = 0;
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Standard activity result: operation succeeded. */
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int RESULT_OK           = -1;
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Start of user-defined activity results. */
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int RESULT_FIRST_USER   = 1;
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
65662bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    static final String FRAGMENTS_TAG = "android:fragments";
65762bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String WINDOW_HIERARCHY_TAG = "android:viewHierarchyState";
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String SAVED_DIALOG_IDS_KEY = "android:savedDialogIds";
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String SAVED_DIALOGS_TAG = "android:savedDialogs";
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String SAVED_DIALOG_KEY_PREFIX = "android:dialog_";
6628ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    private static final String SAVED_DIALOG_ARGS_KEY_PREFIX = "android:dialog_args_";
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6648ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    private static class ManagedDialog {
6658ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        Dialog mDialog;
6668ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        Bundle mArgs;
6678ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    }
6688ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    private SparseArray<ManagedDialog> mManagedDialogs;
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // set by the thread after the constructor and before onCreate(Bundle savedInstanceState) is called.
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Instrumentation mInstrumentation;
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IBinder mToken;
673b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn    private int mIdent;
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ String mEmbeddedID;
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Application mApplication;
676b70f3dff01e7e1e85f77cf0b0b2eaba8200eb82cChristopher Tate    /*package*/ Intent mIntent;
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ComponentName mComponent;
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ ActivityInfo mActivityInfo;
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ ActivityThread mMainThread;
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Activity mParent;
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mCalled;
6825e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn    boolean mCheckedForLoaderManager;
683fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn    boolean mLoadersStarted;
68452d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamilton    /*package*/ boolean mResumed;
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mStopped;
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mFinished;
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mStartedActivity;
6886d9dcbccec126d9b87ab6587e686e28b87e5a04dDianne Hackborn    private boolean mDestroyed;
689fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn    /** true if the activity is going through a transient pause */
690fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn    /*package*/ boolean mTemporaryPause = false;
6913d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton    /** true if the activity is being destroyed in order to recreate it with a new configuration */
6923d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton    /*package*/ boolean mChangingConfigurations = false;
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ int mConfigChangeFlags;
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ Configuration mCurrentConfig;
6958d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert    private SearchManager mSearchManager;
69688ab69780f58e4b32d497266b2ad646a4d74827bAdam Powell    private MenuInflater mMenuInflater;
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
698b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    static final class NonConfigurationInstances {
699b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        Object activity;
700b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        HashMap<String, Object> children;
701b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        ArrayList<Fragment> fragments;
70262bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        HashMap<String, LoaderManagerImpl> loaders;
703b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
704b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    /* package */ NonConfigurationInstances mLastNonConfigurationInstances;
705b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Window mWindow;
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private WindowManager mWindowManager;
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ View mDecor = null;
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ boolean mWindowAdded = false;
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ boolean mVisibleFromServer = false;
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ boolean mVisibleFromClient = true;
713ac695c608ba620e2362f57126d7be453cf5b7e1bAdam Powell    /*package*/ ActionBarImpl mActionBar = null;
714dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell    private boolean mEnableDefaultActionBarUp;
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private CharSequence mTitle;
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mTitleColor = 0;
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
719b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    final FragmentManagerImpl mFragments = new FragmentManagerImpl();
72062bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    final FragmentContainer mContainer = new FragmentContainer() {
72162bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        @Override
72262bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        public View findViewById(int id) {
72362bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            return Activity.this.findViewById(id);
72462bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        }
72562bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    };
7262dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
72762bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    HashMap<String, LoaderManagerImpl> mAllLoaderManagers;
7284911b783aa9f4af5ac919db861751d350471f5efDianne Hackborn    LoaderManagerImpl mLoaderManager;
729c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final class ManagedCursor {
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ManagedCursor(Cursor cursor) {
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCursor = cursor;
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mReleased = false;
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUpdated = false;
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final Cursor mCursor;
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private boolean mReleased;
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private boolean mUpdated;
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final ArrayList<ManagedCursor> mManagedCursors =
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new ArrayList<ManagedCursor>();
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // protected by synchronized (this)
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mResultCode = RESULT_CANCELED;
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Intent mResultData = null;
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mTitleReady = false;
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mDefaultKeyMode = DEFAULT_KEYS_DISABLE;
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private SpannableStringBuilder mDefaultKeySsb = null;
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static final int[] FOCUSED_STATE_SET = {com.android.internal.R.attr.state_focused};
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
75562bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    @SuppressWarnings("unused")
7567e442837702a6e026c73a01fedb62c222b63cfc9Jeff Brown    private final Object mInstanceTracker = StrictMode.trackActivity(this);
7577e442837702a6e026c73a01fedb62c222b63cfc9Jeff Brown
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Thread mUiThread;
759b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    final Handler mHandler = new Handler();
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Return the intent that started this activity. */
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Intent getIntent() {
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mIntent;
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Change the intent returned by {@link #getIntent}.  This holds a
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * reference to the given intent; it does not copy it.  Often used in
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * conjunction with {@link #onNewIntent}.
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param newIntent The new Intent object to return from getIntent
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getIntent
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onNewIntent
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setIntent(Intent newIntent) {
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mIntent = newIntent;
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Return the application that owns this activity. */
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final Application getApplication() {
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mApplication;
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Is this activity embedded inside of another activity? */
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean isChild() {
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mParent != null;
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Return the parent activity if this view is an embedded child. */
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final Activity getParent() {
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mParent;
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Retrieve the window manager for showing custom windows. */
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public WindowManager getWindowManager() {
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mWindowManager;
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the current {@link android.view.Window} for the activity.
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This can be used to directly access parts of the Window API that
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * are not available through Activity/Screen.
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Window The current window, or null if the activity is not
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         visual.
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Window getWindow() {
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mWindow;
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
813c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn     * Return the LoaderManager for this fragment, creating it if needed.
814c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn     */
815c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn    public LoaderManager getLoaderManager() {
816c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn        if (mLoaderManager != null) {
817c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn            return mLoaderManager;
818c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn        }
8195e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn        mCheckedForLoaderManager = true;
82062bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        mLoaderManager = getLoaderManager(null, mLoadersStarted, true);
821c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn        return mLoaderManager;
822c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn    }
823c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn
82462bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    LoaderManagerImpl getLoaderManager(String who, boolean started, boolean create) {
825c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn        if (mAllLoaderManagers == null) {
82662bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            mAllLoaderManagers = new HashMap<String, LoaderManagerImpl>();
827c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn        }
82862bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        LoaderManagerImpl lm = mAllLoaderManagers.get(who);
829fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn        if (lm == null) {
830fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn            if (create) {
83162bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                lm = new LoaderManagerImpl(who, this, started);
83262bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                mAllLoaderManagers.put(who, lm);
833fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn            }
834fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn        } else {
835fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn            lm.updateActivity(this);
836c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn        }
837c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn        return lm;
838c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn    }
839c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn
840c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn    /**
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Calls {@link android.view.Window#getCurrentFocus} on the
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Window of this Activity to return the currently focused view.
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return View The current View with focus or null.
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getWindow
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.view.Window#getCurrentFocus
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public View getCurrentFocus() {
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mWindow != null ? mWindow.getCurrentFocus() : null;
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when the activity is starting.  This is where most initialization
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * should go: calling {@link #setContentView(int)} to inflate the
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity's UI, using {@link #findViewById} to programmatically interact
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * with widgets in the UI, calling
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #managedQuery(android.net.Uri , String[], String, String[], String)} to retrieve
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * cursors for data being displayed, etc.
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>You can call {@link #finish} from within this function, in
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * which case onDestroy() will be immediately called without any of the rest
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of the activity lifecycle ({@link #onStart}, {@link #onResume},
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onPause}, etc) executing.
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Derived classes must call through to the super class's
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method.  If they do not, an exception will be
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thrown.</em></p>
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param savedInstanceState If the activity is being re-initialized after
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *     previously being shut down then this Bundle contains the data it most
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *     recently supplied in {@link #onSaveInstanceState}.  <b><i>Note: Otherwise it is null.</i></b>
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onStart
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onSaveInstanceState
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onRestoreInstanceState
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPostCreate
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onCreate(Bundle savedInstanceState) {
880162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn        if (DEBUG_LIFECYCLE) Slog.v(TAG, "onCreate " + this + ": " + savedInstanceState);
8812707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn        if (mLastNonConfigurationInstances != null) {
8822707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn            mAllLoaderManagers = mLastNonConfigurationInstances.loaders;
8832707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn        }
884dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell        if (mActivityInfo.parentActivityName != null) {
885dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell            if (mActionBar == null) {
886dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell                mEnableDefaultActionBarUp = true;
887dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell            } else {
888dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell                mActionBar.setDefaultDisplayHomeAsUpEnabled(true);
889dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell            }
890dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell        }
891b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (savedInstanceState != null) {
892b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            Parcelable p = savedInstanceState.getParcelable(FRAGMENTS_TAG);
893b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            mFragments.restoreAllState(p, mLastNonConfigurationInstances != null
894b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    ? mLastNonConfigurationInstances.fragments : null);
895b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
896b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mFragments.dispatchCreate();
897c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        getApplication().dispatchActivityCreated(this, savedInstanceState);
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The hook for {@link ActivityThread} to restore the state of this activity.
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Calls {@link #onSaveInstanceState(android.os.Bundle)} and
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #restoreManagedDialogs(android.os.Bundle)}.
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param savedInstanceState contains the saved state
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performRestoreInstanceState(Bundle savedInstanceState) {
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onRestoreInstanceState(savedInstanceState);
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        restoreManagedDialogs(savedInstanceState);
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This method is called after {@link #onStart} when the activity is
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * being re-initialized from a previously saved state, given here in
917305de9dbda4e40d60ca99dda307ccd5e3c23e0a0Mike LeBeau     * <var>savedInstanceState</var>.  Most implementations will simply use {@link #onCreate}
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to restore their state, but it is sometimes convenient to do it here
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * after all of the initialization has been done or to allow subclasses to
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * decide whether to use your default implementation.  The default
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method performs a restore of any view state that
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * had previously been frozen by {@link #onSaveInstanceState}.
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This method is called between {@link #onStart} and
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onPostCreate}.
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param savedInstanceState the data most recently supplied in {@link #onSaveInstanceState}.
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onCreate
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPostCreate
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onResume
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onSaveInstanceState
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onRestoreInstanceState(Bundle savedInstanceState) {
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mWindow != null) {
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Bundle windowState = savedInstanceState.getBundle(WINDOW_HIERARCHY_TAG);
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (windowState != null) {
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWindow.restoreHierarchyState(windowState);
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Restore the state of any saved managed dialogs.
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param savedInstanceState The bundle to restore from.
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void restoreManagedDialogs(Bundle savedInstanceState) {
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Bundle b = savedInstanceState.getBundle(SAVED_DIALOGS_TAG);
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (b == null) {
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int[] ids = b.getIntArray(SAVED_DIALOG_IDS_KEY);
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int numDialogs = ids.length;
9568ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        mManagedDialogs = new SparseArray<ManagedDialog>(numDialogs);
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < numDialogs; i++) {
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final Integer dialogId = ids[i];
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Bundle dialogState = b.getBundle(savedDialogKeyFor(dialogId));
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (dialogState != null) {
961e35c23514592efe07d54fdbed7e7ec0b717e8bbeRomain Guy                // Calling onRestoreInstanceState() below will invoke dispatchOnCreate
962e35c23514592efe07d54fdbed7e7ec0b717e8bbeRomain Guy                // so tell createDialog() not to do it, otherwise we get an exception
9638ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                final ManagedDialog md = new ManagedDialog();
9648ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                md.mArgs = b.getBundle(savedDialogArgsKeyFor(dialogId));
9658ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                md.mDialog = createDialog(dialogId, dialogState, md.mArgs);
9668ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                if (md.mDialog != null) {
9678ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                    mManagedDialogs.put(dialogId, md);
9688ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                    onPrepareDialog(dialogId, md.mDialog, md.mArgs);
9698ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                    md.mDialog.onRestoreInstanceState(dialogState);
9708ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                }
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9758ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    private Dialog createDialog(Integer dialogId, Bundle state, Bundle args) {
9768ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        final Dialog dialog = onCreateDialog(dialogId, args);
977764d5331d15c19162c938e617777b4bf15a6314dRomain Guy        if (dialog == null) {
9788ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            return null;
979764d5331d15c19162c938e617777b4bf15a6314dRomain Guy        }
9806de4aed1c67263269f83f579ec5b06263d173ef3Romain Guy        dialog.dispatchOnCreate(state);
981764d5331d15c19162c938e617777b4bf15a6314dRomain Guy        return dialog;
982764d5331d15c19162c938e617777b4bf15a6314dRomain Guy    }
983764d5331d15c19162c938e617777b4bf15a6314dRomain Guy
9848ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    private static String savedDialogKeyFor(int key) {
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return SAVED_DIALOG_KEY_PREFIX + key;
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9888ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    private static String savedDialogArgsKeyFor(int key) {
9898ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        return SAVED_DIALOG_ARGS_KEY_PREFIX + key;
9908ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    }
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when activity start-up is complete (after {@link #onStart}
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and {@link #onRestoreInstanceState} have been called).  Applications will
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * generally not implement this method; it is intended for system
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * classes to do final initialization after application code has run.
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Derived classes must call through to the super class's
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method.  If they do not, an exception will be
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thrown.</em></p>
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param savedInstanceState If the activity is being re-initialized after
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *     previously being shut down then this Bundle contains the data it most
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *     recently supplied in {@link #onSaveInstanceState}.  <b><i>Note: Otherwise it is null.</i></b>
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onCreate
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onPostCreate(Bundle savedInstanceState) {
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!isChild()) {
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTitleReady = true;
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            onTitleChanged(getTitle(), getTitleColor());
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called after {@link #onCreate} &mdash; or after {@link #onRestart} when
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the activity had been stopped, but is now again being displayed to the
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	 * user.  It will be followed by {@link #onResume}.
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Derived classes must call through to the super class's
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method.  If they do not, an exception will be
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thrown.</em></p>
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onCreate
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onStop
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onResume
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onStart() {
1029162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn        if (DEBUG_LIFECYCLE) Slog.v(TAG, "onStart " + this);
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
1031fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn
1032fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn        if (!mLoadersStarted) {
1033fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn            mLoadersStarted = true;
1034fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn            if (mLoaderManager != null) {
1035fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn                mLoaderManager.doStart();
1036fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn            } else if (!mCheckedForLoaderManager) {
103762bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                mLoaderManager = getLoaderManager(null, mLoadersStarted, false);
1038fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn            }
1039fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn            mCheckedForLoaderManager = true;
10402707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn        }
1041c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
1042c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        getApplication().dispatchActivityStarted(this);
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called after {@link #onStop} when the current activity is being
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * re-displayed to the user (the user has navigated back to it).  It will
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be followed by {@link #onStart} and then {@link #onResume}.
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>For activities that are using raw {@link Cursor} objects (instead of
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * creating them through
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #managedQuery(android.net.Uri , String[], String, String[], String)},
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this is usually the place
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * where the cursor should be requeried (because you had deactivated it in
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onStop}.
10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Derived classes must call through to the super class's
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method.  If they do not, an exception will be
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thrown.</em></p>
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onStop
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onStart
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onResume
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onRestart() {
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called after {@link #onRestoreInstanceState}, {@link #onRestart}, or
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onPause}, for your activity to start interacting with the user.
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is a good place to begin animations, open exclusive-access devices
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * (such as the camera), etc.
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Keep in mind that onResume is not the best indicator that your activity
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is visible to the user; a system window such as the keyguard may be in
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * front.  Use {@link #onWindowFocusChanged} to know for certain that your
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity is visible to the user (for example, to resume a game).
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Derived classes must call through to the super class's
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method.  If they do not, an exception will be
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thrown.</em></p>
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onRestoreInstanceState
10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onRestart
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPostResume
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPause
10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onResume() {
1090162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn        if (DEBUG_LIFECYCLE) Slog.v(TAG, "onResume " + this);
1091c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        getApplication().dispatchActivityResumed(this);
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when activity resume is complete (after {@link #onResume} has
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * been called). Applications will generally not implement this method;
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * it is intended for system classes to do final setup after application
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * resume code has run.
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Derived classes must call through to the super class's
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method.  If they do not, an exception will be
11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thrown.</em></p>
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onResume
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onPostResume() {
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Window win = getWindow();
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (win != null) win.makeActive();
111050efbed668a9410cdec51f7c8604fa44ed267fedAdam Powell        if (mActionBar != null) mActionBar.setShowHideAnimationEnabled(true);
11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is called for activities that set launchMode to "singleTop" in
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * their package, or if a client used the {@link Intent#FLAG_ACTIVITY_SINGLE_TOP}
11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * flag when calling {@link #startActivity}.  In either case, when the
11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity is re-launched while at the top of the activity stack instead
11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of a new instance of the activity being started, onNewIntent() will be
11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * called on the existing instance with the Intent that was used to
11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * re-launch it.
11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>An activity will always be paused before receiving a new intent, so
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * you can count on {@link #onResume} being called after this method.
11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note that {@link #getIntent} still returns the original Intent.  You
11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * can use {@link #setIntent} to update it to this new Intent.
11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param intent The new intent that was started for the activity.
11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getIntent
11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setIntent
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onResume
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onNewIntent(Intent intent) {
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The hook for {@link ActivityThread} to save the state of this activity.
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Calls {@link #onSaveInstanceState(android.os.Bundle)}
11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and {@link #saveManagedDialogs(android.os.Bundle)}.
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param outState The bundle to save the state to.
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performSaveInstanceState(Bundle outState) {
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onSaveInstanceState(outState);
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        saveManagedDialogs(outState);
1149162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn        if (DEBUG_LIFECYCLE) Slog.v(TAG, "onSaveInstanceState " + this + ": " + outState);
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called to retrieve per-instance state from an activity before being killed
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * so that the state can be restored in {@link #onCreate} or
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onRestoreInstanceState} (the {@link Bundle} populated by this method
11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will be passed to both).
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This method is called before an activity may be killed so that when it
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * comes back some time in the future it can restore its state.  For example,
11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if activity B is launched in front of activity A, and at some point activity
11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A is killed to reclaim resources, activity A will have a chance to save the
11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * current state of its user interface via this method so that when the user
11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returns to activity A, the state of the user interface can be restored
11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * via {@link #onCreate} or {@link #onRestoreInstanceState}.
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Do not confuse this method with activity lifecycle callbacks such as
11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onPause}, which is always called when an activity is being placed
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in the background or on its way to destruction, or {@link #onStop} which
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is called before destruction.  One example of when {@link #onPause} and
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onStop} is called and not this method is when a user navigates back
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * from activity B to activity A: there is no need to call {@link #onSaveInstanceState}
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * on B because that particular instance will never be restored, so the
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * system avoids calling it.  An example when {@link #onPause} is called and
11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not {@link #onSaveInstanceState} is when activity B is launched in front of activity A:
11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the system may avoid calling {@link #onSaveInstanceState} on activity A if it isn't
11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * killed during the lifetime of B since the state of the user interface of
11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A will stay intact.
11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The default implementation takes care of most of the UI per-instance
11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * state for you by calling {@link android.view.View#onSaveInstanceState()} on each
11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * view in the hierarchy that has an id, and by saving the id of the currently
11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * focused view (all of which is restored by the default implementation of
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onRestoreInstanceState}).  If you override this method to save additional
11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * information not captured by each individual view, you will likely want to
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * call through to the default implementation, otherwise be prepared to save
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * all of the state of each view yourself.
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>If called, this method will occur before {@link #onStop}.  There are
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * no guarantees about whether it will occur before or after {@link #onPause}.
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param outState Bundle in which to place your saved state.
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onCreate
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onRestoreInstanceState
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPause
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onSaveInstanceState(Bundle outState) {
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outState.putBundle(WINDOW_HIERARCHY_TAG, mWindow.saveHierarchyState());
1199b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        Parcelable p = mFragments.saveAllState();
1200b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (p != null) {
1201b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            outState.putParcelable(FRAGMENTS_TAG, p);
1202b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
1203c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        getApplication().dispatchActivitySaveInstanceState(this, outState);
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Save the state of any managed dialogs.
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param outState place to store the saved state.
12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void saveManagedDialogs(Bundle outState) {
12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mManagedDialogs == null) {
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int numDialogs = mManagedDialogs.size();
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (numDialogs == 0) {
12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Bundle dialogState = new Bundle();
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int[] ids = new int[mManagedDialogs.size()];
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // save each dialog's bundle, gather the ids
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < numDialogs; i++) {
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int key = mManagedDialogs.keyAt(i);
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ids[i] = key;
12298ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            final ManagedDialog md = mManagedDialogs.valueAt(i);
12308ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            dialogState.putBundle(savedDialogKeyFor(key), md.mDialog.onSaveInstanceState());
12318ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            if (md.mArgs != null) {
12328ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                dialogState.putBundle(savedDialogArgsKeyFor(key), md.mArgs);
12338ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            }
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dialogState.putIntArray(SAVED_DIALOG_IDS_KEY, ids);
12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outState.putBundle(SAVED_DIALOGS_TAG, dialogState);
12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called as part of the activity lifecycle when an activity is going into
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the background, but has not (yet) been killed.  The counterpart to
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onResume}.
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>When activity B is launched in front of activity A, this callback will
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be invoked on A.  B will not be created until A's {@link #onPause} returns,
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * so be sure to not do anything lengthy here.
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This callback is mostly used for saving any persistent state the
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity is editing, to present a "edit in place" model to the user and
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * making sure nothing is lost if there are not enough resources to start
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the new activity without first killing this one.  This is also a good
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * place to do things like stop animations and other things that consume a
125514a9310efd936149c82ecfcc37c7c8308968f67cPin Ting     * noticeable amount of CPU in order to make the switch to the next activity
12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * as fast as possible, or to close resources that are exclusive access
12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * such as the camera.
12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>In situations where the system needs more memory it may kill paused
12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * processes to reclaim resources.  Because of this, you should be sure
12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that all of your state is saved by the time you return from
12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this function.  In general {@link #onSaveInstanceState} is used to save
12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * per-instance state in the activity and this method is used to store
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * global persistent data (in content providers, files, etc.)
12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>After receiving this call you will usually receive a following call
12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to {@link #onStop} (after the next activity has been resumed and
12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * displayed), however in some cases there will be a direct call back to
12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onResume} without going through the stopped state.
12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Derived classes must call through to the super class's
12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method.  If they do not, an exception will be
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thrown.</em></p>
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onResume
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onSaveInstanceState
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onStop
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onPause() {
1280162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn        if (DEBUG_LIFECYCLE) Slog.v(TAG, "onPause " + this);
1281c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        getApplication().dispatchActivityPaused(this);
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called as part of the activity lifecycle when an activity is about to go
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * into the background as the result of user choice.  For example, when the
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * user presses the Home key, {@link #onUserLeaveHint} will be called, but
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * when an incoming phone call causes the in-call Activity to be automatically
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * brought to the foreground, {@link #onUserLeaveHint} will not be called on
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the activity being interrupted.  In cases when it is invoked, this method
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is called right before the activity's {@link #onPause} callback.
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This callback and {@link #onUserInteraction} are intended to help
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activities manage status bar notifications intelligently; specifically,
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for helping activities determine the proper time to cancel a notfication.
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onUserInteraction()
12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onUserLeaveHint() {
13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Generate a new thumbnail for this activity.  This method is called before
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * pausing the activity, and should draw into <var>outBitmap</var> the
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * imagery for the desired thumbnail in the dimensions of that bitmap.  It
13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * can use the given <var>canvas</var>, which is configured to draw into the
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * bitmap, for rendering if desired.
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13100aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn     * <p>The default implementation returns fails and does not draw a thumbnail;
13110aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn     * this will result in the platform creating its own thumbnail if needed.
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param outBitmap The bitmap to contain the thumbnail.
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param canvas Can be used to render into the bitmap.
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Return true if you have drawn into the bitmap; otherwise after
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         you return it will be filled with a default thumbnail.
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onCreateDescription
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onSaveInstanceState
13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPause
13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onCreateThumbnail(Bitmap outBitmap, Canvas canvas) {
13240aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        return false;
13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Generate a new description for this activity.  This method is called
13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * before pausing the activity and can, if desired, return some textual
13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * description of its current state to be displayed to the user.
13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The default implementation returns null, which will cause you to
13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * inherit the description from the previous activity.  If all activities
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * return null, generally the label of the top activity will be used as the
13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * description.
13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return A description of what the user is doing.  It should be short and
13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         sweet (only a few words).
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onCreateThumbnail
13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onSaveInstanceState
13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPause
13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public CharSequence onCreateDescription() {
13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when you are no longer visible to the user.  You will next
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * receive either {@link #onRestart}, {@link #onDestroy}, or nothing,
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * depending on later user activity.
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note that this method may never be called, in low memory situations
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * where the system does not have enough memory to keep your activity's
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * process running after its {@link #onPause} method is called.
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Derived classes must call through to the super class's
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method.  If they do not, an exception will be
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thrown.</em></p>
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onRestart
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onResume
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onSaveInstanceState
13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onDestroy
13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onStop() {
1367162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn        if (DEBUG_LIFECYCLE) Slog.v(TAG, "onStop " + this);
136850efbed668a9410cdec51f7c8604fa44ed267fedAdam Powell        if (mActionBar != null) mActionBar.setShowHideAnimationEnabled(false);
1369c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        getApplication().dispatchActivityStopped(this);
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Perform any final cleanup before an activity is destroyed.  This can
13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * happen either because the activity is finishing (someone called
13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #finish} on it, or because the system is temporarily destroying
13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this instance of the activity to save space.  You can distinguish
13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * between these two scenarios with the {@link #isFinishing} method.
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Note: do not count on this method being called as a place for
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * saving data! For example, if an activity is editing data in a content
13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * provider, those edits should be committed in either {@link #onPause} or
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onSaveInstanceState}, not here.</em> This method is usually implemented to
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * free resources like threads that are associated with an activity, so
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that a destroyed activity does not leave such things around while the
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * rest of its application is still running.  There are situations where
13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the system will simply kill the activity's hosting process without
13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * calling this method (or any others) in it, so it should not be used to
13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * do things that are intended to remain around after the process goes
13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * away.
13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Derived classes must call through to the super class's
13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method.  If they do not, an exception will be
13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thrown.</em></p>
13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPause
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onStop
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #finish
13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isFinishing
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onDestroy() {
1402162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn        if (DEBUG_LIFECYCLE) Slog.v(TAG, "onDestroy " + this);
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // dismiss any dialogs we are managing.
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mManagedDialogs != null) {
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int numDialogs = mManagedDialogs.size();
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i = 0; i < numDialogs; i++) {
14098ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                final ManagedDialog md = mManagedDialogs.valueAt(i);
14108ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                if (md.mDialog.isShowing()) {
14118ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                    md.mDialog.dismiss();
14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14148ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            mManagedDialogs = null;
14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // close any cursors we are managing.
14182f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki        synchronized (mManagedCursors) {
14192f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki            int numCursors = mManagedCursors.size();
14202f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki            for (int i = 0; i < numCursors; i++) {
14212f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                ManagedCursor c = mManagedCursors.get(i);
14222f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                if (c != null) {
14232f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                    c.mCursor.close();
14242f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                }
14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14262f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki            mManagedCursors.clear();
14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14284986044fd3bce877247e425374b47967775081a8Amith Yamasani
14294986044fd3bce877247e425374b47967775081a8Amith Yamasani        // Close any open search dialog
14304986044fd3bce877247e425374b47967775081a8Amith Yamasani        if (mSearchManager != null) {
14314986044fd3bce877247e425374b47967775081a8Amith Yamasani            mSearchManager.stopSearch();
14324986044fd3bce877247e425374b47967775081a8Amith Yamasani        }
1433c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
1434c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        getApplication().dispatchActivityDestroyed(this);
14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called by the system when the device configuration changes while your
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity is running.  Note that this will <em>only</em> be called if
14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * you have selected configurations you would like to handle with the
14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.R.attr#configChanges} attribute in your manifest.  If
14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * any configuration change occurs that is not selected to be reported
14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * by that attribute, then instead of reporting it the system will stop
14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and restart the activity (to have it launched with the new
14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * configuration).
14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>At the time that this function has been called, your Resources
14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * object will have been updated to return resource values matching the
14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * new configuration.
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param newConfig The new device configuration.
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onConfigurationChanged(Configuration newConfig) {
1454162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn        if (DEBUG_LIFECYCLE) Slog.v(TAG, "onConfigurationChanged " + this + ": " + newConfig);
14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
1456444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert
14579d0718042f7c0a50d825c621f82ce9a92071f07aDianne Hackborn        mFragments.dispatchConfigurationChanged(newConfig);
14589d0718042f7c0a50d825c621f82ce9a92071f07aDianne Hackborn
14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mWindow != null) {
14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Pass the configuration changed event to the window
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindow.onConfigurationChanged(newConfig);
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
146345c0b1954d7dfa6e2590ed76b915a98ae971414cAdam Powell
146445c0b1954d7dfa6e2590ed76b915a98ae971414cAdam Powell        if (mActionBar != null) {
146545c0b1954d7dfa6e2590ed76b915a98ae971414cAdam Powell            // Do this last; the action bar will need to access
146645c0b1954d7dfa6e2590ed76b915a98ae971414cAdam Powell            // view changes from above.
146745c0b1954d7dfa6e2590ed76b915a98ae971414cAdam Powell            mActionBar.onConfigurationChanged(newConfig);
146845c0b1954d7dfa6e2590ed76b915a98ae971414cAdam Powell        }
14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If this activity is being destroyed because it can not handle a
14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * configuration parameter being changed (and thus its
14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onConfigurationChanged(Configuration)} method is
14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <em>not</em> being called), then you can use this method to discover
14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the set of changes that have occurred while in the process of being
14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * destroyed.  Note that there is no guarantee that these will be
14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * accurate (other changes could have happened at any time), so you should
14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * only use this as an optimization hint.
14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns a bit field of the configuration parameters that are
14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * changing, as defined by the {@link android.content.res.Configuration}
14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * class.
14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getChangingConfigurations() {
14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mConfigChangeFlags;
14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the non-configuration instance data that was previously
14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returned by {@link #onRetainNonConfigurationInstance()}.  This will
14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be available from the initial {@link #onCreate} and
14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onStart} calls to the new instance, allowing you to extract
14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * any useful dynamic state from the previous instance.
14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note that the data you retrieve here should <em>only</em> be used
14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * as an optimization for handling configuration changes.  You should always
14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be able to handle getting a null pointer back, and an activity must
14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * still be able to restore itself to its previous state (through the
15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * normal {@link #onSaveInstanceState(Bundle)} mechanism) even if this
15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * function returns null.
15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the object previously returned by
15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onRetainNonConfigurationInstance()}.
1505271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     *
1506271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * @deprecated Use the new {@link Fragment} API
1507271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * {@link Fragment#setRetainInstance(boolean)} instead; this is also
1508271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * available on older platforms through the Android compatibility package.
15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
15109567a66a5e6f49dd8495fb5f6e2efb9f32e84b35Dianne Hackborn    @Deprecated
15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Object getLastNonConfigurationInstance() {
1512b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return mLastNonConfigurationInstances != null
1513b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                ? mLastNonConfigurationInstances.activity : null;
15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called by the system, as part of destroying an
15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity due to a configuration change, when it is known that a new
15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * instance will immediately be created for the new configuration.  You
15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * can return any object you like here, including the activity instance
15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * itself, which can later be retrieved by calling
15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getLastNonConfigurationInstance()} in the new activity
15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * instance.
15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1525291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * <em>If you are targeting {@link android.os.Build.VERSION_CODES#HONEYCOMB}
1526291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * or later, consider instead using a {@link Fragment} with
1527291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * {@link Fragment#setRetainInstance(boolean)
1528291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * Fragment.setRetainInstance(boolean}.</em>
1529291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     *
15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This function is called purely as an optimization, and you must
15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not rely on it being called.  When it is called, a number of guarantees
15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will be made to help optimize configuration switching:
15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <ul>
15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li> The function will be called between {@link #onStop} and
15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onDestroy}.
15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li> A new instance of the activity will <em>always</em> be immediately
1537ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn     * created after this one's {@link #onDestroy()} is called.  In particular,
1538ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn     * <em>no</em> messages will be dispatched during this time (when the returned
1539ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn     * object does not have an activity to be associated with).
15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li> The object you return here will <em>always</em> be available from
15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the {@link #getLastNonConfigurationInstance()} method of the following
15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity instance as described there.
15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </ul>
15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>These guarantees are designed so that an activity can use this API
15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to propagate extensive state from the old to new activity instance, from
15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * loaded bitmaps, to network connections, to evenly actively running
15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * threads.  Note that you should <em>not</em> propagate any data that
15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * may change based on the configuration, including any data loaded from
15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * resources such as strings, layouts, or drawables.
15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1552ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn     * <p>The guarantee of no message handling during the switch to the next
1553ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn     * activity simplifies use with active objects.  For example if your retained
1554ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn     * state is an {@link android.os.AsyncTask} you are guaranteed that its
1555ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn     * call back functions (like {@link android.os.AsyncTask#onPostExecute}) will
1556ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn     * not be called from the call here until you execute the next instance's
1557ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn     * {@link #onCreate(Bundle)}.  (Note however that there is of course no such
1558ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn     * guarantee for {@link android.os.AsyncTask#doInBackground} since that is
1559ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn     * running in a separate thread.)
1560ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn     *
15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Return any Object holding the desired state to propagate to the
15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * next activity instance.
1563271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     *
1564271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * @deprecated Use the new {@link Fragment} API
1565271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * {@link Fragment#setRetainInstance(boolean)} instead; this is also
1566271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * available on older platforms through the Android compatibility package.
15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Object onRetainNonConfigurationInstance() {
15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the non-configuration instance data that was previously
15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returned by {@link #onRetainNonConfigurationChildInstances()}.  This will
15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be available from the initial {@link #onCreate} and
15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onStart} calls to the new instance, allowing you to extract
15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * any useful dynamic state from the previous instance.
15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note that the data you retrieve here should <em>only</em> be used
15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * as an optimization for handling configuration changes.  You should always
15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be able to handle getting a null pointer back, and an activity must
15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * still be able to restore itself to its previous state (through the
15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * normal {@link #onSaveInstanceState(Bundle)} mechanism) even if this
15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * function returns null.
15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the object previously returned by
15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onRetainNonConfigurationChildInstances()}
15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1589b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    HashMap<String, Object> getLastNonConfigurationChildInstances() {
1590b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return mLastNonConfigurationInstances != null
1591b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                ? mLastNonConfigurationInstances.children : null;
15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This method is similar to {@link #onRetainNonConfigurationInstance()} except that
15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * it should return either a mapping from  child activity id strings to arbitrary objects,
15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * or null.  This method is intended to be used by Activity framework subclasses that control a
15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * set of child activities, such as ActivityGroup.  The same guarantees and restrictions apply
15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * as for {@link #onRetainNonConfigurationInstance()}.  The default implementation returns null.
16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    HashMap<String,Object> onRetainNonConfigurationChildInstances() {
16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
16039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1605b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    NonConfigurationInstances retainNonConfigurationInstances() {
1606b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        Object activity = onRetainNonConfigurationInstance();
1607b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        HashMap<String, Object> children = onRetainNonConfigurationChildInstances();
1608b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        ArrayList<Fragment> fragments = mFragments.retainNonConfig();
16092707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn        boolean retainLoaders = false;
16102707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn        if (mAllLoaderManagers != null) {
16115e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn            // prune out any loader managers that were already stopped and so
16122707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn            // have nothing useful to retain.
161362bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            LoaderManagerImpl loaders[] = new LoaderManagerImpl[mAllLoaderManagers.size()];
161462bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            mAllLoaderManagers.values().toArray(loaders);
161562bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            if (loaders != null) {
161662bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                for (int i=0; i<loaders.length; i++) {
161762bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                    LoaderManagerImpl lm = loaders[i];
161862bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                    if (lm.mRetaining) {
161962bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                        retainLoaders = true;
162062bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                    } else {
162162bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                        lm.doDestroy();
162262bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                        mAllLoaderManagers.remove(lm.mWho);
162362bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                    }
16242707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn                }
16252707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn            }
16262707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn        }
16272707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn        if (activity == null && children == null && fragments == null && !retainLoaders) {
1628b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            return null;
1629b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
1630b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
1631b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        NonConfigurationInstances nci = new NonConfigurationInstances();
1632b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        nci.activity = activity;
1633b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        nci.children = children;
1634b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        nci.fragments = fragments;
16352707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn        nci.loaders = mAllLoaderManagers;
1636b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return nci;
1637b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
1638c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onLowMemory() {
1640162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn        if (DEBUG_LIFECYCLE) Slog.v(TAG, "onLowMemory " + this);
16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
16429d0718042f7c0a50d825c621f82ce9a92071f07aDianne Hackborn        mFragments.dispatchLowMemory();
16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1644c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
1645c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    public void onTrimMemory(int level) {
1646162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn        if (DEBUG_LIFECYCLE) Slog.v(TAG, "onTrimMemory " + this + ": " + level);
1647c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        mCalled = true;
1648c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        mFragments.dispatchTrimMemory(level);
1649c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    }
1650c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1652b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * Return the FragmentManager for interacting with fragments associated
1653b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * with this activity.
1654b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     */
1655b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    public FragmentManager getFragmentManager() {
1656b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        return mFragments;
1657b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    }
1658b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn
165962bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    void invalidateFragment(String who) {
16605e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn        //Log.v(TAG, "invalidateFragmentIndex: index=" + index);
16619e14e9f33a66b864b98c6ff9517988bafbca3301Dianne Hackborn        if (mAllLoaderManagers != null) {
166262bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            LoaderManagerImpl lm = mAllLoaderManagers.get(who);
1663d04ad541def2bca8fc2d810514ee15ab97893d35Dianne Hackborn            if (lm != null && !lm.mRetaining) {
16645e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn                lm.doDestroy();
166562bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                mAllLoaderManagers.remove(who);
16665e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn            }
16679e14e9f33a66b864b98c6ff9517988bafbca3301Dianne Hackborn        }
16689e14e9f33a66b864b98c6ff9517988bafbca3301Dianne Hackborn    }
16699e14e9f33a66b864b98c6ff9517988bafbca3301Dianne Hackborn
16702dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    /**
1671c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn     * Called when a Fragment is being attached to this activity, immediately
1672c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn     * after the call to its {@link Fragment#onAttach Fragment.onAttach()}
1673c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn     * method and before {@link Fragment#onCreate Fragment.onCreate()}.
1674c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn     */
1675c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn    public void onAttachFragment(Fragment fragment) {
1676c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn    }
1677c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn
1678c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn    /**
16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Wrapper around
16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link ContentResolver#query(android.net.Uri , String[], String, String[], String)}
16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that gives the resulting {@link Cursor} to call
16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #startManagingCursor} so that the activity will manage its
16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * lifecycle for you.
16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1685291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * <em>If you are targeting {@link android.os.Build.VERSION_CODES#HONEYCOMB}
1686291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * or later, consider instead using {@link LoaderManager} instead, available
1687291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * via {@link #getLoaderManager()}.</em>
1688291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     *
16898ef6970cf5b779a5a69502cb07fd94d9190bccfdJoe Fernandez     * <p><strong>Warning:</strong> Do not call {@link Cursor#close()} on a cursor obtained using
16908ef6970cf5b779a5a69502cb07fd94d9190bccfdJoe Fernandez     * this method, because the activity will do that for you at the appropriate time. However, if
16918ef6970cf5b779a5a69502cb07fd94d9190bccfdJoe Fernandez     * you call {@link #stopManagingCursor} on a cursor from a managed query, the system <em>will
16928ef6970cf5b779a5a69502cb07fd94d9190bccfdJoe Fernandez     * not</em> automatically close the cursor and, in that case, you must call
16938ef6970cf5b779a5a69502cb07fd94d9190bccfdJoe Fernandez     * {@link Cursor#close()}.</p>
16948ef6970cf5b779a5a69502cb07fd94d9190bccfdJoe Fernandez     *
16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param uri The URI of the content provider to query.
16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param projection List of columns to return.
16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param selection SQL WHERE clause.
16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param sortOrder SQL ORDER BY clause.
16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The Cursor that was returned by query().
17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see ContentResolver#query(android.net.Uri , String[], String, String[], String)
17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startManagingCursor
17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
17056ed50de6d1e5e27d11304cce226fefeee3105bd7Jason parks     *
17066ed50de6d1e5e27d11304cce226fefeee3105bd7Jason parks     * @deprecated Use {@link CursorLoader} instead.
17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
17086ed50de6d1e5e27d11304cce226fefeee3105bd7Jason parks    @Deprecated
1709291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn    public final Cursor managedQuery(Uri uri, String[] projection, String selection,
1710291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn            String sortOrder) {
17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Cursor c = getContentResolver().query(uri, projection, selection, null, sortOrder);
17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (c != null) {
17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            startManagingCursor(c);
17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return c;
17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Wrapper around
17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link ContentResolver#query(android.net.Uri , String[], String, String[], String)}
17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that gives the resulting {@link Cursor} to call
17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #startManagingCursor} so that the activity will manage its
17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * lifecycle for you.
17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1725291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * <em>If you are targeting {@link android.os.Build.VERSION_CODES#HONEYCOMB}
1726291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * or later, consider instead using {@link LoaderManager} instead, available
1727291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * via {@link #getLoaderManager()}.</em>
1728291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     *
17298ef6970cf5b779a5a69502cb07fd94d9190bccfdJoe Fernandez     * <p><strong>Warning:</strong> Do not call {@link Cursor#close()} on a cursor obtained using
17308ef6970cf5b779a5a69502cb07fd94d9190bccfdJoe Fernandez     * this method, because the activity will do that for you at the appropriate time. However, if
17318ef6970cf5b779a5a69502cb07fd94d9190bccfdJoe Fernandez     * you call {@link #stopManagingCursor} on a cursor from a managed query, the system <em>will
17328ef6970cf5b779a5a69502cb07fd94d9190bccfdJoe Fernandez     * not</em> automatically close the cursor and, in that case, you must call
17338ef6970cf5b779a5a69502cb07fd94d9190bccfdJoe Fernandez     * {@link Cursor#close()}.</p>
17348ef6970cf5b779a5a69502cb07fd94d9190bccfdJoe Fernandez     *
17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param uri The URI of the content provider to query.
17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param projection List of columns to return.
17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param selection SQL WHERE clause.
17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param selectionArgs The arguments to selection, if any ?s are pesent
17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param sortOrder SQL ORDER BY clause.
17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The Cursor that was returned by query().
17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see ContentResolver#query(android.net.Uri , String[], String, String[], String)
17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startManagingCursor
17456ed50de6d1e5e27d11304cce226fefeee3105bd7Jason parks     *
17466ed50de6d1e5e27d11304cce226fefeee3105bd7Jason parks     * @deprecated Use {@link CursorLoader} instead.
17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
17486ed50de6d1e5e27d11304cce226fefeee3105bd7Jason parks    @Deprecated
1749291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn    public final Cursor managedQuery(Uri uri, String[] projection, String selection,
1750291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn            String[] selectionArgs, String sortOrder) {
17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Cursor c = getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder);
17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (c != null) {
17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            startManagingCursor(c);
17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return c;
17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This method allows the activity to take care of managing the given
17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link Cursor}'s lifecycle for you based on the activity's lifecycle.
17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * That is, when the activity is stopped it will automatically call
17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link Cursor#deactivate} on the given Cursor, and when it is later restarted
17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * it will call {@link Cursor#requery} for you.  When the activity is
17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * destroyed, all managed Cursors will be closed automatically.
17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1766291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * <em>If you are targeting {@link android.os.Build.VERSION_CODES#HONEYCOMB}
1767291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * or later, consider instead using {@link LoaderManager} instead, available
1768291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * via {@link #getLoaderManager()}.</em>
1769291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     *
17708ef6970cf5b779a5a69502cb07fd94d9190bccfdJoe Fernandez     * <p><strong>Warning:</strong> Do not call {@link Cursor#close()} on cursor obtained from
17718ef6970cf5b779a5a69502cb07fd94d9190bccfdJoe Fernandez     * {@link #managedQuery}, because the activity will do that for you at the appropriate time.
17728ef6970cf5b779a5a69502cb07fd94d9190bccfdJoe Fernandez     * However, if you call {@link #stopManagingCursor} on a cursor from a managed query, the system
17738ef6970cf5b779a5a69502cb07fd94d9190bccfdJoe Fernandez     * <em>will not</em> automatically close the cursor and, in that case, you must call
17748ef6970cf5b779a5a69502cb07fd94d9190bccfdJoe Fernandez     * {@link Cursor#close()}.</p>
17758ef6970cf5b779a5a69502cb07fd94d9190bccfdJoe Fernandez     *
17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param c The Cursor to be managed.
17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #managedQuery(android.net.Uri , String[], String, String[], String)
17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #stopManagingCursor
1780271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     *
1781271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * @deprecated Use the new {@link android.content.CursorLoader} class with
1782271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * {@link LoaderManager} instead; this is also
1783271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * available on older platforms through the Android compatibility package.
17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
17856ed50de6d1e5e27d11304cce226fefeee3105bd7Jason parks    @Deprecated
17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startManagingCursor(Cursor c) {
17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mManagedCursors) {
17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mManagedCursors.add(new ManagedCursor(c));
17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Given a Cursor that was previously given to
17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #startManagingCursor}, stop the activity's management of that
17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * cursor.
17969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
17978ef6970cf5b779a5a69502cb07fd94d9190bccfdJoe Fernandez     * <p><strong>Warning:</strong> After calling this method on a cursor from a managed query,
17988ef6970cf5b779a5a69502cb07fd94d9190bccfdJoe Fernandez     * the system <em>will not</em> automatically close the cursor and you must call
17998ef6970cf5b779a5a69502cb07fd94d9190bccfdJoe Fernandez     * {@link Cursor#close()}.</p>
18008ef6970cf5b779a5a69502cb07fd94d9190bccfdJoe Fernandez     *
18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param c The Cursor that was being managed.
18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startManagingCursor
1804271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     *
1805271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * @deprecated Use the new {@link android.content.CursorLoader} class with
1806271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * {@link LoaderManager} instead; this is also
1807271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * available on older platforms through the Android compatibility package.
18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
18096ed50de6d1e5e27d11304cce226fefeee3105bd7Jason parks    @Deprecated
18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void stopManagingCursor(Cursor c) {
18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mManagedCursors) {
18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = mManagedCursors.size();
18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=0; i<N; i++) {
18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ManagedCursor mc = mManagedCursors.get(i);
18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mc.mCursor == c) {
18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mManagedCursors.remove(i);
18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
18243c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn     * @deprecated As of {@link android.os.Build.VERSION_CODES#GINGERBREAD}
18253c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn     * this is a no-op.
18264f3867e3ce92101224ad79b8f2ff446bb4f99108Dianne Hackborn     * @hide
18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1828d3efa3924407da6d38aa5931ac29aa088d9eb986Dianne Hackborn    @Deprecated
18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setPersistent(boolean isPersistent) {
18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Finds a view that was identified by the id attribute from the XML that
18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * was processed in {@link #onCreate}.
18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The view if found or null otherwise.
18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public View findViewById(int id) {
18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getWindow().findViewById(id);
18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
184133b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell
184233b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell    /**
184333b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell     * Retrieve a reference to this activity's ActionBar.
184442c0fe86521af507f597af6159f63879cb5be73eAdam Powell     *
184533b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell     * @return The Activity's ActionBar, or null if it does not have one.
184633b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell     */
184733b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell    public ActionBar getActionBar() {
184842c0fe86521af507f597af6159f63879cb5be73eAdam Powell        initActionBar();
184933b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell        return mActionBar;
185033b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell    }
185133b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell
18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
185333b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell     * Creates a new ActionBar, locates the inflated ActionBarView,
185433b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell     * initializes the ActionBar with the view, and sets mActionBar.
185533b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell     */
185633b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell    private void initActionBar() {
185789e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell        Window window = getWindow();
1858a593d9852f3807305763c3f1fe1ac5c59f1fef92Adam Powell
1859a593d9852f3807305763c3f1fe1ac5c59f1fef92Adam Powell        // Initializing the window decor can change window feature flags.
1860a593d9852f3807305763c3f1fe1ac5c59f1fef92Adam Powell        // Make sure that we have the correct set before performing the test below.
1861a593d9852f3807305763c3f1fe1ac5c59f1fef92Adam Powell        window.getDecorView();
1862a593d9852f3807305763c3f1fe1ac5c59f1fef92Adam Powell
18639b4c804b9856d732e461bc7505d40aa4ea1f7bf7Adam Powell        if (isChild() || !window.hasFeature(Window.FEATURE_ACTION_BAR) || mActionBar != null) {
186433b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell            return;
186533b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell        }
186633b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell
1867661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell        mActionBar = new ActionBarImpl(this);
1868dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell        mActionBar.setDefaultDisplayHomeAsUpEnabled(mEnableDefaultActionBarUp);
186933b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell    }
187033b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell
187133b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell    /**
18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the activity content from a layout resource.  The resource will be
18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * inflated, adding all top-level views to the activity.
1874482b34a6f8aebe620cf815cdc689726ef5cf437eRomain Guy     *
18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param layoutResID Resource ID to be inflated.
1876482b34a6f8aebe620cf815cdc689726ef5cf437eRomain Guy     *
1877482b34a6f8aebe620cf815cdc689726ef5cf437eRomain Guy     * @see #setContentView(android.view.View)
1878482b34a6f8aebe620cf815cdc689726ef5cf437eRomain Guy     * @see #setContentView(android.view.View, android.view.ViewGroup.LayoutParams)
18799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
18809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setContentView(int layoutResID) {
18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setContentView(layoutResID);
188233b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell        initActionBar();
18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
18869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the activity content to an explicit view.  This view is placed
18879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * directly into the activity's view hierarchy.  It can itself be a complex
1888482b34a6f8aebe620cf815cdc689726ef5cf437eRomain Guy     * view hierarchy.  When calling this method, the layout parameters of the
1889482b34a6f8aebe620cf815cdc689726ef5cf437eRomain Guy     * specified view are ignored.  Both the width and the height of the view are
1890482b34a6f8aebe620cf815cdc689726ef5cf437eRomain Guy     * set by default to {@link ViewGroup.LayoutParams#MATCH_PARENT}. To use
1891482b34a6f8aebe620cf815cdc689726ef5cf437eRomain Guy     * your own layout parameters, invoke
1892482b34a6f8aebe620cf815cdc689726ef5cf437eRomain Guy     * {@link #setContentView(android.view.View, android.view.ViewGroup.LayoutParams)}
1893482b34a6f8aebe620cf815cdc689726ef5cf437eRomain Guy     * instead.
18949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param view The desired content to display.
1896482b34a6f8aebe620cf815cdc689726ef5cf437eRomain Guy     *
1897482b34a6f8aebe620cf815cdc689726ef5cf437eRomain Guy     * @see #setContentView(int)
1898482b34a6f8aebe620cf815cdc689726ef5cf437eRomain Guy     * @see #setContentView(android.view.View, android.view.ViewGroup.LayoutParams)
18999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
19009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setContentView(View view) {
19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setContentView(view);
190233b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell        initActionBar();
19039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the activity content to an explicit view.  This view is placed
19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * directly into the activity's view hierarchy.  It can itself be a complex
1908482b34a6f8aebe620cf815cdc689726ef5cf437eRomain Guy     * view hierarchy.
19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param view The desired content to display.
19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param params Layout parameters for the view.
1912482b34a6f8aebe620cf815cdc689726ef5cf437eRomain Guy     *
1913482b34a6f8aebe620cf815cdc689726ef5cf437eRomain Guy     * @see #setContentView(android.view.View)
1914482b34a6f8aebe620cf815cdc689726ef5cf437eRomain Guy     * @see #setContentView(int)
19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
19169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setContentView(View view, ViewGroup.LayoutParams params) {
19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setContentView(view, params);
191833b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell        initActionBar();
19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Add an additional content view to the activity.  Added after any existing
19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ones in the activity -- existing views are NOT removed.
19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param view The desired content to display.
19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param params Layout parameters for the view.
19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
19289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void addContentView(View view, ViewGroup.LayoutParams params) {
19299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().addContentView(view, params);
193033b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell        initActionBar();
19319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1934cfaf8878de83b6bb7a24aee3c240259f428e6e4aDianne Hackborn     * Sets whether this activity is finished when touched outside its window's
1935cfaf8878de83b6bb7a24aee3c240259f428e6e4aDianne Hackborn     * bounds.
1936cfaf8878de83b6bb7a24aee3c240259f428e6e4aDianne Hackborn     */
1937cfaf8878de83b6bb7a24aee3c240259f428e6e4aDianne Hackborn    public void setFinishOnTouchOutside(boolean finish) {
1938cfaf8878de83b6bb7a24aee3c240259f428e6e4aDianne Hackborn        mWindow.setCloseOnTouchOutside(finish);
1939cfaf8878de83b6bb7a24aee3c240259f428e6e4aDianne Hackborn    }
1940cfaf8878de83b6bb7a24aee3c240259f428e6e4aDianne Hackborn
1941cfaf8878de83b6bb7a24aee3c240259f428e6e4aDianne Hackborn    /**
19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setDefaultKeyMode} to turn off default handling of
19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * keys.
19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
19459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setDefaultKeyMode
19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
19479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public final int DEFAULT_KEYS_DISABLE = 0;
19489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setDefaultKeyMode} to launch the dialer during default
19509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * key handling.
19519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setDefaultKeyMode
19539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
19549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public final int DEFAULT_KEYS_DIALER = 1;
19559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setDefaultKeyMode} to execute a menu shortcut in
19579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * default key handling.
19589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>That is, the user does not need to hold down the menu key to execute menu shortcuts.
19609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
19619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setDefaultKeyMode
19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public final int DEFAULT_KEYS_SHORTCUT = 2;
19649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
19659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setDefaultKeyMode} to specify that unhandled keystrokes
19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will start an application-defined search.  (If the application or activity does not
19679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * actually define a search, the the keys will be ignored.)
19689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
19699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>See {@link android.app.SearchManager android.app.SearchManager} for more details.
19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setDefaultKeyMode
19729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
19739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public final int DEFAULT_KEYS_SEARCH_LOCAL = 3;
19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
19769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setDefaultKeyMode} to specify that unhandled keystrokes
19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will start a global search (typically web search, but some platforms may define alternate
19789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * methods for global search)
19799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>See {@link android.app.SearchManager android.app.SearchManager} for more details.
19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setDefaultKeyMode
19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public final int DEFAULT_KEYS_SEARCH_GLOBAL = 4;
19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Select the default key handling for this activity.  This controls what
19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will happen to key events that are not otherwise handled.  The default
19899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * mode ({@link #DEFAULT_KEYS_DISABLE}) will simply drop them on the
19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * floor. Other modes allow you to launch the dialer
19919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ({@link #DEFAULT_KEYS_DIALER}), execute a shortcut in your options
19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * menu without requiring the menu key be held down
19939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ({@link #DEFAULT_KEYS_SHORTCUT}), or launch a search ({@link #DEFAULT_KEYS_SEARCH_LOCAL}
19949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and {@link #DEFAULT_KEYS_SEARCH_GLOBAL}).
19959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
19969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note that the mode selected here does not impact the default
19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * handling of system keys, such as the "back" and "menu" keys, and your
19989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity and its views always get a first chance to receive and handle
19999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * all application keys.
20009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param mode The desired default key mode constant.
20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #DEFAULT_KEYS_DISABLE
20049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #DEFAULT_KEYS_DIALER
20059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #DEFAULT_KEYS_SHORTCUT
20069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #DEFAULT_KEYS_SEARCH_LOCAL
20079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #DEFAULT_KEYS_SEARCH_GLOBAL
20089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onKeyDown
20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
20109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setDefaultKeyMode(int mode) {
20119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDefaultKeyMode = mode;
20129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Some modes use a SpannableStringBuilder to track & dispatch input events
20149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // This list must remain in sync with the switch in onKeyDown()
20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (mode) {
20169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case DEFAULT_KEYS_DISABLE:
20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case DEFAULT_KEYS_SHORTCUT:
20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDefaultKeySsb = null;      // not used in these modes
20199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
20209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case DEFAULT_KEYS_DIALER:
20219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case DEFAULT_KEYS_SEARCH_LOCAL:
20229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case DEFAULT_KEYS_SEARCH_GLOBAL:
20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDefaultKeySsb = new SpannableStringBuilder();
20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Selection.setSelection(mDefaultKeySsb,0);
20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        default:
20279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException();
20289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when a key was pressed down and not handled by any of the views
20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * inside of the activity. So, for example, key presses while the cursor
20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is inside a TextView will not trigger the event (unless it is a navigation
20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to another object) because TextView handles its own key presses.
20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>If the focused view didn't want this event, this method is called.
20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
20398d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn     * <p>The default implementation takes care of {@link KeyEvent#KEYCODE_BACK}
20408d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn     * by calling {@link #onBackPressed()}, though the behavior varies based
20418d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn     * on the application compatibility mode: for
20428d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn     * {@link android.os.Build.VERSION_CODES#ECLAIR} or later applications,
20438d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn     * it will set up the dispatch to call {@link #onKeyUp} where the action
20448d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn     * will be performed; for earlier applications, it will perform the
20458d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn     * action immediately in on-down, as those versions of the platform
20468d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn     * behaved.
20478d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn     *
20488d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn     * <p>Other additional default key handling may be performed
204983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * if configured with {@link #setDefaultKeyMode}.
20509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
20519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Return <code>true</code> to prevent this event from being propagated
20529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * further, or <code>false</code> to indicate that you have not handled
20539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this event and it should continue to be propagated.
20549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onKeyUp
20559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.view.KeyEvent
20569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
20579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onKeyDown(int keyCode, KeyEvent event)  {
205883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        if (keyCode == KeyEvent.KEYCODE_BACK) {
20598d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn            if (getApplicationInfo().targetSdkVersion
20608d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                    >= Build.VERSION_CODES.ECLAIR) {
20618d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                event.startTracking();
20628d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn            } else {
20638d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                onBackPressed();
20648d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn            }
20659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mDefaultKeyMode == DEFAULT_KEYS_DISABLE) {
20699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
20709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (mDefaultKeyMode == DEFAULT_KEYS_SHORTCUT) {
207183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            if (getWindow().performPanelShortcut(Window.FEATURE_OPTIONS_PANEL,
207283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                    keyCode, event, Menu.FLAG_ALWAYS_PERFORM_CLOSE)) {
207383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                return true;
207483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            }
207583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            return false;
20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Common code for DEFAULT_KEYS_DIALER & DEFAULT_KEYS_SEARCH_*
20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean clearSpannable = false;
20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean handled;
20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((event.getRepeatCount() != 0) || event.isSystem()) {
20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                clearSpannable = true;
20829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                handled = false;
20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
208483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                handled = TextKeyListener.getInstance().onKeyDown(
208583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                        null, mDefaultKeySsb, keyCode, event);
20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (handled && mDefaultKeySsb.length() > 0) {
20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // something useable has been typed - dispatch it now.
20889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final String str = mDefaultKeySsb.toString();
20909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    clearSpannable = true;
20919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    switch (mDefaultKeyMode) {
20939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    case DEFAULT_KEYS_DIALER:
20949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Intent intent = new Intent(Intent.ACTION_DIAL,  Uri.parse("tel:" + str));
20959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        startActivity(intent);
20979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
20989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    case DEFAULT_KEYS_SEARCH_LOCAL:
20999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        startSearch(str, false, null, false);
21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
21019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    case DEFAULT_KEYS_SEARCH_GLOBAL:
21029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        startSearch(str, false, null, true);
21039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
21049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
21059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (clearSpannable) {
21089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mDefaultKeySsb.clear();
21099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mDefaultKeySsb.clearSpans();
21109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Selection.setSelection(mDefaultKeySsb,0);
21119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return handled;
21139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
211783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * Default implementation of {@link KeyEvent.Callback#onKeyLongPress(int, KeyEvent)
211883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * KeyEvent.Callback.onKeyLongPress()}: always returns false (doesn't handle
211983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * the event).
212083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
212183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public boolean onKeyLongPress(int keyCode, KeyEvent event) {
212283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        return false;
212383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    }
212483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
212583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when a key was released and not handled by any of the views
21279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * inside of the activity. So, for example, key presses while the cursor
21289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is inside a TextView will not trigger the event (unless it is a navigation
21299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to another object) because TextView handles its own key presses.
21309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
213183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * <p>The default implementation handles KEYCODE_BACK to stop the activity
213283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * and go back.
213383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     *
21349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Return <code>true</code> to prevent this event from being propagated
21359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * further, or <code>false</code> to indicate that you have not handled
21369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this event and it should continue to be propagated.
21379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onKeyDown
21389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see KeyEvent
21399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
21409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onKeyUp(int keyCode, KeyEvent event) {
21418d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn        if (getApplicationInfo().targetSdkVersion
21428d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                >= Build.VERSION_CODES.ECLAIR) {
21438d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn            if (keyCode == KeyEvent.KEYCODE_BACK && event.isTracking()
21448d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                    && !event.isCanceled()) {
21458d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                onBackPressed();
21468d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                return true;
21478d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn            }
214883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        }
21499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
21509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
21539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default implementation of {@link KeyEvent.Callback#onKeyMultiple(int, int, KeyEvent)
21549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * KeyEvent.Callback.onKeyMultiple()}: always returns false (doesn't handle
21559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the event).
21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event) {
21589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
216283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * Called when the activity has detected the user's press of the back
216383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * key.  The default implementation simply finishes the current activity,
216483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * but you can override this to do whatever you want.
216583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
216683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public void onBackPressed() {
21673a57fb9e9c4f205ca6bd4f036b3080f92588d16dDianne Hackborn        if (!mFragments.popBackStackImmediate()) {
2168ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn            finish();
2169ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        }
217083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    }
217164da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown
217264da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown    /**
217364da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     * Called when a key shortcut event is not handled by any of the views in the Activity.
217464da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     * Override this method to implement global key shortcuts for the Activity.
217564da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     * Key shortcuts can also be implemented by setting the
217664da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     * {@link MenuItem#setShortcut(char, char) shortcut} property of menu items.
217764da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     *
217864da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     * @param keyCode The value in event.getKeyCode().
217964da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     * @param event Description of the key event.
218064da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     * @return True if the key shortcut was handled.
218164da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     */
218264da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown    public boolean onKeyShortcut(int keyCode, KeyEvent event) {
218364da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown        return false;
218464da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown    }
218564da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown
218683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
21879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when a touch screen event was not handled by any of the views
21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * under it.  This is most useful to process touch events that happen
21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * outside of your window bounds, where there is no view to receive it.
21909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
21919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param event The touch screen event being processed.
21929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
21939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Return true if you have consumed the event, false if you haven't.
21949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The default implementation always returns false.
21959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onTouchEvent(MotionEvent event) {
2197cfaf8878de83b6bb7a24aee3c240259f428e6e4aDianne Hackborn        if (mWindow.shouldCloseOnTouch(this, event)) {
2198cfaf8878de83b6bb7a24aee3c240259f428e6e4aDianne Hackborn            finish();
2199cfaf8878de83b6bb7a24aee3c240259f428e6e4aDianne Hackborn            return true;
2200cfaf8878de83b6bb7a24aee3c240259f428e6e4aDianne Hackborn        }
2201cfaf8878de83b6bb7a24aee3c240259f428e6e4aDianne Hackborn
22029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
22039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
22069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when the trackball was moved and not handled by any of the
22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * views inside of the activity.  So, for example, if the trackball moves
22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * while focus is on a button, you will receive a call here because
22099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * buttons do not normally do anything with trackball events.  The call
22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * here happens <em>before</em> trackball movements are converted to
22119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * DPAD key events, which then get sent back to the view hierarchy, and
22129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will be processed at the point for things like focus navigation.
22139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
22149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param event The trackball event being processed.
22159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
22169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Return true if you have consumed the event, false if you haven't.
22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The default implementation always returns false.
22189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
22199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onTrackballEvent(MotionEvent event) {
22209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
22219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2222cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
2223cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    /**
2224cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * Called when a generic motion event was not handled by any of the
2225cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * views inside of the activity.
2226cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * <p>
222733bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown     * Generic motion events describe joystick movements, mouse hovers, track pad
222833bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown     * touches, scroll wheel movements and other input events.  The
2229cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * {@link MotionEvent#getSource() source} of the motion event specifies
2230cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * the class of input that was received.  Implementations of this method
2231cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * must examine the bits in the source before processing the event.
2232cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * The following code example shows how this is done.
223333bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown     * </p><p>
223433bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown     * Generic motion events with source class
223533bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown     * {@link android.view.InputDevice#SOURCE_CLASS_POINTER}
223633bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown     * are delivered to the view under the pointer.  All other generic motion events are
223733bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown     * delivered to the focused view.
223833bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown     * </p><p>
223933bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown     * See {@link View#onGenericMotionEvent(MotionEvent)} for an example of how to
224033bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown     * handle this event.
2241cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * </p>
2242cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     *
2243cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * @param event The generic motion event being processed.
2244cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     *
2245cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * @return Return true if you have consumed the event, false if you haven't.
2246cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * The default implementation always returns false.
2247cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     */
2248cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    public boolean onGenericMotionEvent(MotionEvent event) {
2249cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        return false;
2250cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    }
2251cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
22529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
22539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called whenever a key, touch, or trackball event is dispatched to the
22549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity.  Implement this method if you wish to know that the user has
22559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * interacted with the device in some way while your activity is running.
22569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This callback and {@link #onUserLeaveHint} are intended to help
22579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activities manage status bar notifications intelligently; specifically,
22589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for helping activities determine the proper time to cancel a notfication.
22599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
22609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>All calls to your activity's {@link #onUserLeaveHint} callback will
22619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be accompanied by calls to {@link #onUserInteraction}.  This
22629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ensures that your activity will be told of relevant user activity such
22639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * as pulling down the notification pane and touching an item there.
22649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
22659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note that this callback will be invoked for the touch down action
22669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that begins a touch gesture, but may not be invoked for the touch-moved
22679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and touch-up actions that follow.
22689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
22699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onUserLeaveHint()
22709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
22719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onUserInteraction() {
22729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onWindowAttributesChanged(WindowManager.LayoutParams params) {
22759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Update window manager if: we have a view, that view is
22769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // attached to its parent (which will be a RootView), and
22779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this activity is not embedded.
22789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent == null) {
22799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            View decor = mDecor;
22809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (decor != null && decor.getParent() != null) {
22819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                getWindowManager().updateViewLayout(decor, params);
22829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onContentChanged() {
22879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
22909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when the current {@link Window} of the activity gains or loses
22919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * focus.  This is the best indicator of whether this activity is visible
229283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * to the user.  The default implementation clears the key tracking
229383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * state, so should always be called.
22949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
229583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * <p>Note that this provides information about global focus state, which
22969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is managed independently of activity lifecycles.  As such, while focus
22979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * changes will generally have some relation to lifecycle changes (an
22989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity that is stopped will not generally get window focus), you
22999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * should not rely on any particular order between the callbacks here and
23009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * those in the other lifecycle methods such as {@link #onResume}.
23019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>As a general rule, however, a resumed activity will have window
23039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * focus...  unless it has displayed other dialogs or popups that take
23049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * input focus, in which case the activity itself will not have focus
23059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * when the other windows have it.  Likewise, the system may display
23069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * system-level windows (such as the status bar notification panel or
23079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a system alert) which will temporarily take window input focus without
23089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * pausing the foreground activity.
23099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param hasFocus Whether the window of this activity has focus.
23119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #hasWindowFocus()
23139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onResume
23143be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     * @see View#onWindowFocusChanged(boolean)
23159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
23169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onWindowFocusChanged(boolean hasFocus) {
23179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
23203be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     * Called when the main window associated with the activity has been
23213be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     * attached to the window manager.
23223be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     * See {@link View#onAttachedToWindow() View.onAttachedToWindow()}
23233be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     * for more information.
23243be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     * @see View#onAttachedToWindow
23253be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     */
23263be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn    public void onAttachedToWindow() {
23273be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn    }
23283be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn
23293be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn    /**
23303be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     * Called when the main window associated with the activity has been
23313be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     * detached from the window manager.
23323be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     * See {@link View#onDetachedFromWindow() View.onDetachedFromWindow()}
23333be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     * for more information.
23343be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     * @see View#onDetachedFromWindow
23353be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     */
23363be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn    public void onDetachedFromWindow() {
23373be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn    }
23383be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn
23393be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn    /**
23409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns true if this activity's <em>main</em> window currently has window focus.
23419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Note that this is not the same as the view itself having focus.
23429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if this activity's main window currently has window focus.
23449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onWindowAttributesChanged(android.view.WindowManager.LayoutParams)
23469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
23479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean hasWindowFocus() {
23489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Window w = getWindow();
23499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (w != null) {
23509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            View d = w.getDecorView();
23519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (d != null) {
23529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return d.hasWindowFocus();
23539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
23569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
23599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called to process key events.  You can override this to intercept all
23609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * key events before they are dispatched to the window.  Be sure to call
23619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this implementation for key events that should be handled normally.
23629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param event The key event.
23649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return boolean Return true if this event was consumed.
23669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
23679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean dispatchKeyEvent(KeyEvent event) {
23689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onUserInteraction();
23698d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn        Window win = getWindow();
23708d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn        if (win.superDispatchKeyEvent(event)) {
23719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
23729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23738d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn        View decor = mDecor;
23748d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn        if (decor == null) decor = win.getDecorView();
23758d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn        return event.dispatch(this, decor != null
23768d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                ? decor.getKeyDispatcherState() : null, this);
23779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
238064da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     * Called to process a key shortcut event.
238164da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     * You can override this to intercept all key shortcut events before they are
238264da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     * dispatched to the window.  Be sure to call this implementation for key shortcut
238364da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     * events that should be handled normally.
238464da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     *
238564da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     * @param event The key shortcut event.
238664da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     * @return True if this event was consumed.
238764da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     */
238864da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown    public boolean dispatchKeyShortcutEvent(KeyEvent event) {
238964da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown        onUserInteraction();
239064da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown        if (getWindow().superDispatchKeyShortcutEvent(event)) {
239164da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown            return true;
239264da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown        }
239364da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown        return onKeyShortcut(event.getKeyCode(), event);
239464da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown    }
239564da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown
239664da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown    /**
23979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called to process touch screen events.  You can override this to
23989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * intercept all touch screen events before they are dispatched to the
23999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * window.  Be sure to call this implementation for touch screen events
24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that should be handled normally.
24019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
24029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param ev The touch screen event.
24039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
24049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return boolean Return true if this event was consumed.
24059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
24069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean dispatchTouchEvent(MotionEvent ev) {
24079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
24089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            onUserInteraction();
24099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (getWindow().superDispatchTouchEvent(ev)) {
24119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
24129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return onTouchEvent(ev);
24149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
24179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called to process trackball events.  You can override this to
24189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * intercept all trackball events before they are dispatched to the
24199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * window.  Be sure to call this implementation for trackball events
24209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that should be handled normally.
24219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
24229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param ev The trackball event.
24239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
24249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return boolean Return true if this event was consumed.
24259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
24269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean dispatchTrackballEvent(MotionEvent ev) {
24279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onUserInteraction();
24289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (getWindow().superDispatchTrackballEvent(ev)) {
24299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
24309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return onTrackballEvent(ev);
24329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
243375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
2434cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    /**
2435cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * Called to process generic motion events.  You can override this to
2436cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * intercept all generic motion events before they are dispatched to the
2437cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * window.  Be sure to call this implementation for generic motion events
2438cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * that should be handled normally.
2439cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     *
2440cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * @param ev The generic motion event.
2441cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     *
2442cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * @return boolean Return true if this event was consumed.
2443cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     */
2444cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    public boolean dispatchGenericMotionEvent(MotionEvent ev) {
2445cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        onUserInteraction();
2446cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        if (getWindow().superDispatchGenericMotionEvent(ev)) {
2447cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            return true;
2448cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        }
2449cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        return onGenericMotionEvent(ev);
2450cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    }
2451cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
245275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
245375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        event.setClassName(getClass().getName());
245475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        event.setPackageName(getPackageName());
245575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
245675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        LayoutParams params = getWindow().getAttributes();
2457980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy        boolean isFullScreen = (params.width == LayoutParams.MATCH_PARENT) &&
2458980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy            (params.height == LayoutParams.MATCH_PARENT);
245975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        event.setFullScreen(isFullScreen);
246075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
246175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        CharSequence title = getTitle();
246275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        if (!TextUtils.isEmpty(title)) {
246375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov           event.getText().add(title);
246475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        }
246575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
246675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        return true;
246775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    }
246875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
24699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
24709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default implementation of
24719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window.Callback#onCreatePanelView}
24729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for activities. This
24739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * simply returns null so that all panel sub-windows will have the default
24749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * menu behavior.
24759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
24769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public View onCreatePanelView(int featureId) {
24779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
24789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
24819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default implementation of
24829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window.Callback#onCreatePanelMenu}
24839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for activities.  This calls through to the new
24849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onCreateOptionsMenu} method for the
24859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window#FEATURE_OPTIONS_PANEL} panel,
24869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * so that subclasses of Activity don't need to deal with feature codes.
24879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
24889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onCreatePanelMenu(int featureId, Menu menu) {
24899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (featureId == Window.FEATURE_OPTIONS_PANEL) {
2490b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn            boolean show = onCreateOptionsMenu(menu);
2491b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn            show |= mFragments.dispatchCreateOptionsMenu(menu, getMenuInflater());
2492b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn            return show;
24939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
24959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
24989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default implementation of
24999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window.Callback#onPreparePanel}
25009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for activities.  This
25019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * calls through to the new {@link #onPrepareOptionsMenu} method for the
25029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window#FEATURE_OPTIONS_PANEL}
25039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * panel, so that subclasses of
25049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Activity don't need to deal with feature codes.
25059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
25069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onPreparePanel(int featureId, View view, Menu menu) {
25079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (featureId == Window.FEATURE_OPTIONS_PANEL && menu != null) {
25089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean goforit = onPrepareOptionsMenu(menu);
2509b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn            goforit |= mFragments.dispatchPrepareOptionsMenu(menu);
2510ef31e7cab57c82083c41adf2d2a056ab159a4f51Adam Powell            return goforit;
25119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
25139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
25169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
25179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
25189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The default implementation returns true.
25199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
25209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onMenuOpened(int featureId, Menu menu) {
25218515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell        if (featureId == Window.FEATURE_ACTION_BAR) {
2522763cbb134f40fa1e555c0a945a2a651f69193505Adam Powell            initActionBar();
2523049dd3d4a4869e0c65d370e2538fcfb55bacef52Adam Powell            if (mActionBar != null) {
2524049dd3d4a4869e0c65d370e2538fcfb55bacef52Adam Powell                mActionBar.dispatchMenuVisibilityChanged(true);
2525049dd3d4a4869e0c65d370e2538fcfb55bacef52Adam Powell            } else {
2526049dd3d4a4869e0c65d370e2538fcfb55bacef52Adam Powell                Log.e(TAG, "Tried to open action bar menu with no action bar");
2527049dd3d4a4869e0c65d370e2538fcfb55bacef52Adam Powell            }
25288515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell        }
25299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
25309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
25339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default implementation of
25349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window.Callback#onMenuItemSelected}
25359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for activities.  This calls through to the new
25369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onOptionsItemSelected} method for the
25379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window#FEATURE_OPTIONS_PANEL}
25389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * panel, so that subclasses of
25399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Activity don't need to deal with feature codes.
25409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
25419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onMenuItemSelected(int featureId, MenuItem item) {
25429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (featureId) {
25439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case Window.FEATURE_OPTIONS_PANEL:
25449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Put event logging here so it gets called even if subclass
25459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // doesn't call through to superclass's implmeentation of each
25469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // of these methods below
25479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                EventLog.writeEvent(50000, 0, item.getTitleCondensed());
2548b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                if (onOptionsItemSelected(item)) {
2549b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                    return true;
2550b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                }
255104d5811500874d44010df2b4ce37a0b21095168fAdam Powell                if (mFragments.dispatchOptionsItemSelected(item)) {
255204d5811500874d44010df2b4ce37a0b21095168fAdam Powell                    return true;
255304d5811500874d44010df2b4ce37a0b21095168fAdam Powell                }
255404d5811500874d44010df2b4ce37a0b21095168fAdam Powell                if (item.getItemId() == android.R.id.home && mActionBar != null &&
255504d5811500874d44010df2b4ce37a0b21095168fAdam Powell                        (mActionBar.getDisplayOptions() & ActionBar.DISPLAY_HOME_AS_UP) != 0) {
255604d5811500874d44010df2b4ce37a0b21095168fAdam Powell                    if (mParent == null) {
255707304f5299c6bccf84bd993239fbb3b87a0d46e6Adam Powell                        return onNavigateUp();
255804d5811500874d44010df2b4ce37a0b21095168fAdam Powell                    } else {
255907304f5299c6bccf84bd993239fbb3b87a0d46e6Adam Powell                        return mParent.onNavigateUpFromChild(this);
256004d5811500874d44010df2b4ce37a0b21095168fAdam Powell                    }
256104d5811500874d44010df2b4ce37a0b21095168fAdam Powell                }
256204d5811500874d44010df2b4ce37a0b21095168fAdam Powell                return false;
25639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case Window.FEATURE_CONTEXT_MENU:
25659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                EventLog.writeEvent(50000, 1, item.getTitleCondensed());
25665ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn                if (onContextItemSelected(item)) {
25675ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn                    return true;
25685ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn                }
25695ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn                return mFragments.dispatchContextItemSelected(item);
25708515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell
25719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default:
25729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
25739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
25779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default implementation of
25789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window.Callback#onPanelClosed(int, Menu)} for
25799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activities. This calls through to {@link #onOptionsMenuClosed(Menu)}
25809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * method for the {@link android.view.Window#FEATURE_OPTIONS_PANEL} panel,
25819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * so that subclasses of Activity don't need to deal with feature codes.
25829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * For context menus ({@link Window#FEATURE_CONTEXT_MENU}), the
25839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onContextMenuClosed(Menu)} will be called.
25849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
25859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onPanelClosed(int featureId, Menu menu) {
25869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (featureId) {
25879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case Window.FEATURE_OPTIONS_PANEL:
2588b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                mFragments.dispatchOptionsMenuClosed(menu);
25899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                onOptionsMenuClosed(menu);
25909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
25919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case Window.FEATURE_CONTEXT_MENU:
25939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                onContextMenuClosed(menu);
25949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
25958515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell
25968515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell            case Window.FEATURE_ACTION_BAR:
25979b4bee0f14bbd137b0797127aff2df46a6321ec5Adam Powell                initActionBar();
25988515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell                mActionBar.dispatchMenuVisibilityChanged(false);
25998515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell                break;
26009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2604b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     * Declare that the options menu has changed, so should be recreated.
2605b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     * The {@link #onCreateOptionsMenu(Menu)} method will be called the next
2606b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     * time it needs to be displayed.
2607b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     */
2608b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    public void invalidateOptionsMenu() {
2609b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn        mWindow.invalidatePanelMenu(Window.FEATURE_OPTIONS_PANEL);
2610b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    }
2611b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn
2612b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    /**
26139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Initialize the contents of the Activity's standard options menu.  You
26149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * should place your menu items in to <var>menu</var>.
26159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This is only called once, the first time the options menu is
26179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * displayed.  To update the menu every time it is displayed, see
26189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onPrepareOptionsMenu}.
26199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The default implementation populates the menu with standard system
26219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * menu items.  These are placed in the {@link Menu#CATEGORY_SYSTEM} group so that
26229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * they will be correctly ordered with application-defined menu items.
26239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Deriving classes should always call through to the base implementation.
26249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>You can safely hold on to <var>menu</var> (and any items created
26269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * from it), making modifications to it as desired, until the next
26279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * time onCreateOptionsMenu() is called.
26289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>When you add items to the menu, you can implement the Activity's
26309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onOptionsItemSelected} method to handle them there.
26319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param menu The options menu in which you place your items.
26339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return You must return true for the menu to be displayed;
26359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         if you return false it will not be shown.
26369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPrepareOptionsMenu
26389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onOptionsItemSelected
26399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
26409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onCreateOptionsMenu(Menu menu) {
26419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent != null) {
26429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mParent.onCreateOptionsMenu(menu);
26439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
26459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
26489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Prepare the Screen's standard options menu to be displayed.  This is
26499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * called right before the menu is shown, every time it is shown.  You can
26509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * use this method to efficiently enable/disable items or otherwise
26519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * dynamically modify the contents.
26529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The default implementation updates the system menu items based on the
26549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity's state.  Deriving classes should always call through to the
26559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * base class implementation.
26569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param menu The options menu as last shown or first initialized by
26589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             onCreateOptionsMenu().
26599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return You must return true for the menu to be displayed;
26619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         if you return false it will not be shown.
26629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onCreateOptionsMenu
26649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
26659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onPrepareOptionsMenu(Menu menu) {
26669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent != null) {
26679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mParent.onPrepareOptionsMenu(menu);
26689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
26709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
26739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This hook is called whenever an item in your options menu is selected.
26749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The default implementation simply returns false to have the normal
26759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * processing happen (calling the item's Runnable or sending a message to
26769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * its Handler as appropriate).  You can use this method for any items
26779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for which you would like to do processing without those other
26789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * facilities.
26799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Derived classes should call through to the base class for it to
2681dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * perform the default menu handling.</p>
26829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param item The menu item that was selected.
26849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return boolean Return false to allow normal menu processing to
26869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         proceed, true to consume it here.
26879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onCreateOptionsMenu
26899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
26909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onOptionsItemSelected(MenuItem item) {
26919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent != null) {
26929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mParent.onOptionsItemSelected(item);
26939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
26959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2698dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * This method is called whenever the user chooses to navigate Up within your application's
2699dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * activity hierarchy from the action bar.
2700dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     *
2701dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * <p>If the attribute {@link android.R.attr#parentActivityName parentActivityName}
2702dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * was specified in the manifest for this activity or an activity-alias to it,
2703dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * default Up navigation will be handled automatically. If any activity
2704dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * along the parent chain requires extra Intent arguments, the Activity subclass
2705dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * should override the method {@link #onPrepareNavigateUpTaskStack(TaskStackBuilder)}
2706dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * to supply those arguments.</p>
2707dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     *
2708dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * <p>See <a href="{@docRoot}guide/topics/fundamentals/tasks-and-back-stack.html">Tasks and Back Stack</a>
2709dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * from the developer guide and <a href="{@docRoot}design/patterns/navigation.html">Navigation</a>
2710dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * from the design guide for more information about navigating within your app.</p>
2711dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     *
2712dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * <p>See the {@link TaskStackBuilder} class and the Activity methods
2713dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * {@link #getParentActivityIntent()}, {@link #shouldUpRecreateTask(Intent)}, and
2714dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * {@link #navigateUpTo(Intent)} for help implementing custom Up navigation.
2715dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * The AppNavigation sample application in the Android SDK is also available for reference.</p>
2716dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     *
2717dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * @return true if Up navigation completed successfully and this Activity was finished,
2718dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     *         false otherwise.
2719dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     */
2720dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell    public boolean onNavigateUp() {
2721dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell        // Automatically handle hierarchical Up navigation if the proper
2722dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell        // metadata is available.
2723dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell        Intent upIntent = getParentActivityIntent();
2724dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell        if (upIntent != null) {
27250fc5b2bea09a6d320884c5b12577caf426f547c1Adam Powell            if (mActivityInfo.taskAffinity == null) {
27260fc5b2bea09a6d320884c5b12577caf426f547c1Adam Powell                // Activities with a null affinity are special; they really shouldn't
27270fc5b2bea09a6d320884c5b12577caf426f547c1Adam Powell                // specify a parent activity intent in the first place. Just finish
27280fc5b2bea09a6d320884c5b12577caf426f547c1Adam Powell                // the current activity and call it a day.
27290fc5b2bea09a6d320884c5b12577caf426f547c1Adam Powell                finish();
27300fc5b2bea09a6d320884c5b12577caf426f547c1Adam Powell            } else if (shouldUpRecreateTask(upIntent)) {
2731f78a8444a9b21b0d1daca8667d580dd0ec04a310Adam Powell                TaskStackBuilder b = TaskStackBuilder.create(this);
2732dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell                onCreateNavigateUpTaskStack(b);
2733dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell                onPrepareNavigateUpTaskStack(b);
2734dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell                b.startActivities();
27353d193d92f601569bb99fe011bb6e104a492a0a71Adam Powell
27363d193d92f601569bb99fe011bb6e104a492a0a71Adam Powell                // We can't finishAffinity if we have a result.
27373d193d92f601569bb99fe011bb6e104a492a0a71Adam Powell                // Fall back and simply finish the current activity instead.
27383d193d92f601569bb99fe011bb6e104a492a0a71Adam Powell                if (mResultCode != RESULT_CANCELED || mResultData != null) {
27393d193d92f601569bb99fe011bb6e104a492a0a71Adam Powell                    // Tell the developer what's going on to avoid hair-pulling.
27403d193d92f601569bb99fe011bb6e104a492a0a71Adam Powell                    Log.i(TAG, "onNavigateUp only finishing topmost activity to return a result");
27413d193d92f601569bb99fe011bb6e104a492a0a71Adam Powell                    finish();
27423d193d92f601569bb99fe011bb6e104a492a0a71Adam Powell                } else {
27433d193d92f601569bb99fe011bb6e104a492a0a71Adam Powell                    finishAffinity();
27443d193d92f601569bb99fe011bb6e104a492a0a71Adam Powell                }
2745dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell            } else {
2746dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell                navigateUpTo(upIntent);
2747dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell            }
2748dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell            return true;
2749dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell        }
2750dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell        return false;
2751dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell    }
2752dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell
2753dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell    /**
2754dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * This is called when a child activity of this one attempts to navigate up.
2755dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * The default implementation simply calls onNavigateUp() on this activity (the parent).
2756dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     *
2757dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * @param child The activity making the call.
2758dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     */
2759dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell    public boolean onNavigateUpFromChild(Activity child) {
2760dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell        return onNavigateUp();
2761dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell    }
2762dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell
2763dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell    /**
2764dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * Define the synthetic task stack that will be generated during Up navigation from
2765dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * a different task.
2766dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     *
2767dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * <p>The default implementation of this method adds the parent chain of this activity
2768dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * as specified in the manifest to the supplied {@link TaskStackBuilder}. Applications
2769dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * may choose to override this method to construct the desired task stack in a different
2770dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * way.</p>
2771dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     *
2772f0195951519a5d7ce26ff2d88228af13642fc292Adam Powell     * <p>This method will be invoked by the default implementation of {@link #onNavigateUp()}
2773f0195951519a5d7ce26ff2d88228af13642fc292Adam Powell     * if {@link #shouldUpRecreateTask(Intent)} returns true when supplied with the intent
2774f0195951519a5d7ce26ff2d88228af13642fc292Adam Powell     * returned by {@link #getParentActivityIntent()}.</p>
2775f0195951519a5d7ce26ff2d88228af13642fc292Adam Powell     *
2776dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * <p>Applications that wish to supply extra Intent parameters to the parent stack defined
2777dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * by the manifest should override {@link #onPrepareNavigateUpTaskStack(TaskStackBuilder)}.</p>
2778dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     *
2779dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * @param builder An empty TaskStackBuilder - the application should add intents representing
2780dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     *                the desired task stack
2781dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     */
2782dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell    public void onCreateNavigateUpTaskStack(TaskStackBuilder builder) {
2783dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell        builder.addParentStack(this);
2784dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell    }
2785dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell
2786dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell    /**
2787dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * Prepare the synthetic task stack that will be generated during Up navigation
2788dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * from a different task.
2789dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     *
2790dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * <p>This method receives the {@link TaskStackBuilder} with the constructed series of
2791dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * Intents as generated by {@link #onCreateNavigateUpTaskStack(TaskStackBuilder)}.
2792dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * If any extra data should be added to these intents before launching the new task,
2793dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * the application should override this method and add that data here.</p>
2794dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     *
2795dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * @param builder A TaskStackBuilder that has been populated with Intents by
2796dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     *                onCreateNavigateUpTaskStack.
2797dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     */
2798dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell    public void onPrepareNavigateUpTaskStack(TaskStackBuilder builder) {
2799dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell    }
2800dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell
2801dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell    /**
28029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This hook is called whenever the options menu is being closed (either by the user canceling
28039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the menu with the back/menu button, or when an item is selected).
28049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param menu The options menu as last shown or first initialized by
28069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             onCreateOptionsMenu().
28079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
28089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onOptionsMenuClosed(Menu menu) {
28099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent != null) {
28109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParent.onOptionsMenuClosed(menu);
28119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
28159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Programmatically opens the options menu. If the options menu is already
28169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * open, this method does nothing.
28179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
28189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void openOptionsMenu() {
28199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindow.openPanel(Window.FEATURE_OPTIONS_PANEL, null);
28209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
28239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Progammatically closes the options menu. If the options menu is already
28249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * closed, this method does nothing.
28259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
28269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void closeOptionsMenu() {
28279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindow.closePanel(Window.FEATURE_OPTIONS_PANEL);
28289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
28319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when a context menu for the {@code view} is about to be shown.
28329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Unlike {@link #onCreateOptionsMenu(Menu)}, this will be called every
28339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * time the context menu is about to be shown and should be populated for
28349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the view (or item inside the view for {@link AdapterView} subclasses,
28359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this can be found in the {@code menuInfo})).
28369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
28379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use {@link #onContextItemSelected(android.view.MenuItem)} to know when an
28389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * item has been selected.
28399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
28409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * It is not safe to hold onto the context menu after this method returns.
2841cdf5106aafb77d17584d5401b207cbcc7a20f5f3Scott Main     *
28429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
28439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
28449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
28479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Registers a context menu to be shown for the given view (multiple views
28489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * can show the context menu). This method will set the
28499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link OnCreateContextMenuListener} on the view to this activity, so
28509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onCreateContextMenu(ContextMenu, View, ContextMenuInfo)} will be
28519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * called when it is time to show the context menu.
28529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #unregisterForContextMenu(View)
28549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param view The view that should show a context menu.
28559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
28569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void registerForContextMenu(View view) {
28579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        view.setOnCreateContextMenuListener(this);
28589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
28619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Prevents a context menu to be shown for the given view. This method will remove the
28629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link OnCreateContextMenuListener} on the view.
28639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #registerForContextMenu(View)
28659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param view The view that should stop showing a context menu.
28669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
28679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void unregisterForContextMenu(View view) {
28689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        view.setOnCreateContextMenuListener(null);
28699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
28729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Programmatically opens the context menu for a particular {@code view}.
28739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The {@code view} should have been added via
28749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #registerForContextMenu(View)}.
28759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param view The view to show the context menu for.
28779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
28789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void openContextMenu(View view) {
28799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        view.showContextMenu();
28809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
28839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Programmatically closes the most recently opened context menu, if showing.
28849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
28859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void closeContextMenu() {
28869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindow.closePanel(Window.FEATURE_CONTEXT_MENU);
28879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
28909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This hook is called whenever an item in a context menu is selected. The
28919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * default implementation simply returns false to have the normal processing
28929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * happen (calling the item's Runnable or sending a message to its Handler
28939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * as appropriate). You can use this method for any items for which you
28949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * would like to do processing without those other facilities.
28959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
28969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use {@link MenuItem#getMenuInfo()} to get extra information set by the
28979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * View that added this menu item.
28989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
28999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Derived classes should call through to the base class for it to perform
29009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the default menu handling.
29019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
29029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param item The context menu item that was selected.
29039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return boolean Return false to allow normal context menu processing to
29049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         proceed, true to consume it here.
29059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
29069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onContextItemSelected(MenuItem item) {
29079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent != null) {
29089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mParent.onContextItemSelected(item);
29099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
29119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
29149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This hook is called whenever the context menu is being closed (either by
29159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the user canceling the menu with the back/menu button, or when an item is
29169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * selected).
29179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
29189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param menu The context menu that is being closed.
29199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
29209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onContextMenuClosed(Menu menu) {
29219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent != null) {
29229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParent.onContextMenuClosed(menu);
29239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
29278ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @deprecated Old no-arguments version of {@link #onCreateDialog(int, Bundle)}.
29288ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     */
29298ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    @Deprecated
29308ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    protected Dialog onCreateDialog(int id) {
29318ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        return null;
29328ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    }
29338ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn
29348ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    /**
29359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Callback for creating dialogs that are managed (saved and restored) for you
29368ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * by the activity.  The default implementation calls through to
29378ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * {@link #onCreateDialog(int)} for compatibility.
29389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2939291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * <em>If you are targeting {@link android.os.Build.VERSION_CODES#HONEYCOMB}
2940291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * or later, consider instead using a {@link DialogFragment} instead.</em>
2941291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     *
29428ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * <p>If you use {@link #showDialog(int)}, the activity will call through to
29439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this method the first time, and hang onto it thereafter.  Any dialog
29449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that is created by this method will automatically be saved and restored
29459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for you, including whether it is showing.
29469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
29478ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * <p>If you would like the activity to manage saving and restoring dialogs
29489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for you, you should override this method and handle any ids that are
29499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * passed to {@link #showDialog}.
29509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
29518ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * <p>If you would like an opportunity to prepare your dialog before it is shown,
29528ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * override {@link #onPrepareDialog(int, Dialog, Bundle)}.
29539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
29549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param id The id of the dialog.
29558ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @param args The dialog arguments provided to {@link #showDialog(int, Bundle)}.
29568ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @return The dialog.  If you return null, the dialog will not be created.
29579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
29588ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @see #onPrepareDialog(int, Dialog, Bundle)
29598ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @see #showDialog(int, Bundle)
29609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #dismissDialog(int)
29619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #removeDialog(int)
2962271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     *
2963271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * @deprecated Use the new {@link DialogFragment} class with
2964271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * {@link FragmentManager} instead; this is also
2965271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * available on older platforms through the Android compatibility package.
29669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
29679567a66a5e6f49dd8495fb5f6e2efb9f32e84b35Dianne Hackborn    @Deprecated
29688ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    protected Dialog onCreateDialog(int id, Bundle args) {
29698ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        return onCreateDialog(id);
29708ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    }
29718ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn
29728ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    /**
29738ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @deprecated Old no-arguments version of
29748ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * {@link #onPrepareDialog(int, Dialog, Bundle)}.
29758ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     */
29768ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    @Deprecated
29778ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    protected void onPrepareDialog(int id, Dialog dialog) {
29788ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        dialog.setOwnerActivity(this);
29799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
29829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Provides an opportunity to prepare a managed dialog before it is being
29838ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * shown.  The default implementation calls through to
29848ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * {@link #onPrepareDialog(int, Dialog)} for compatibility.
29858ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     *
29869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
29879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Override this if you need to update a managed dialog based on the state
29889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of the application each time it is shown. For example, a time picker
29899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * dialog might want to be updated with the current time. You should call
29909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * through to the superclass's implementation. The default implementation
29919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will set this Activity as the owner activity on the Dialog.
29929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
29939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param id The id of the managed dialog.
29949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param dialog The dialog.
29958ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @param args The dialog arguments provided to {@link #showDialog(int, Bundle)}.
29968ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @see #onCreateDialog(int, Bundle)
29979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #showDialog(int)
29989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #dismissDialog(int)
29999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #removeDialog(int)
3000271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     *
3001271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * @deprecated Use the new {@link DialogFragment} class with
3002271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * {@link FragmentManager} instead; this is also
3003271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * available on older platforms through the Android compatibility package.
30049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
30059567a66a5e6f49dd8495fb5f6e2efb9f32e84b35Dianne Hackborn    @Deprecated
30068ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    protected void onPrepareDialog(int id, Dialog dialog, Bundle args) {
30078ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        onPrepareDialog(id, dialog);
30089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
30118ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * Simple version of {@link #showDialog(int, Bundle)} that does not
30128ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * take any arguments.  Simply calls {@link #showDialog(int, Bundle)}
30138ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * with null arguments.
3014271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     *
3015271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * @deprecated Use the new {@link DialogFragment} class with
3016271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * {@link FragmentManager} instead; this is also
3017271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * available on older platforms through the Android compatibility package.
30188ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     */
30199567a66a5e6f49dd8495fb5f6e2efb9f32e84b35Dianne Hackborn    @Deprecated
30208ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    public final void showDialog(int id) {
30218ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        showDialog(id, null);
30228ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    }
30238ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn
30248ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    /**
30258ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * Show a dialog managed by this activity.  A call to {@link #onCreateDialog(int, Bundle)}
30269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will be made with the same id the first time this is called for a given
30279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * id.  From thereafter, the dialog will be automatically saved and restored.
30289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3029291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * <em>If you are targeting {@link android.os.Build.VERSION_CODES#HONEYCOMB}
3030291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * or later, consider instead using a {@link DialogFragment} instead.</em>
3031291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     *
30328ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * <p>Each time a dialog is shown, {@link #onPrepareDialog(int, Dialog, Bundle)} will
30339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be made to provide an opportunity to do any timely preparation.
30349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
30359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param id The id of the managed dialog.
30368ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @param args Arguments to pass through to the dialog.  These will be saved
30378ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * and restored for you.  Note that if the dialog is already created,
30388ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * {@link #onCreateDialog(int, Bundle)} will not be called with the new
30398ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * arguments but {@link #onPrepareDialog(int, Dialog, Bundle)} will be.
3040d47c6ed4a9f2b5bd31f6c806b74701428efe458bDianne Hackborn     * If you need to rebuild the dialog, call {@link #removeDialog(int)} first.
30418ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @return Returns true if the Dialog was created; false is returned if
30428ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * it is not created because {@link #onCreateDialog(int, Bundle)} returns false.
30438ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     *
304437296dc4edae8d1383179e956dff2ecf806ac166Joe Onorato     * @see Dialog
30458ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @see #onCreateDialog(int, Bundle)
30468ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @see #onPrepareDialog(int, Dialog, Bundle)
30479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #dismissDialog(int)
30489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #removeDialog(int)
3049271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     *
3050271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * @deprecated Use the new {@link DialogFragment} class with
3051271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * {@link FragmentManager} instead; this is also
3052271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * available on older platforms through the Android compatibility package.
30539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
30549567a66a5e6f49dd8495fb5f6e2efb9f32e84b35Dianne Hackborn    @Deprecated
30558ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    public final boolean showDialog(int id, Bundle args) {
30569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mManagedDialogs == null) {
30578ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            mManagedDialogs = new SparseArray<ManagedDialog>();
30589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30598ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        ManagedDialog md = mManagedDialogs.get(id);
30608ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        if (md == null) {
30618ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            md = new ManagedDialog();
30628ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            md.mDialog = createDialog(id, null, args);
30638ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            if (md.mDialog == null) {
30648ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                return false;
30658ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            }
30668ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            mManagedDialogs.put(id, md);
30679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30698ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        md.mArgs = args;
30708ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        onPrepareDialog(id, md.mDialog, args);
30718ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        md.mDialog.show();
30728ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        return true;
30739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
30769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Dismiss a dialog that was previously shown via {@link #showDialog(int)}.
30779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
30789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param id The id of the managed dialog.
30799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
30809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalArgumentException if the id was not previously shown via
30819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *   {@link #showDialog(int)}.
30829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
30838ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @see #onCreateDialog(int, Bundle)
30848ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @see #onPrepareDialog(int, Dialog, Bundle)
30859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #showDialog(int)
30869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #removeDialog(int)
3087271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     *
3088271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * @deprecated Use the new {@link DialogFragment} class with
3089271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * {@link FragmentManager} instead; this is also
3090271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * available on older platforms through the Android compatibility package.
30919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
30929567a66a5e6f49dd8495fb5f6e2efb9f32e84b35Dianne Hackborn    @Deprecated
30939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void dismissDialog(int id) {
30949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mManagedDialogs == null) {
30959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw missingDialog(id);
30969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30978ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn
30988ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        final ManagedDialog md = mManagedDialogs.get(id);
30998ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        if (md == null) {
31009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw missingDialog(id);
31019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31028ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        md.mDialog.dismiss();
31039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
31069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Creates an exception to throw if a user passed in a dialog id that is
31079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * unexpected.
31089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
31099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IllegalArgumentException missingDialog(int id) {
31109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new IllegalArgumentException("no dialog with id " + id + " was ever "
31119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + "shown via Activity#showDialog");
31129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
31159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Removes any internal references to a dialog managed by this Activity.
31169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If the dialog is showing, it will dismiss it as part of the clean up.
31179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
31188ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * <p>This can be useful if you know that you will never show a dialog again and
31199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * want to avoid the overhead of saving and restoring it in the future.
31209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3121d2ce8bbb84607b1f456b9af00d8d7b84a4610a79Dianne Hackborn     * <p>As of {@link android.os.Build.VERSION_CODES#GINGERBREAD}, this function
3122d2ce8bbb84607b1f456b9af00d8d7b84a4610a79Dianne Hackborn     * will not throw an exception if you try to remove an ID that does not
3123d2ce8bbb84607b1f456b9af00d8d7b84a4610a79Dianne Hackborn     * currently have an associated dialog.</p>
3124d2ce8bbb84607b1f456b9af00d8d7b84a4610a79Dianne Hackborn     *
31259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param id The id of the managed dialog.
31269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
31278ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @see #onCreateDialog(int, Bundle)
31288ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @see #onPrepareDialog(int, Dialog, Bundle)
31299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #showDialog(int)
31309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #dismissDialog(int)
3131271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     *
3132271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * @deprecated Use the new {@link DialogFragment} class with
3133271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * {@link FragmentManager} instead; this is also
3134271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn     * available on older platforms through the Android compatibility package.
31359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
31369567a66a5e6f49dd8495fb5f6e2efb9f32e84b35Dianne Hackborn    @Deprecated
31379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void removeDialog(int id) {
3138d2ce8bbb84607b1f456b9af00d8d7b84a4610a79Dianne Hackborn        if (mManagedDialogs != null) {
3139d2ce8bbb84607b1f456b9af00d8d7b84a4610a79Dianne Hackborn            final ManagedDialog md = mManagedDialogs.get(id);
3140d2ce8bbb84607b1f456b9af00d8d7b84a4610a79Dianne Hackborn            if (md != null) {
3141d2ce8bbb84607b1f456b9af00d8d7b84a4610a79Dianne Hackborn                md.mDialog.dismiss();
3142d2ce8bbb84607b1f456b9af00d8d7b84a4610a79Dianne Hackborn                mManagedDialogs.remove(id);
3143d2ce8bbb84607b1f456b9af00d8d7b84a4610a79Dianne Hackborn            }
31449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
31489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This hook is called when the user signals the desire to start a search.
31499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
31506266e40a754d82afa717ef068898c8418a0bb5c3Bjorn Bringert     * <p>You can use this function as a simple way to launch the search UI, in response to a
31516266e40a754d82afa717ef068898c8418a0bb5c3Bjorn Bringert     * menu item, search button, or other widgets within your activity. Unless overidden,
31526266e40a754d82afa717ef068898c8418a0bb5c3Bjorn Bringert     * calling this function is the same as calling
31536266e40a754d82afa717ef068898c8418a0bb5c3Bjorn Bringert     * {@link #startSearch startSearch(null, false, null, false)}, which launches
31546266e40a754d82afa717ef068898c8418a0bb5c3Bjorn Bringert     * search for the current activity as specified in its manifest, see {@link SearchManager}.
31559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
31569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>You can override this function to force global search, e.g. in response to a dedicated
31579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * search key, or to block search entirely (by simply returning false).
31589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
31596266e40a754d82afa717ef068898c8418a0bb5c3Bjorn Bringert     * @return Returns {@code true} if search launched, and {@code false} if activity blocks it.
31606266e40a754d82afa717ef068898c8418a0bb5c3Bjorn Bringert     *         The default implementation always returns {@code true}.
31619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
31629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.app.SearchManager
31639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
31649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onSearchRequested() {
31659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        startSearch(null, false, null, false);
31669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
31679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
31709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This hook is called to launch the search UI.
31719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
31729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>It is typically called from onSearchRequested(), either directly from
31739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Activity.onSearchRequested() or from an overridden version in any given
31749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Activity.  If your goal is simply to activate search, it is preferred to call
31759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * onSearchRequested(), which may have been overriden elsewhere in your Activity.  If your goal
31769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is to inject specific data such as context data, it is preferred to <i>override</i>
31779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * onSearchRequested(), so that any callers to it will benefit from the override.
31789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
31799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param initialQuery Any non-null non-empty string will be inserted as
31809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * pre-entered text in the search query box.
31819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param selectInitialQuery If true, the intial query will be preselected, which means that
31829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * any further typing will replace it.  This is useful for cases where an entire pre-formed
31839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * query is being inserted.  If false, the selection point will be placed at the end of the
31849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * inserted query.  This is useful when the inserted query is text that the user entered,
31859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and the user would expect to be able to keep typing.  <i>This parameter is only meaningful
31869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if initialQuery is a non-empty string.</i>
31879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param appSearchData An application can insert application-specific
31889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * context here, in order to improve quality or specificity of its own
31899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * searches.  This data will be returned with SEARCH intent(s).  Null if
31909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * no extra data is required.
31919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param globalSearch If false, this will only launch the search that has been specifically
31929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * defined by the application (which is usually defined as a local search).  If no default
3193cfa419b754332e12f8cd45244c2f3bee9d6a74bbMike LeBeau     * search is defined in the current application or activity, global search will be launched.
31949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If true, this will always launch a platform-global (e.g. web-based) search instead.
31959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
31969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.app.SearchManager
31979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onSearchRequested
31989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
31999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startSearch(String initialQuery, boolean selectInitialQuery,
32009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Bundle appSearchData, boolean globalSearch) {
3201b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn        ensureSearchManager();
32028d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert        mSearchManager.startSearch(initialQuery, selectInitialQuery, getComponentName(),
32039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        appSearchData, globalSearch);
32049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3207d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     * Similar to {@link #startSearch}, but actually fires off the search query after invoking
3208d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     * the search dialog.  Made available for testing purposes.
3209d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     *
3210d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     * @param query The query to trigger.  If empty, the request will be ignored.
3211d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     * @param appSearchData An application can insert application-specific
3212d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     * context here, in order to improve quality or specificity of its own
3213d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     * searches.  This data will be returned with SEARCH intent(s).  Null if
3214d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     * no extra data is required.
3215d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     */
3216b782a2f4f0a3072f2677f6f10fb255c77468ae66Bjorn Bringert    public void triggerSearch(String query, Bundle appSearchData) {
3217d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen        ensureSearchManager();
3218b782a2f4f0a3072f2677f6f10fb255c77468ae66Bjorn Bringert        mSearchManager.triggerSearch(query, getComponentName(), appSearchData);
3219d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen    }
3220d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen
3221d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen    /**
32229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Request that key events come to this activity. Use this if your
32239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity has no views with focus, but the activity still wants
32249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a chance to process key events.
32259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
32269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.view.Window#takeKeyEvents
32279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
32289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void takeKeyEvents(boolean get) {
32299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().takeKeyEvents(get);
32309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
32339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Enable extended window features.  This is a convenience for calling
32349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window#requestFeature getWindow().requestFeature()}.
32359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
32369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param featureId The desired feature as defined in
32379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                  {@link android.view.Window}.
32389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns true if the requested feature is supported and now
32399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         enabled.
32409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
32419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.view.Window#requestFeature
32429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
32439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean requestWindowFeature(int featureId) {
32449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getWindow().requestFeature(featureId);
32459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
32489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Convenience for calling
32499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window#setFeatureDrawableResource}.
32509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
32519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setFeatureDrawableResource(int featureId, int resId) {
32529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setFeatureDrawableResource(featureId, resId);
32539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
32569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Convenience for calling
32579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window#setFeatureDrawableUri}.
32589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
32599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setFeatureDrawableUri(int featureId, Uri uri) {
32609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setFeatureDrawableUri(featureId, uri);
32619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
32649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Convenience for calling
32659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window#setFeatureDrawable(int, Drawable)}.
32669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
32679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setFeatureDrawable(int featureId, Drawable drawable) {
32689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setFeatureDrawable(featureId, drawable);
32699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
32729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Convenience for calling
32739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window#setFeatureDrawableAlpha}.
32749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
32759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setFeatureDrawableAlpha(int featureId, int alpha) {
32769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setFeatureDrawableAlpha(featureId, alpha);
32779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
32809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Convenience for calling
32819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window#getLayoutInflater}.
32829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
32839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public LayoutInflater getLayoutInflater() {
32849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getWindow().getLayoutInflater();
32859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
32889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns a {@link MenuInflater} with this context.
32899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
32909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public MenuInflater getMenuInflater() {
329188ab69780f58e4b32d497266b2ad646a4d74827bAdam Powell        // Make sure that action views can get an appropriate theme.
329288ab69780f58e4b32d497266b2ad646a4d74827bAdam Powell        if (mMenuInflater == null) {
329388ab69780f58e4b32d497266b2ad646a4d74827bAdam Powell            initActionBar();
329488ab69780f58e4b32d497266b2ad646a4d74827bAdam Powell            if (mActionBar != null) {
32959275197d35a99c3f187d18d0eda6ead3b8a32603Dianne Hackborn                mMenuInflater = new MenuInflater(mActionBar.getThemedContext(), this);
329688ab69780f58e4b32d497266b2ad646a4d74827bAdam Powell            } else {
329788ab69780f58e4b32d497266b2ad646a4d74827bAdam Powell                mMenuInflater = new MenuInflater(this);
329888ab69780f58e4b32d497266b2ad646a4d74827bAdam Powell            }
329988ab69780f58e4b32d497266b2ad646a4d74827bAdam Powell        }
330088ab69780f58e4b32d497266b2ad646a4d74827bAdam Powell        return mMenuInflater;
33019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
33029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3304bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn    protected void onApplyThemeResource(Resources.Theme theme, int resid,
3305bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            boolean first) {
33069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent == null) {
33079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super.onApplyThemeResource(theme, resid, first);
33089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
33099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
33109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                theme.setTo(mParent.getTheme());
33119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (Exception e) {
33129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Empty
33139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
33149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            theme.applyStyle(resid, false);
33159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
33169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
33179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3319a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * Same as calling {@link #startActivityForResult(Intent, int, Bundle)}
3320a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * with no options.
3321a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     *
3322a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @param intent The intent to start.
3323a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @param requestCode If >= 0, this code will be returned in
3324a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     *                    onActivityResult() when the activity exits.
3325a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     *
3326a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @throws android.content.ActivityNotFoundException
3327a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     *
3328a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @see #startActivity
3329a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     */
3330a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    public void startActivityForResult(Intent intent, int requestCode) {
3331a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        startActivityForResult(intent, requestCode, null);
3332a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    }
3333a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn
3334a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    /**
33359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Launch an activity for which you would like a result when it finished.
33369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * When this activity exits, your
33379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * onActivityResult() method will be called with the given requestCode.
33389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Using a negative requestCode is the same as calling
33399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #startActivity} (the activity is not launched as a sub-activity).
3340a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     *
33419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note that this method should only be used with Intent protocols
33429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that are defined to return a result.  In other protocols (such as
33439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link Intent#ACTION_MAIN} or {@link Intent#ACTION_VIEW}), you may
33449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not get the result when you expect.  For example, if the activity you
33459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * are launching uses the singleTask launch mode, it will not run in your
33469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * task and thus you will immediately receive a cancel result.
3347a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     *
33489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>As a special case, if you call startActivityForResult() with a requestCode
33499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * >= 0 during the initial onCreate(Bundle savedInstanceState)/onResume() of your
33509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity, then your window will not be displayed until a result is
33519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returned back from the started activity.  This is to avoid visible
33529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * flickering when redirecting to another activity.
3353a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     *
33549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This method throws {@link android.content.ActivityNotFoundException}
33559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if there was no Activity found to run the given Intent.
3356a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     *
33579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param intent The intent to start.
33589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param requestCode If >= 0, this code will be returned in
33599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                    onActivityResult() when the activity exits.
3360a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @param options Additional options for how the Activity should be started.
33617a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn     * See {@link android.content.Context#startActivity(Intent, Bundle)
33627a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn     * Context.startActivity(Intent, Bundle)} for more details.
3363a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     *
33649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws android.content.ActivityNotFoundException
3365a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     *
33669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startActivity
33679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3368a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    public void startActivityForResult(Intent intent, int requestCode, Bundle options) {
33699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent == null) {
33709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Instrumentation.ActivityResult ar =
33719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mInstrumentation.execStartActivity(
33729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    this, mMainThread.getApplicationThread(), mToken, this,
3373a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                    intent, requestCode, options);
33749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ar != null) {
33759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.sendActivityResult(
33769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mToken, mEmbeddedID, requestCode, ar.getResultCode(),
33779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ar.getResultData());
33789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
33799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (requestCode >= 0) {
33809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If this start is requesting a result, we can avoid making
33819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // the activity visible until the result is received.  Setting
33829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // this code during onCreate(Bundle savedInstanceState) or onResume() will keep the
33839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // activity hidden during this time, to avoid flickering.
33849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // This can only be done when a result is requested because
33859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // that guarantees we will get information back when the
33869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // activity is finished, no matter what happens to it.
33879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mStartedActivity = true;
33889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
33899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
3390a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            if (options != null) {
3391a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                mParent.startActivityFromChild(this, intent, requestCode, options);
3392a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            } else {
3393a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                // Note we want to go through this method for compatibility with
3394a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                // existing applications that may have overridden it.
3395a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                mParent.startActivityFromChild(this, intent, requestCode);
3396a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            }
33979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
33989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
33999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3401f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn     * @hide Implement to provide correct calling token.
3402f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn     */
3403f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn    public void startActivityAsUser(Intent intent, UserHandle user) {
3404f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn        startActivityAsUser(intent, null, user);
3405f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn    }
3406f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn
3407f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn    /**
3408f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn     * @hide Implement to provide correct calling token.
3409f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn     */
3410f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn    public void startActivityAsUser(Intent intent, Bundle options, UserHandle user) {
3411f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn        if (mParent != null) {
3412f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn            throw new RuntimeException("Called be called from a child");
3413f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn        }
3414f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn        Instrumentation.ActivityResult ar =
3415f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn                mInstrumentation.execStartActivity(
3416f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn                        this, mMainThread.getApplicationThread(), mToken, this,
3417f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn                        intent, -1, options, user);
3418f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn        if (ar != null) {
3419f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn            mMainThread.sendActivityResult(
3420f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn                mToken, mEmbeddedID, -1, ar.getResultCode(),
3421f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn                ar.getResultData());
3422f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn        }
3423f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn    }
3424f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn
3425f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn    /**
3426a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * Same as calling {@link #startIntentSenderForResult(IntentSender, int,
3427a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * Intent, int, int, int, Bundle)} with no options.
3428a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     *
3429a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @param intent The IntentSender to launch.
3430a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @param requestCode If >= 0, this code will be returned in
3431a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     *                    onActivityResult() when the activity exits.
3432a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @param fillInIntent If non-null, this will be provided as the
3433a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * intent parameter to {@link IntentSender#sendIntent}.
3434a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @param flagsMask Intent flags in the original IntentSender that you
3435a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * would like to change.
3436a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @param flagsValues Desired values for any bits set in
3437a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * <var>flagsMask</var>
3438a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @param extraFlags Always set to 0.
3439a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     */
3440a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    public void startIntentSenderForResult(IntentSender intent, int requestCode,
3441a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)
3442a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            throws IntentSender.SendIntentException {
3443a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        startIntentSenderForResult(intent, requestCode, fillInIntent, flagsMask,
3444a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                flagsValues, extraFlags, null);
3445a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    }
3446a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn
3447a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    /**
3448bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * Like {@link #startActivityForResult(Intent, int)}, but allowing you
3449fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * to use a IntentSender to describe the activity to be started.  If
3450fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * the IntentSender is for an activity, that activity will be started
3451fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * as if you had called the regular {@link #startActivityForResult(Intent, int)}
3452fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * here; otherwise, its associated action will be executed (such as
3453fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * sending a broadcast) as if you had called
3454fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * {@link IntentSender#sendIntent IntentSender.sendIntent} on it.
3455fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     *
3456fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * @param intent The IntentSender to launch.
3457bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * @param requestCode If >= 0, this code will be returned in
3458bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     *                    onActivityResult() when the activity exits.
3459bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * @param fillInIntent If non-null, this will be provided as the
3460fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * intent parameter to {@link IntentSender#sendIntent}.
3461fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * @param flagsMask Intent flags in the original IntentSender that you
3462bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * would like to change.
3463bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * @param flagsValues Desired values for any bits set in
3464bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * <var>flagsMask</var>
3465fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * @param extraFlags Always set to 0.
3466a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @param options Additional options for how the Activity should be started.
34677a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn     * See {@link android.content.Context#startActivity(Intent, Bundle)
34687a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn     * Context.startActivity(Intent, Bundle)} for more details.  If options
34697a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn     * have also been supplied by the IntentSender, options given here will
34707a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn     * override any that conflict with those given by the IntentSender.
3471bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     */
3472fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn    public void startIntentSenderForResult(IntentSender intent, int requestCode,
3473a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags,
3474a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            Bundle options) throws IntentSender.SendIntentException {
3475bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn        if (mParent == null) {
3476fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            startIntentSenderForResultInner(intent, requestCode, fillInIntent,
3477a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                    flagsMask, flagsValues, this, options);
3478a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        } else if (options != null) {
3479a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            mParent.startIntentSenderFromChild(this, intent, requestCode,
3480a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                    fillInIntent, flagsMask, flagsValues, extraFlags, options);
3481bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn        } else {
3482a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            // Note we want to go through this call for compatibility with
3483a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            // existing applications that may have overridden the method.
3484fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            mParent.startIntentSenderFromChild(this, intent, requestCode,
3485fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                    fillInIntent, flagsMask, flagsValues, extraFlags);
3486bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn        }
3487bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn    }
3488bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn
3489fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn    private void startIntentSenderForResultInner(IntentSender intent, int requestCode,
3490a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            Intent fillInIntent, int flagsMask, int flagsValues, Activity activity,
3491a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            Bundle options)
3492fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            throws IntentSender.SendIntentException {
3493bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn        try {
3494bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            String resolvedType = null;
3495bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            if (fillInIntent != null) {
34969ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn                fillInIntent.setAllowFds(false);
3497bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                resolvedType = fillInIntent.resolveTypeIfNeeded(getContentResolver());
3498bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            }
3499bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            int result = ActivityManagerNative.getDefault()
3500fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                .startActivityIntentSender(mMainThread.getApplicationThread(), intent,
3501bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        fillInIntent, resolvedType, mToken, activity.mEmbeddedID,
3502a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                        requestCode, flagsMask, flagsValues, options);
3503a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            if (result == ActivityManager.START_CANCELED) {
3504fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                throw new IntentSender.SendIntentException();
3505bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            }
3506bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            Instrumentation.checkStartActivityResult(result, null);
3507bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn        } catch (RemoteException e) {
3508bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn        }
3509bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn        if (requestCode >= 0) {
3510bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            // If this start is requesting a result, we can avoid making
3511bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            // the activity visible until the result is received.  Setting
3512bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            // this code during onCreate(Bundle savedInstanceState) or onResume() will keep the
3513bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            // activity hidden during this time, to avoid flickering.
3514bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            // This can only be done when a result is requested because
3515bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            // that guarantees we will get information back when the
3516bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            // activity is finished, no matter what happens to it.
3517bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            mStartedActivity = true;
3518bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn        }
3519bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn    }
3520bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn
3521bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn    /**
3522a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * Same as {@link #startActivity(Intent, Bundle)} with no options
3523a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * specified.
3524a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     *
3525a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @param intent The intent to start.
3526a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     *
3527a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @throws android.content.ActivityNotFoundException
3528a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     *
3529a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @see {@link #startActivity(Intent, Bundle)}
3530a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @see #startActivityForResult
3531a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     */
3532a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    @Override
3533a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    public void startActivity(Intent intent) {
3534a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        startActivity(intent, null);
3535a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    }
3536a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn
3537a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    /**
35389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Launch a new activity.  You will not receive any information about when
35399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the activity exits.  This implementation overrides the base version,
35409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * providing information about
35419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the activity performing the launch.  Because of this additional
35429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * information, the {@link Intent#FLAG_ACTIVITY_NEW_TASK} launch flag is not
35439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * required; if not specified, the new activity will be added to the
35449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * task of the caller.
35459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
35469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This method throws {@link android.content.ActivityNotFoundException}
35479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if there was no Activity found to run the given Intent.
35489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
35499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param intent The intent to start.
3550a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @param options Additional options for how the Activity should be started.
35517a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn     * See {@link android.content.Context#startActivity(Intent, Bundle)
35527a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn     * Context.startActivity(Intent, Bundle)} for more details.
35539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
35549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws android.content.ActivityNotFoundException
3555a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     *
3556a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @see {@link #startActivity(Intent)}
35579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startActivityForResult
35589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
35599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3560a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    public void startActivity(Intent intent, Bundle options) {
3561a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        if (options != null) {
3562a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            startActivityForResult(intent, -1, options);
3563a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        } else {
3564a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            // Note we want to go through this call for compatibility with
3565a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            // applications that may have overridden the method.
3566a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            startActivityForResult(intent, -1);
3567a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        }
3568a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    }
3569a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn
3570a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    /**
3571a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * Same as {@link #startActivities(Intent[], Bundle)} with no options
3572a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * specified.
3573a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     *
3574a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @param intents The intents to start.
3575a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     *
3576a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @throws android.content.ActivityNotFoundException
3577a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     *
3578a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @see {@link #startActivities(Intent[], Bundle)}
3579a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @see #startActivityForResult
3580a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     */
3581a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    @Override
3582a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    public void startActivities(Intent[] intents) {
3583a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        startActivities(intents, null);
35849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
35859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3587621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     * Launch a new activity.  You will not receive any information about when
3588621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     * the activity exits.  This implementation overrides the base version,
3589621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     * providing information about
3590621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     * the activity performing the launch.  Because of this additional
3591621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     * information, the {@link Intent#FLAG_ACTIVITY_NEW_TASK} launch flag is not
3592621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     * required; if not specified, the new activity will be added to the
3593621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     * task of the caller.
3594621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     *
3595621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     * <p>This method throws {@link android.content.ActivityNotFoundException}
3596621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     * if there was no Activity found to run the given Intent.
3597621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     *
3598621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     * @param intents The intents to start.
3599a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @param options Additional options for how the Activity should be started.
36007a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn     * See {@link android.content.Context#startActivity(Intent, Bundle)
36017a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn     * Context.startActivity(Intent, Bundle)} for more details.
3602621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     *
3603621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     * @throws android.content.ActivityNotFoundException
3604621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     *
3605a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @see {@link #startActivities(Intent[])}
3606621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     * @see #startActivityForResult
3607621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     */
3608621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    @Override
3609a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    public void startActivities(Intent[] intents, Bundle options) {
3610621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        mInstrumentation.execStartActivities(this, mMainThread.getApplicationThread(),
3611a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                mToken, this, intents, options);
3612621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    }
3613621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3614621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    /**
3615a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * Same as calling {@link #startIntentSender(IntentSender, Intent, int, int, int, Bundle)}
3616a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * with no options.
3617bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     *
3618fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * @param intent The IntentSender to launch.
3619bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * @param fillInIntent If non-null, this will be provided as the
3620fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * intent parameter to {@link IntentSender#sendIntent}.
3621fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * @param flagsMask Intent flags in the original IntentSender that you
3622bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * would like to change.
3623bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * @param flagsValues Desired values for any bits set in
3624bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * <var>flagsMask</var>
3625fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * @param extraFlags Always set to 0.
3626bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     */
3627fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn    public void startIntentSender(IntentSender intent,
3628fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)
3629fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            throws IntentSender.SendIntentException {
3630a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        startIntentSender(intent, fillInIntent, flagsMask, flagsValues,
3631a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                extraFlags, null);
3632a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    }
3633a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn
3634a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    /**
3635a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * Like {@link #startActivity(Intent, Bundle)}, but taking a IntentSender
3636a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * to start; see
3637a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * {@link #startIntentSenderForResult(IntentSender, int, Intent, int, int, int, Bundle)}
3638a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * for more information.
3639a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     *
3640a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @param intent The IntentSender to launch.
3641a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @param fillInIntent If non-null, this will be provided as the
3642a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * intent parameter to {@link IntentSender#sendIntent}.
3643a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @param flagsMask Intent flags in the original IntentSender that you
3644a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * would like to change.
3645a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @param flagsValues Desired values for any bits set in
3646a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * <var>flagsMask</var>
3647a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @param extraFlags Always set to 0.
3648a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @param options Additional options for how the Activity should be started.
36497a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn     * See {@link android.content.Context#startActivity(Intent, Bundle)
36507a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn     * Context.startActivity(Intent, Bundle)} for more details.  If options
36517a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn     * have also been supplied by the IntentSender, options given here will
36527a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn     * override any that conflict with those given by the IntentSender.
3653a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     */
3654a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    public void startIntentSender(IntentSender intent,
3655a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags,
3656a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            Bundle options) throws IntentSender.SendIntentException {
3657a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        if (options != null) {
3658a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            startIntentSenderForResult(intent, -1, fillInIntent, flagsMask,
3659a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                    flagsValues, extraFlags, options);
3660a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        } else {
3661a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            // Note we want to go through this call for compatibility with
3662a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            // applications that may have overridden the method.
3663a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            startIntentSenderForResult(intent, -1, fillInIntent, flagsMask,
3664a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                    flagsValues, extraFlags);
3665a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        }
3666a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    }
3667a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn
3668a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    /**
3669a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * Same as calling {@link #startActivityIfNeeded(Intent, int, Bundle)}
3670a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * with no options.
3671a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     *
3672a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @param intent The intent to start.
3673a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @param requestCode If >= 0, this code will be returned in
3674a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     *         onActivityResult() when the activity exits, as described in
3675a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     *         {@link #startActivityForResult}.
3676a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     *
3677a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @return If a new activity was launched then true is returned; otherwise
3678a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     *         false is returned and you must handle the Intent yourself.
3679a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     *
3680a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @see #startActivity
3681a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @see #startActivityForResult
3682a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     */
3683a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    public boolean startActivityIfNeeded(Intent intent, int requestCode) {
3684a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        return startActivityIfNeeded(intent, requestCode, null);
3685bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn    }
3686bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn
3687bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn    /**
36889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A special variation to launch an activity only if a new activity
36899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * instance is needed to handle the given Intent.  In other words, this is
36909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * just like {@link #startActivityForResult(Intent, int)} except: if you are
36919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * using the {@link Intent#FLAG_ACTIVITY_SINGLE_TOP} flag, or
36929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * singleTask or singleTop
36939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.R.styleable#AndroidManifestActivity_launchMode launchMode},
36949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and the activity
36959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that handles <var>intent</var> is the same as your currently running
36969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity, then a new instance is not needed.  In this case, instead of
36979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the normal behavior of calling {@link #onNewIntent} this function will
36989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * return and you can handle the Intent yourself.
36999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
37009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This function can only be called from a top-level activity; if it is
37019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * called from a child activity, a runtime exception will be thrown.
37029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
37039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param intent The intent to start.
37049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param requestCode If >= 0, this code will be returned in
37059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         onActivityResult() when the activity exits, as described in
37069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         {@link #startActivityForResult}.
3707a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @param options Additional options for how the Activity should be started.
37087a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn     * See {@link android.content.Context#startActivity(Intent, Bundle)
37097a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn     * Context.startActivity(Intent, Bundle)} for more details.
37109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
37119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return If a new activity was launched then true is returned; otherwise
37129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         false is returned and you must handle the Intent yourself.
37139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
37149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startActivity
37159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startActivityForResult
37169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3717a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    public boolean startActivityIfNeeded(Intent intent, int requestCode, Bundle options) {
37189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent == null) {
3719a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            int result = ActivityManager.START_RETURN_INTENT_TO_CALLER;
37209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
37219ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn                intent.setAllowFds(false);
37229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                result = ActivityManagerNative.getDefault()
37239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    .startActivity(mMainThread.getApplicationThread(),
372492a8b22e7410e74e1cba1b856333116652af8a5cSiva Velusamy                            intent, intent.resolveTypeIfNeeded(getContentResolver()),
3725a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                            mToken, mEmbeddedID, requestCode,
3726a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                            ActivityManager.START_FLAG_ONLY_IF_NEEDED, null, null,
3727a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                            options);
37289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
37299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Empty
37309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
373192a8b22e7410e74e1cba1b856333116652af8a5cSiva Velusamy
37329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Instrumentation.checkStartActivityResult(result, intent);
373392a8b22e7410e74e1cba1b856333116652af8a5cSiva Velusamy
37349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (requestCode >= 0) {
37359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If this start is requesting a result, we can avoid making
37369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // the activity visible until the result is received.  Setting
37379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // this code during onCreate(Bundle savedInstanceState) or onResume() will keep the
37389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // activity hidden during this time, to avoid flickering.
37399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // This can only be done when a result is requested because
37409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // that guarantees we will get information back when the
37419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // activity is finished, no matter what happens to it.
37429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mStartedActivity = true;
37439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3744a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            return result != ActivityManager.START_RETURN_INTENT_TO_CALLER;
37459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
37469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new UnsupportedOperationException(
37489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "startActivityIfNeeded can only be called from a top-level activity");
37499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
37509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3752a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * Same as calling {@link #startNextMatchingActivity(Intent, Bundle)} with
3753a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * no options.
3754a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     *
3755a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @param intent The intent to dispatch to the next activity.  For
3756a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * correct behavior, this must be the same as the Intent that started
3757a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * your own activity; the only changes you can make are to the extras
3758a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * inside of it.
3759a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     *
3760a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @return Returns a boolean indicating whether there was another Activity
3761a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * to start: true if there was a next activity to start, false if there
3762a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * wasn't.  In general, if true is returned you will then want to call
3763a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * finish() on yourself.
3764a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     */
3765a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    public boolean startNextMatchingActivity(Intent intent) {
3766a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        return startNextMatchingActivity(intent, null);
3767a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    }
3768a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn
3769a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    /**
37709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Special version of starting an activity, for use when you are replacing
37719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * other activity components.  You can use this to hand the Intent off
37729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to the next Activity that can handle it.  You typically call this in
37739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onCreate} with the Intent returned by {@link #getIntent}.
37749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
37759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param intent The intent to dispatch to the next activity.  For
37769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * correct behavior, this must be the same as the Intent that started
37779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * your own activity; the only changes you can make are to the extras
37789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * inside of it.
3779a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @param options Additional options for how the Activity should be started.
37807a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn     * See {@link android.content.Context#startActivity(Intent, Bundle)
37817a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn     * Context.startActivity(Intent, Bundle)} for more details.
37829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
37839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns a boolean indicating whether there was another Activity
37849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to start: true if there was a next activity to start, false if there
37859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * wasn't.  In general, if true is returned you will then want to call
37869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * finish() on yourself.
37879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3788a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    public boolean startNextMatchingActivity(Intent intent, Bundle options) {
37899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent == null) {
37909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
37919ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn                intent.setAllowFds(false);
37929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return ActivityManagerNative.getDefault()
3793a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                    .startNextMatchingActivity(mToken, intent, options);
37949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
37959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Empty
37969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
37979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
37989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
37999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new UnsupportedOperationException(
38019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "startNextMatchingActivity can only be called from a top-level activity");
38029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3803a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn
3804a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    /**
3805a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * Same as calling {@link #startActivityFromChild(Activity, Intent, int, Bundle)}
3806a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * with no options.
3807a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     *
3808a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @param child The activity making the call.
3809a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @param intent The intent to start.
3810a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @param requestCode Reply request code.  < 0 if reply is not requested.
3811a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     *
3812a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @throws android.content.ActivityNotFoundException
3813a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     *
3814a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @see #startActivity
3815a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @see #startActivityForResult
3816a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     */
3817a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    public void startActivityFromChild(Activity child, Intent intent,
3818a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            int requestCode) {
38198078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        startActivityFromChild(child, intent, requestCode, null);
3820a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    }
3821a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn
38229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
38239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is called when a child activity of this one calls its
38249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #startActivity} or {@link #startActivityForResult} method.
38259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
38269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This method throws {@link android.content.ActivityNotFoundException}
38279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if there was no Activity found to run the given Intent.
38289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
38299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param child The activity making the call.
38309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param intent The intent to start.
3831a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @param requestCode Reply request code.  < 0 if reply is not requested.
3832a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @param options Additional options for how the Activity should be started.
38337a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn     * See {@link android.content.Context#startActivity(Intent, Bundle)
38347a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn     * Context.startActivity(Intent, Bundle)} for more details.
38359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
38369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws android.content.ActivityNotFoundException
38379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
38389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startActivity
38399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startActivityForResult
38409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
38419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startActivityFromChild(Activity child, Intent intent,
3842a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            int requestCode, Bundle options) {
38439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Instrumentation.ActivityResult ar =
38449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mInstrumentation.execStartActivity(
38459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                this, mMainThread.getApplicationThread(), mToken, child,
3846a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                intent, requestCode, options);
38479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ar != null) {
38489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mMainThread.sendActivityResult(
38499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mToken, child.mEmbeddedID, requestCode,
38509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ar.getResultCode(), ar.getResultData());
38519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
38529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
38539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3855a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * Same as calling {@link #startActivityFromFragment(Fragment, Intent, int, Bundle)}
3856a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * with no options.
3857a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     *
3858a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @param fragment The fragment making the call.
3859a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @param intent The intent to start.
3860a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @param requestCode Reply request code.  < 0 if reply is not requested.
3861a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     *
3862a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @throws android.content.ActivityNotFoundException
3863a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     *
3864a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @see Fragment#startActivity
3865a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @see Fragment#startActivityForResult
3866a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     */
3867a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    public void startActivityFromFragment(Fragment fragment, Intent intent,
3868a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            int requestCode) {
3869a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        startActivityFromFragment(fragment, intent, requestCode, null);
3870a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    }
3871a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn
3872a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    /**
38736e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * This is called when a Fragment in this activity calls its
38746e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * {@link Fragment#startActivity} or {@link Fragment#startActivityForResult}
38756e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * method.
38766e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     *
38776e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * <p>This method throws {@link android.content.ActivityNotFoundException}
38786e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * if there was no Activity found to run the given Intent.
38796e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     *
38806e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * @param fragment The fragment making the call.
38816e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * @param intent The intent to start.
38826e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * @param requestCode Reply request code.  < 0 if reply is not requested.
3883a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @param options Additional options for how the Activity should be started.
38847a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn     * See {@link android.content.Context#startActivity(Intent, Bundle)
38857a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn     * Context.startActivity(Intent, Bundle)} for more details.
38866e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     *
38876e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * @throws android.content.ActivityNotFoundException
38886e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     *
38896e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * @see Fragment#startActivity
38906e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * @see Fragment#startActivityForResult
38916e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     */
38926e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    public void startActivityFromFragment(Fragment fragment, Intent intent,
3893a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            int requestCode, Bundle options) {
38946e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        Instrumentation.ActivityResult ar =
38956e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            mInstrumentation.execStartActivity(
38966e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                this, mMainThread.getApplicationThread(), mToken, fragment,
3897a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                intent, requestCode, options);
38986e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (ar != null) {
38996e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            mMainThread.sendActivityResult(
39006e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                mToken, fragment.mWho, requestCode,
39016e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                ar.getResultCode(), ar.getResultData());
39026e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        }
39036e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    }
39046e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn
39056e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    /**
3906a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * Same as calling {@link #startIntentSenderFromChild(Activity, IntentSender,
3907a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * int, Intent, int, int, int, Bundle)} with no options.
3908a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     */
3909a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    public void startIntentSenderFromChild(Activity child, IntentSender intent,
3910a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            int requestCode, Intent fillInIntent, int flagsMask, int flagsValues,
3911a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            int extraFlags)
3912a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            throws IntentSender.SendIntentException {
3913a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        startIntentSenderFromChild(child, intent, requestCode, fillInIntent,
3914a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                flagsMask, flagsValues, extraFlags, null);
3915a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    }
3916a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn
3917a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    /**
3918bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * Like {@link #startActivityFromChild(Activity, Intent, int)}, but
3919fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * taking a IntentSender; see
3920ae22c05b91d1e7a458066792eb5cfc0974c1be9eDianne Hackborn     * {@link #startIntentSenderForResult(IntentSender, int, Intent, int, int, int)}
3921bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * for more information.
3922bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     */
3923fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn    public void startIntentSenderFromChild(Activity child, IntentSender intent,
3924fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            int requestCode, Intent fillInIntent, int flagsMask, int flagsValues,
3925a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            int extraFlags, Bundle options)
3926fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            throws IntentSender.SendIntentException {
3927fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn        startIntentSenderForResultInner(intent, requestCode, fillInIntent,
3928a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                flagsMask, flagsValues, child, options);
3929bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn    }
3930bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn
3931bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn    /**
39323b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn     * Call immediately after one of the flavors of {@link #startActivity(Intent)}
39333b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn     * or {@link #finish} to specify an explicit transition animation to
39343b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn     * perform next.
39357a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn     *
39367a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn     * <p>As of {@link android.os.Build.VERSION_CODES#JELLY_BEAN} an alternative
39377a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn     * to using this with starting activities is to supply the desired animation
39387a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn     * information through a {@link ActivityOptions} bundle to
39397a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn     * {@link #startActivity(Intent, Bundle) or a related function.  This allows
39407a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn     * you to specify a custom animation even when starting an activity from
39417a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn     * outside the context of the current top activity.
39427a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn     *
39433b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn     * @param enterAnim A resource ID of the animation resource to use for
39448b571a817cc953ce96750f440645f104c7f55157Dianne Hackborn     * the incoming activity.  Use 0 for no animation.
39453b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn     * @param exitAnim A resource ID of the animation resource to use for
39468b571a817cc953ce96750f440645f104c7f55157Dianne Hackborn     * the outgoing activity.  Use 0 for no animation.
39473b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn     */
39483b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn    public void overridePendingTransition(int enterAnim, int exitAnim) {
39493b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        try {
39503b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            ActivityManagerNative.getDefault().overridePendingTransition(
39513b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    mToken, getPackageName(), enterAnim, exitAnim);
39523b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        } catch (RemoteException e) {
39533b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        }
39543b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn    }
39553b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn
39563b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn    /**
39579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Call this to set the result that your activity will return to its
39589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * caller.
39599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
39609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param resultCode The result code to propagate back to the originating
39619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                   activity, often RESULT_CANCELED or RESULT_OK
39629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
39639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #RESULT_CANCELED
39649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #RESULT_OK
39659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #RESULT_FIRST_USER
39669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setResult(int, Intent)
39679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
39689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setResult(int resultCode) {
39699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (this) {
39709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mResultCode = resultCode;
39719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mResultData = null;
39729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
39749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
39769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Call this to set the result that your activity will return to its
39779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * caller.
397821c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn     *
397921c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn     * <p>As of {@link android.os.Build.VERSION_CODES#GINGERBREAD}, the Intent
398021c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn     * you supply here can have {@link Intent#FLAG_GRANT_READ_URI_PERMISSION
398121c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn     * Intent.FLAG_GRANT_READ_URI_PERMISSION} and/or {@link Intent#FLAG_GRANT_WRITE_URI_PERMISSION
398221c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn     * Intent.FLAG_GRANT_WRITE_URI_PERMISSION} set.  This will grant the
398321c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn     * Activity receiving the result access to the specific URIs in the Intent.
398421c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn     * Access will remain until the Activity has finished (it will remain across the hosting
398521c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn     * process being killed and other temporary destruction) and will be added
398621c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn     * to any existing set of URI permissions it already holds.
398721c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn     *
39889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param resultCode The result code to propagate back to the originating
39899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                   activity, often RESULT_CANCELED or RESULT_OK
39909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param data The data to propagate back to the originating activity.
39919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
39929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #RESULT_CANCELED
39939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #RESULT_OK
39949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #RESULT_FIRST_USER
39959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setResult(int)
39969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
39979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setResult(int resultCode, Intent data) {
39989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (this) {
39999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mResultCode = resultCode;
40009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mResultData = data;
40019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
40059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the name of the package that invoked this activity.  This is who
40069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the data in {@link #setResult setResult()} will be sent to.  You can
40079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * use this information to validate that the recipient is allowed to
40089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * receive the data.
40099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
40109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note: if the calling activity is not expecting a result (that is it
40119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * did not use the {@link #startActivityForResult}
40129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * form that includes a request code), then the calling package will be
40139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * null.
40149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
40159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The package of the activity that will receive your
40169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         reply, or null if none.
40179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
40189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getCallingPackage() {
40199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
40209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().getCallingPackage(mToken);
40219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
40229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
40239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
40279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the name of the activity that invoked this activity.  This is
40289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * who the data in {@link #setResult setResult()} will be sent to.  You
40299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * can use this information to validate that the recipient is allowed to
40309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * receive the data.
40319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
40329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note: if the calling activity is not expecting a result (that is it
40339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * did not use the {@link #startActivityForResult}
40349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * form that includes a request code), then the calling package will be
40359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * null.
40369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
40379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return String The full name of the activity that will receive your
40389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         reply, or null if none.
40399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
40409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ComponentName getCallingActivity() {
40419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
40429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().getCallingActivity(mToken);
40439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
40449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
40459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
40499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Control whether this activity's main window is visible.  This is intended
40509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * only for the special case of an activity that is not going to show a
40519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * UI itself, but can't just finish prior to onResume() because it needs
40529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to wait for a service binding or such.  Setting this to false allows
40539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * you to prevent your UI from being shown during that time.
40549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
40559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The default value for this is taken from the
40569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.R.attr#windowNoDisplay} attribute of the activity's theme.
40579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
40589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setVisible(boolean visible) {
40599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mVisibleFromClient != visible) {
40609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mVisibleFromClient = visible;
40619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mVisibleFromServer) {
40629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (visible) makeVisible();
40639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                else mDecor.setVisibility(View.INVISIBLE);
40649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
40659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void makeVisible() {
40699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mWindowAdded) {
40709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ViewManager wm = getWindowManager();
40719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wm.addView(mDecor, getWindow().getAttributes());
40729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindowAdded = true;
40739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDecor.setVisibility(View.VISIBLE);
40759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
40789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Check to see whether this activity is in the process of finishing,
40799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * either because you called {@link #finish} on it or someone else
40809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * has requested that it finished.  This is often used in
40819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onPause} to determine whether the activity is simply pausing or
40829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * completely finishing.
40839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
40849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return If the activity is finishing, returns true; else returns false.
40859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
40869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #finish
40879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
40889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isFinishing() {
40899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mFinished;
40909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
40936d9dcbccec126d9b87ab6587e686e28b87e5a04dDianne Hackborn     * Returns true if the final {@link #onDestroy()} call has been made
40946d9dcbccec126d9b87ab6587e686e28b87e5a04dDianne Hackborn     * on the Activity, so this instance is now dead.
40956d9dcbccec126d9b87ab6587e686e28b87e5a04dDianne Hackborn     */
40966d9dcbccec126d9b87ab6587e686e28b87e5a04dDianne Hackborn    public boolean isDestroyed() {
40976d9dcbccec126d9b87ab6587e686e28b87e5a04dDianne Hackborn        return mDestroyed;
40986d9dcbccec126d9b87ab6587e686e28b87e5a04dDianne Hackborn    }
40996d9dcbccec126d9b87ab6587e686e28b87e5a04dDianne Hackborn
41006d9dcbccec126d9b87ab6587e686e28b87e5a04dDianne Hackborn    /**
41013d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton     * Check to see whether this activity is in the process of being destroyed in order to be
41023d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton     * recreated with a new configuration. This is often used in
41033d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton     * {@link #onStop} to determine whether the state needs to be cleaned up or will be passed
41043d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton     * on to the next instance of the activity via {@link #onRetainNonConfigurationInstance()}.
41053d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton     *
41063d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton     * @return If the activity is being torn down in order to be recreated with a new configuration,
41073d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton     * returns true; else returns false.
41083d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton     */
41093d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton    public boolean isChangingConfigurations() {
41103d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton        return mChangingConfigurations;
41113d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton    }
41123d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton
41133d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton    /**
411430c9bd89556137157b2f686637ece961454ccabeDianne Hackborn     * Cause this Activity to be recreated with a new instance.  This results
411530c9bd89556137157b2f686637ece961454ccabeDianne Hackborn     * in essentially the same flow as when the Activity is created due to
411630c9bd89556137157b2f686637ece961454ccabeDianne Hackborn     * a configuration change -- the current instance will go through its
411730c9bd89556137157b2f686637ece961454ccabeDianne Hackborn     * lifecycle to {@link #onDestroy} and a new instance then created after it.
411830c9bd89556137157b2f686637ece961454ccabeDianne Hackborn     */
411930c9bd89556137157b2f686637ece961454ccabeDianne Hackborn    public void recreate() {
412030c9bd89556137157b2f686637ece961454ccabeDianne Hackborn        if (mParent != null) {
412130c9bd89556137157b2f686637ece961454ccabeDianne Hackborn            throw new IllegalStateException("Can only be called on top-level activity");
412230c9bd89556137157b2f686637ece961454ccabeDianne Hackborn        }
412330c9bd89556137157b2f686637ece961454ccabeDianne Hackborn        if (Looper.myLooper() != mMainThread.getLooper()) {
412430c9bd89556137157b2f686637ece961454ccabeDianne Hackborn            throw new IllegalStateException("Must be called from main thread");
412530c9bd89556137157b2f686637ece961454ccabeDianne Hackborn        }
412630c9bd89556137157b2f686637ece961454ccabeDianne Hackborn        mMainThread.requestRelaunchActivity(mToken, null, null, 0, false, null, false);
412730c9bd89556137157b2f686637ece961454ccabeDianne Hackborn    }
412830c9bd89556137157b2f686637ece961454ccabeDianne Hackborn
412930c9bd89556137157b2f686637ece961454ccabeDianne Hackborn    /**
41309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Call this when your activity is done and should be closed.  The
41319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ActivityResult is propagated back to whoever launched you via
41329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * onActivityResult().
41339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
41349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void finish() {
41359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent == null) {
41369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int resultCode;
41379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Intent resultData;
41389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (this) {
41399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                resultCode = mResultCode;
41409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                resultData = mResultData;
41419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
414243a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato            if (false) Log.v(TAG, "Finishing self: token=" + mToken);
41439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
41449ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn                if (resultData != null) {
41459ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn                    resultData.setAllowFds(false);
41469ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn                }
41479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ActivityManagerNative.getDefault()
41489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    .finishActivity(mToken, resultCode, resultData)) {
41499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mFinished = true;
41509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
41519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
41529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Empty
41539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
41549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
41559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParent.finishFromChild(this);
41569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
41579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4160ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn     * Finish this activity as well as all activities immediately below it
4161ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn     * in the current task that have the same affinity.  This is typically
4162ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn     * used when an application can be launched on to another task (such as
4163ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn     * from an ACTION_VIEW of a content type it understands) and the user
4164ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn     * has used the up navigation to switch out of the current task and in
4165ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn     * to its own task.  In this case, if the user has navigated down into
4166ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn     * any other activities of the second application, all of those should
4167ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn     * be removed from the original task as part of the task switch.
4168ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn     *
4169ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn     * <p>Note that this finish does <em>not</em> allow you to deliver results
4170ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn     * to the previous activity, and an exception will be thrown if you are trying
4171ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn     * to do so.</p>
4172ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn     */
4173ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn    public void finishAffinity() {
4174ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn        if (mParent != null) {
4175ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn            throw new IllegalStateException("Can not be called from an embedded activity");
4176ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn        }
4177ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn        if (mResultCode != RESULT_CANCELED || mResultData != null) {
4178ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn            throw new IllegalStateException("Can not be called to deliver a result");
4179ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn        }
4180ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn        try {
4181ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn            if (ActivityManagerNative.getDefault().finishActivityAffinity(mToken)) {
4182ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn                mFinished = true;
4183ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn            }
4184ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn        } catch (RemoteException e) {
4185ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn            // Empty
4186ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn        }
4187ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn    }
4188ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn
4189ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn    /**
41909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is called when a child activity of this one calls its
41919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #finish} method.  The default implementation simply calls
41929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * finish() on this activity (the parent), finishing the entire group.
41939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
41949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param child The activity making the call.
41959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
41969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #finish
41979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
41989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void finishFromChild(Activity child) {
41999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        finish();
42009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
42019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
42039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Force finish another activity that you had previously started with
42049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #startActivityForResult}.
42059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
42069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param requestCode The request code of the activity that you had
42079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                    given to startActivityForResult().  If there are multiple
42089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                    activities started with this request code, they
42099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                    will all be finished.
42109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
42119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void finishActivity(int requestCode) {
42129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent == null) {
42139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
42149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityManagerNative.getDefault()
42159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    .finishSubActivity(mToken, mEmbeddedID, requestCode);
42169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
42179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Empty
42189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
42199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
42209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParent.finishActivityFromChild(this, requestCode);
42219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
42239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
42259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is called when a child activity of this one calls its
42269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * finishActivity().
42279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
42289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param child The activity making the call.
42299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param requestCode Request code that had been used to start the
42309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                    activity.
42319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
42329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void finishActivityFromChild(Activity child, int requestCode) {
42339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
42349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault()
42359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                .finishSubActivity(mToken, child.mEmbeddedID, requestCode);
42369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
42379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Empty
42389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
42409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
42429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when an activity you launched exits, giving you the requestCode
42439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * you started it with, the resultCode it returned, and any additional
42449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * data from it.  The <var>resultCode</var> will be
42459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #RESULT_CANCELED} if the activity explicitly returned that,
42469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * didn't return any result, or crashed during its operation.
42479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
42489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>You will receive this call immediately before onResume() when your
42499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity is re-starting.
42509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
42519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param requestCode The integer request code originally supplied to
42529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                    startActivityForResult(), allowing you to identify who this
42539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                    result came from.
42549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param resultCode The integer result code returned by the child activity
42559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                   through its setResult().
42569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param data An Intent, which can return result data to the caller
42579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *               (various data can be attached to Intent "extras").
42589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
42599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startActivityForResult
42609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #createPendingResult
42619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setResult(int)
42629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
42636e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
42649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
42659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
42679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new PendingIntent object which you can hand to others
42689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for them to use to send result data back to your
42699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onActivityResult} callback.  The created object will be either
42709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * one-shot (becoming invalid after a result is sent back) or multiple
42719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * (allowing any number of results to be sent through it).
42729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
42739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param requestCode Private request code for the sender that will be
42749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * associated with the result data when it is returned.  The sender can not
42759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * modify this value, allowing you to identify incoming results.
42769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param data Default data to supply in the result, which may be modified
42779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * by the sender.
42789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param flags May be {@link PendingIntent#FLAG_ONE_SHOT PendingIntent.FLAG_ONE_SHOT},
42799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link PendingIntent#FLAG_NO_CREATE PendingIntent.FLAG_NO_CREATE},
42809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link PendingIntent#FLAG_CANCEL_CURRENT PendingIntent.FLAG_CANCEL_CURRENT},
42819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link PendingIntent#FLAG_UPDATE_CURRENT PendingIntent.FLAG_UPDATE_CURRENT},
42829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * or any of the flags as supported by
42839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link Intent#fillIn Intent.fillIn()} to control which unspecified parts
42849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of the intent that can be supplied when the actual send happens.
42859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
42869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns an existing or new PendingIntent matching the given
42879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * parameters.  May return null only if
42889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link PendingIntent#FLAG_NO_CREATE PendingIntent.FLAG_NO_CREATE} has been
42899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * supplied.
42909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
42919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see PendingIntent
42929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
42939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public PendingIntent createPendingResult(int requestCode, Intent data,
42949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int flags) {
42959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String packageName = getPackageName();
42969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
42979ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            data.setAllowFds(false);
42989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IIntentSender target =
42999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityManagerNative.getDefault().getIntentSender(
4300a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                        ActivityManager.INTENT_SENDER_ACTIVITY_RESULT, packageName,
43019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mParent == null ? mToken : mParent.mToken,
43024120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn                        mEmbeddedID, requestCode, new Intent[] { data }, null, flags, null,
43034120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn                        UserHandle.myUserId());
43049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return target != null ? new PendingIntent(target) : null;
43059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
43069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Empty
43079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
43089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
43099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
43109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
43129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Change the desired orientation of this activity.  If the activity
43139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is currently in the foreground or otherwise impacting the screen
43149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * orientation, the screen will immediately be changed (possibly causing
43159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the activity to be restarted). Otherwise, this will be used the next
43169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * time the activity is visible.
43179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
43189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param requestedOrientation An orientation constant as used in
43199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link ActivityInfo#screenOrientation ActivityInfo.screenOrientation}.
43209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
43219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setRequestedOrientation(int requestedOrientation) {
43229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent == null) {
43239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
43249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityManagerNative.getDefault().setRequestedOrientation(
43259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mToken, requestedOrientation);
43269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
43279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Empty
43289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
43299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
43309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParent.setRequestedOrientation(requestedOrientation);
43319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
43329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
43339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
43359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the current requested orientation of the activity.  This will
43369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * either be the orientation requested in its component's manifest, or
43379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the last requested orientation given to
43389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setRequestedOrientation(int)}.
43399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
43409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns an orientation constant as used in
43419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link ActivityInfo#screenOrientation ActivityInfo.screenOrientation}.
43429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
43439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getRequestedOrientation() {
43449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent == null) {
43459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
43469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return ActivityManagerNative.getDefault()
43479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        .getRequestedOrientation(mToken);
43489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
43499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Empty
43509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
43519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
43529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mParent.getRequestedOrientation();
43539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
43549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
43559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
43569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
43589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the identifier of the task this activity is in.  This identifier
43599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will remain the same for the lifetime of the activity.
43609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
43619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Task identifier, an opaque integer.
43629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
43639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getTaskId() {
43649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
43659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault()
43669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                .getTaskForActivity(mToken, false);
43679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
43689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return -1;
43699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
43709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
43719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
43739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return whether this activity is the root of a task.  The root is the
43749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * first activity in a task.
43759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
43769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if this is the root activity, else false.
43779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
43789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isTaskRoot() {
43799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
43809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault()
43819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                .getTaskForActivity(mToken, true) >= 0;
43829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
43839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
43849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
43859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
43869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
43889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Move the task containing this activity to the back of the activity
43899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * stack.  The activity's order within the task is unchanged.
43909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
43919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param nonRoot If false then this only works if the activity is the root
43929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                of a task; if true it will work for any activity in
43939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                a task.
43949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
43959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return If the task was moved (or it was already at the
43969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         back) true is returned, else false.
43979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
43989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean moveTaskToBack(boolean nonRoot) {
43999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
44009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().moveActivityTaskToBack(
44019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mToken, nonRoot);
44029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
44039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Empty
44049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
44069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
44099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns class name for this activity with the package prefix removed.
44109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is the default name used to read and write settings.
44119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
44129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The local class name.
44139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
44149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getLocalClassName() {
44159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String pkg = getPackageName();
44169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String cls = mComponent.getClassName();
44179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int packageLen = pkg.length();
44189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!cls.startsWith(pkg) || cls.length() <= packageLen
44199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                || cls.charAt(packageLen) != '.') {
44209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return cls;
44219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return cls.substring(packageLen+1);
44239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
44269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns complete component name of this activity.
44279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
44289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the complete component name for this activity
44299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
44309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ComponentName getComponentName()
44319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
44329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mComponent;
44339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
44369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve a {@link SharedPreferences} object for accessing preferences
44379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that are private to this activity.  This simply calls the underlying
44389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getSharedPreferences(String, int)} method by passing in this activity's
44399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * class name as the preferences name.
44409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
44419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param mode Operating mode.  Use {@link #MODE_PRIVATE} for the default
44429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             operation, {@link #MODE_WORLD_READABLE} and
44439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             {@link #MODE_WORLD_WRITEABLE} to control permissions.
44449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
44459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the single SharedPreferences instance that can be used
44469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         to retrieve and modify the preference values.
44479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
44489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public SharedPreferences getPreferences(int mode) {
44499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getSharedPreferences(getLocalClassName(), mode);
44509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4452b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn    private void ensureSearchManager() {
4453b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn        if (mSearchManager != null) {
4454b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn            return;
4455b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn        }
4456b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn
4457e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani        mSearchManager = new SearchManager(this, null);
4458b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn    }
4459b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn
44609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
44619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Object getSystemService(String name) {
44629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (getBaseContext() == null) {
44639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalStateException(
44649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "System services not available to Activities before onCreate()");
44659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (WINDOW_SERVICE.equals(name)) {
44689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mWindowManager;
44698d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert        } else if (SEARCH_SERVICE.equals(name)) {
4470b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn            ensureSearchManager();
44718d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert            return mSearchManager;
44729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return super.getSystemService(name);
44749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
44779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Change the title associated with this activity.  If this is a
44789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * top-level activity, the title for its window will change.  If it
44799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is an embedded activity, the parent can do whatever it wants
44809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * with it.
44819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
44829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setTitle(CharSequence title) {
44839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTitle = title;
44849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onTitleChanged(title, mTitleColor);
44859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent != null) {
44879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParent.onChildTitleChanged(this, title);
44889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
44929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Change the title associated with this activity.  If this is a
44939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * top-level activity, the title for its window will change.  If it
44949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is an embedded activity, the parent can do whatever it wants
44959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * with it.
44969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
44979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setTitle(int titleId) {
44989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setTitle(getText(titleId));
44999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setTitleColor(int textColor) {
45029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTitleColor = textColor;
45039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onTitleChanged(mTitle, textColor);
45049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final CharSequence getTitle() {
45079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mTitle;
45089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getTitleColor() {
45119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mTitleColor;
45129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onTitleChanged(CharSequence title, int color) {
45159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mTitleReady) {
45169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final Window win = getWindow();
45179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win != null) {
45189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.setTitle(title);
45199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (color != 0) {
45209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.setTitleColor(color);
45219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
45229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
45239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onChildTitleChanged(Activity childActivity, CharSequence title) {
45279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
45309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the visibility of the progress bar in the title.
45319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
45329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * In order for the progress bar to be shown, the feature must be requested
45339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * via {@link #requestWindowFeature(int)}.
45349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
45359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param visible Whether to show the progress bars in the title.
45369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
45379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setProgressBarVisibility(boolean visible) {
45389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setFeatureInt(Window.FEATURE_PROGRESS, visible ? Window.PROGRESS_VISIBILITY_ON :
45399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Window.PROGRESS_VISIBILITY_OFF);
45409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
45439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the visibility of the indeterminate progress bar in the title.
45449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
45459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * In order for the progress bar to be shown, the feature must be requested
45469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * via {@link #requestWindowFeature(int)}.
45479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
45489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param visible Whether to show the progress bars in the title.
45499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
45509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setProgressBarIndeterminateVisibility(boolean visible) {
45519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setFeatureInt(Window.FEATURE_INDETERMINATE_PROGRESS,
45529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                visible ? Window.PROGRESS_VISIBILITY_ON : Window.PROGRESS_VISIBILITY_OFF);
45539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
45569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets whether the horizontal progress bar in the title should be indeterminate (the circular
45579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is always indeterminate).
45589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
45599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * In order for the progress bar to be shown, the feature must be requested
45609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * via {@link #requestWindowFeature(int)}.
45619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
45629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param indeterminate Whether the horizontal progress bar should be indeterminate.
45639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
45649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setProgressBarIndeterminate(boolean indeterminate) {
45659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setFeatureInt(Window.FEATURE_PROGRESS,
45669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                indeterminate ? Window.PROGRESS_INDETERMINATE_ON : Window.PROGRESS_INDETERMINATE_OFF);
45679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
45709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the progress for the progress bars in the title.
45719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
45729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * In order for the progress bar to be shown, the feature must be requested
45739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * via {@link #requestWindowFeature(int)}.
45749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
45759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param progress The progress for the progress bar. Valid ranges are from
45769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            0 to 10000 (both inclusive). If 10000 is given, the progress
45779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            bar will be completely filled and will fade out.
45789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
45799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setProgress(int progress) {
45809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setFeatureInt(Window.FEATURE_PROGRESS, progress + Window.PROGRESS_START);
45819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
45849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the secondary progress for the progress bar in the title. This
45859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * progress is drawn between the primary progress (set via
45869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setProgress(int)} and the background. It can be ideal for media
45879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * scenarios such as showing the buffering progress while the default
45889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * progress shows the play progress.
45899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
45909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * In order for the progress bar to be shown, the feature must be requested
45919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * via {@link #requestWindowFeature(int)}.
45929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
45939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param secondaryProgress The secondary progress for the progress bar. Valid ranges are from
45949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            0 to 10000 (both inclusive).
45959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
45969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setSecondaryProgress(int secondaryProgress) {
45979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setFeatureInt(Window.FEATURE_PROGRESS,
45989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                secondaryProgress + Window.PROGRESS_SECONDARY_START);
45999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
46009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
46019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
46029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Suggests an audio stream whose volume should be changed by the hardware
46039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * volume controls.
46049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
46059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The suggested audio stream will be tied to the window of this Activity.
46069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If the Activity is switched, the stream set here is no longer the
46079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * suggested stream. The client does not need to save and restore the old
46089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * suggested stream value in onPause and onResume.
46099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
46109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param streamType The type of the audio stream whose volume should be
46119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        changed by the hardware volume controls. It is not guaranteed that
46129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        the hardware volume controls will always change this stream's
46139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        volume (for example, if a call is in progress, its stream's volume
46149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        may be changed instead). To reset back to the default, use
46159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        {@link AudioManager#USE_DEFAULT_STREAM_TYPE}.
46169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
46179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setVolumeControlStream(int streamType) {
46189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setVolumeControlStream(streamType);
46199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
46209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
46219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
46229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the suggested audio stream whose volume should be changed by the
46239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * harwdare volume controls.
46249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
46259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The suggested audio stream type whose volume should be changed by
46269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         the hardware volume controls.
46279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setVolumeControlStream(int)
46289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
46299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getVolumeControlStream() {
46309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getWindow().getVolumeControlStream();
46319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
46329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
46339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
46349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Runs the specified action on the UI thread. If the current thread is the UI
46359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thread, then the action is executed immediately. If the current thread is
46369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not the UI thread, the action is posted to the event queue of the UI thread.
46379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
46389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param action the action to run on the UI thread
46399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
46409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void runOnUiThread(Runnable action) {
46419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (Thread.currentThread() != mUiThread) {
46429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mHandler.post(action);
46439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
46449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            action.run();
46459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
46469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
46479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
46489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4649ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn     * Standard implementation of
4650ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn     * {@link android.view.LayoutInflater.Factory#onCreateView} used when
4651ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn     * inflating with the LayoutInflater returned by {@link #getSystemService}.
4652625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * This implementation does nothing and is for
4653625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * pre-{@link android.os.Build.VERSION_CODES#HONEYCOMB} apps.  Newer apps
4654625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * should use {@link #onCreateView(View, String, Context, AttributeSet)}.
4655625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     *
4656625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * @see android.view.LayoutInflater#createView
4657625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * @see android.view.Window#getLayoutInflater
4658625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     */
4659625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn    public View onCreateView(String name, Context context, AttributeSet attrs) {
4660625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        return null;
4661625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn    }
4662625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn
4663625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn    /**
4664625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * Standard implementation of
4665625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * {@link android.view.LayoutInflater.Factory2#onCreateView(View, String, Context, AttributeSet)}
4666625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * used when inflating with the LayoutInflater returned by {@link #getSystemService}.
4667ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn     * This implementation handles <fragment> tags to embed fragments inside
4668ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn     * of the activity.
46699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
46709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.view.LayoutInflater#createView
46719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.view.Window#getLayoutInflater
46729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4673625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn    public View onCreateView(View parent, String name, Context context, AttributeSet attrs) {
4674ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        if (!"fragment".equals(name)) {
4675625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            return onCreateView(name, context, attrs);
4676ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        }
4677ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn
4678def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn        String fname = attrs.getAttributeValue(null, "class");
4679ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        TypedArray a =
4680ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn            context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.Fragment);
4681def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn        if (fname == null) {
4682def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn            fname = a.getString(com.android.internal.R.styleable.Fragment_name);
4683def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn        }
4684625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        int id = a.getResourceId(com.android.internal.R.styleable.Fragment_id, View.NO_ID);
4685ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        String tag = a.getString(com.android.internal.R.styleable.Fragment_tag);
4686ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        a.recycle();
4687ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn
4688625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        int containerId = parent != null ? parent.getId() : 0;
4689625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        if (containerId == View.NO_ID && id == View.NO_ID && tag == null) {
4690b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            throw new IllegalArgumentException(attrs.getPositionDescription()
4691625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                    + ": Must specify unique android:id, android:tag, or have a parent with an id for " + fname);
4692b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
4693625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn
4694b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        // If we restored from a previous state, we may already have
4695b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        // instantiated this fragment from the state and should use
4696b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        // that instance instead of making a new one.
4697625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        Fragment fragment = id != View.NO_ID ? mFragments.findFragmentById(id) : null;
4698625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        if (fragment == null && tag != null) {
4699625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            fragment = mFragments.findFragmentByTag(tag);
4700625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        }
4701625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        if (fragment == null && containerId != View.NO_ID) {
4702625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            fragment = mFragments.findFragmentById(containerId);
4703625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        }
4704625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn
4705b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        if (FragmentManagerImpl.DEBUG) Log.v(TAG, "onCreateView: id=0x"
4706b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn                + Integer.toHexString(id) + " fname=" + fname
4707b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn                + " existing=" + fragment);
4708b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        if (fragment == null) {
4709b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn            fragment = Fragment.instantiate(this, fname);
4710b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn            fragment.mFromLayout = true;
4711625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            fragment.mFragmentId = id != 0 ? id : containerId;
4712625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            fragment.mContainerId = containerId;
4713b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn            fragment.mTag = tag;
4714625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            fragment.mInLayout = true;
47153e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn            fragment.mFragmentManager = mFragments;
4716e3a7f628c6d9fef42be24999b3137ebe5c6f3525Dianne Hackborn            fragment.onInflate(this, attrs, fragment.mSavedFragmentState);
4717625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            mFragments.addFragment(fragment, true);
4718625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn
4719625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        } else if (fragment.mInLayout) {
4720625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            // A fragment already exists and it is not one we restored from
4721625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            // previous state.
4722625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            throw new IllegalArgumentException(attrs.getPositionDescription()
4723625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                    + ": Duplicate id 0x" + Integer.toHexString(id)
4724625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                    + ", tag " + tag + ", or parent id 0x" + Integer.toHexString(containerId)
4725625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                    + " with another fragment for " + fname);
4726625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        } else {
4727625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            // This fragment was retained from a previous instance; get it
4728625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            // going now.
4729625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            fragment.mInLayout = true;
4730def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn            // If this fragment is newly instantiated (either right now, or
4731def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn            // from last saved state), then give it the attributes to
4732def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn            // initialize itself.
4733def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn            if (!fragment.mRetaining) {
4734e3a7f628c6d9fef42be24999b3137ebe5c6f3525Dianne Hackborn                fragment.onInflate(this, attrs, fragment.mSavedFragmentState);
4735def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn            }
4736625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            mFragments.moveToState(fragment);
4737b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        }
4738625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn
4739b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        if (fragment.mView == null) {
4740b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn            throw new IllegalStateException("Fragment " + fname
4741b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn                    + " did not create a view.");
4742b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        }
4743625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        if (id != 0) {
4744625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            fragment.mView.setId(id);
4745625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        }
4746b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        if (fragment.mView.getTag() == null) {
4747b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn            fragment.mView.setTag(tag);
4748b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        }
4749b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        return fragment.mView;
47509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
47519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
475269a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler    /**
4753625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * Print the Activity's state into the given stream.  This gets invoked if
47545554b7082220d37496e30f39a0d9146afc177ab4Jeff Sharkey     * you run "adb shell dumpsys activity &lt;activity_component_name&gt;".
4755625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     *
475630d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn     * @param prefix Desired prefix to prepend at each line of output.
4757625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * @param fd The raw file descriptor that the dump is being sent to.
4758625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * @param writer The PrintWriter to which you should dump your state.  This will be
4759625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * closed for you after you return.
4760625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * @param args additional arguments to the dump request.
4761625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     */
476230d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn    public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
476362bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        dumpInner(prefix, fd, writer, args);
476462bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    }
476562bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn
476662bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    void dumpInner(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
476730d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn        writer.print(prefix); writer.print("Local Activity ");
476830d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn                writer.print(Integer.toHexString(System.identityHashCode(this)));
476930d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn                writer.println(" State:");
477030d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn        String innerPrefix = prefix + "  ";
477130d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn        writer.print(innerPrefix); writer.print("mResumed=");
477230d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn                writer.print(mResumed); writer.print(" mStopped=");
477330d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn                writer.print(mStopped); writer.print(" mFinished=");
477430d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn                writer.println(mFinished);
477530d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn        writer.print(innerPrefix); writer.print("mLoadersStarted=");
477630d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn                writer.println(mLoadersStarted);
477730d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn        writer.print(innerPrefix); writer.print("mChangingConfigurations=");
477830d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn                writer.println(mChangingConfigurations);
477930d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn        writer.print(innerPrefix); writer.print("mCurrentConfig=");
478030d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn                writer.println(mCurrentConfig);
478130d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn        if (mLoaderManager != null) {
478230d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn            writer.print(prefix); writer.print("Loader Manager ");
478330d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn                    writer.print(Integer.toHexString(System.identityHashCode(mLoaderManager)));
478430d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn                    writer.println(":");
478530d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn            mLoaderManager.dump(prefix + "  ", fd, writer, args);
478630d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn        }
478730d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn        mFragments.dump(prefix, fd, writer, args);
47884702a856973a553deb82f71b1d3b6c3db5dbf4baDianne Hackborn        writer.print(prefix); writer.println("View Hierarchy:");
47894702a856973a553deb82f71b1d3b6c3db5dbf4baDianne Hackborn        dumpViewHierarchy(prefix + "  ", writer, getWindow().getDecorView());
47904702a856973a553deb82f71b1d3b6c3db5dbf4baDianne Hackborn    }
47914702a856973a553deb82f71b1d3b6c3db5dbf4baDianne Hackborn
47924702a856973a553deb82f71b1d3b6c3db5dbf4baDianne Hackborn    private void dumpViewHierarchy(String prefix, PrintWriter writer, View view) {
47934702a856973a553deb82f71b1d3b6c3db5dbf4baDianne Hackborn        writer.print(prefix);
47944702a856973a553deb82f71b1d3b6c3db5dbf4baDianne Hackborn        if (view == null) {
47954702a856973a553deb82f71b1d3b6c3db5dbf4baDianne Hackborn            writer.println("null");
47964702a856973a553deb82f71b1d3b6c3db5dbf4baDianne Hackborn            return;
47974702a856973a553deb82f71b1d3b6c3db5dbf4baDianne Hackborn        }
47984702a856973a553deb82f71b1d3b6c3db5dbf4baDianne Hackborn        writer.println(view.toString());
47994702a856973a553deb82f71b1d3b6c3db5dbf4baDianne Hackborn        if (!(view instanceof ViewGroup)) {
48004702a856973a553deb82f71b1d3b6c3db5dbf4baDianne Hackborn            return;
48014702a856973a553deb82f71b1d3b6c3db5dbf4baDianne Hackborn        }
48024702a856973a553deb82f71b1d3b6c3db5dbf4baDianne Hackborn        ViewGroup grp = (ViewGroup)view;
48034702a856973a553deb82f71b1d3b6c3db5dbf4baDianne Hackborn        final int N = grp.getChildCount();
48044702a856973a553deb82f71b1d3b6c3db5dbf4baDianne Hackborn        if (N <= 0) {
48054702a856973a553deb82f71b1d3b6c3db5dbf4baDianne Hackborn            return;
48064702a856973a553deb82f71b1d3b6c3db5dbf4baDianne Hackborn        }
48074702a856973a553deb82f71b1d3b6c3db5dbf4baDianne Hackborn        prefix = prefix + "  ";
48084702a856973a553deb82f71b1d3b6c3db5dbf4baDianne Hackborn        for (int i=0; i<N; i++) {
48094702a856973a553deb82f71b1d3b6c3db5dbf4baDianne Hackborn            dumpViewHierarchy(prefix, writer, grp.getChildAt(i));
48104702a856973a553deb82f71b1d3b6c3db5dbf4baDianne Hackborn        }
4811625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn    }
4812625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn
4813625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn    /**
481469a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * Bit indicating that this activity is "immersive" and should not be
481569a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * interrupted by notifications if possible.
481669a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     *
481769a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * This value is initially set by the manifest property
481869a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * <code>android:immersive</code> but may be changed at runtime by
481969a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * {@link #setImmersive}.
482069a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     *
482169a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * @see android.content.pm.ActivityInfo#FLAG_IMMERSIVE
482202486b1327e3007c62d253dd89ba9db1852b87f8Dianne Hackborn     * @hide
482369a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     */
482469a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler    public boolean isImmersive() {
482569a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler        try {
482669a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler            return ActivityManagerNative.getDefault().isImmersive(mToken);
482769a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler        } catch (RemoteException e) {
482869a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler            return false;
482969a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler        }
483069a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler    }
483169a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler
483269a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler    /**
483369a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * Adjust the current immersive mode setting.
483469a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     *
483569a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * Note that changing this value will have no effect on the activity's
483669a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * {@link android.content.pm.ActivityInfo} structure; that is, if
483769a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * <code>android:immersive</code> is set to <code>true</code>
483869a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * in the application's manifest entry for this activity, the {@link
483969a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * android.content.pm.ActivityInfo#flags ActivityInfo.flags} member will
484069a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * always have its {@link android.content.pm.ActivityInfo#FLAG_IMMERSIVE
484169a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * FLAG_IMMERSIVE} bit set.
484269a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     *
484369a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * @see #isImmersive
484469a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * @see android.content.pm.ActivityInfo#FLAG_IMMERSIVE
484502486b1327e3007c62d253dd89ba9db1852b87f8Dianne Hackborn     * @hide
484669a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     */
484769a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler    public void setImmersive(boolean i) {
484869a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler        try {
484969a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler            ActivityManagerNative.getDefault().setImmersive(mToken, i);
485069a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler        } catch (RemoteException e) {
485169a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler            // pass
485269a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler        }
485369a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler    }
485469a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler
48556e34636749217654f43221885afb7a29bb5ca96aAdam Powell    /**
4856debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     * Start an action mode.
48576e34636749217654f43221885afb7a29bb5ca96aAdam Powell     *
48586e34636749217654f43221885afb7a29bb5ca96aAdam Powell     * @param callback Callback that will manage lifecycle events for this context mode
48596e34636749217654f43221885afb7a29bb5ca96aAdam Powell     * @return The ContextMode that was started, or null if it was canceled
48606e34636749217654f43221885afb7a29bb5ca96aAdam Powell     *
48616e34636749217654f43221885afb7a29bb5ca96aAdam Powell     * @see ActionMode
48626e34636749217654f43221885afb7a29bb5ca96aAdam Powell     */
48635d27977f9da482627ceb19317a2cd70467aff046Adam Powell    public ActionMode startActionMode(ActionMode.Callback callback) {
48646e34636749217654f43221885afb7a29bb5ca96aAdam Powell        return mWindow.getDecorView().startActionMode(callback);
48656e34636749217654f43221885afb7a29bb5ca96aAdam Powell    }
48666e34636749217654f43221885afb7a29bb5ca96aAdam Powell
4867debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell    /**
4868debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     * Give the Activity a chance to control the UI for an action mode requested
4869debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     * by the system.
4870debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     *
4871debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     * <p>Note: If you are looking for a notification callback that an action mode
4872debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     * has been started for this activity, see {@link #onActionModeStarted(ActionMode)}.</p>
4873debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     *
4874debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     * @param callback The callback that should control the new action mode
4875debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     * @return The new action mode, or <code>null</code> if the activity does not want to
4876debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     *         provide special handling for this action mode. (It will be handled by the system.)
4877debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     */
4878debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell    public ActionMode onWindowStartingActionMode(ActionMode.Callback callback) {
487942c0fe86521af507f597af6159f63879cb5be73eAdam Powell        initActionBar();
48806e34636749217654f43221885afb7a29bb5ca96aAdam Powell        if (mActionBar != null) {
48815d27977f9da482627ceb19317a2cd70467aff046Adam Powell            return mActionBar.startActionMode(callback);
48826e34636749217654f43221885afb7a29bb5ca96aAdam Powell        }
48836e34636749217654f43221885afb7a29bb5ca96aAdam Powell        return null;
48846e34636749217654f43221885afb7a29bb5ca96aAdam Powell    }
48856e34636749217654f43221885afb7a29bb5ca96aAdam Powell
4886debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell    /**
4887debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     * Notifies the Activity that an action mode has been started.
4888debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     * Activity subclasses overriding this method should call the superclass implementation.
4889debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     *
4890debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     * @param mode The new action mode.
4891debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     */
4892debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell    public void onActionModeStarted(ActionMode mode) {
4893debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell    }
4894debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell
4895debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell    /**
4896debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     * Notifies the activity that an action mode has finished.
4897debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     * Activity subclasses overriding this method should call the superclass implementation.
4898debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     *
4899debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     * @param mode The action mode that just finished.
4900debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell     */
4901debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell    public void onActionModeFinished(ActionMode mode) {
4902debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell    }
4903debf3bed9ea913ac55c80e1f9f7f33217054a943Adam Powell
4904dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell    /**
4905dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * Returns true if the app should recreate the task when navigating 'up' from this activity
4906dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * by using targetIntent.
4907dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     *
4908dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * <p>If this method returns false the app can trivially call
4909dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * {@link #navigateUpTo(Intent)} using the same parameters to correctly perform
4910dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * up navigation. If this method returns false, the app should synthesize a new task stack
4911dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * by using {@link TaskStackBuilder} or another similar mechanism to perform up navigation.</p>
4912dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     *
4913dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * @param targetIntent An intent representing the target destination for up navigation
4914dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * @return true if navigating up should recreate a new task stack, false if the same task
4915dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     *         should be used for the destination
4916dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     */
4917dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell    public boolean shouldUpRecreateTask(Intent targetIntent) {
4918dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell        try {
4919dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell            PackageManager pm = getPackageManager();
4920dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell            ComponentName cn = targetIntent.getComponent();
4921dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell            if (cn == null) {
4922dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell                cn = targetIntent.resolveActivity(pm);
4923dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell            }
4924dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell            ActivityInfo info = pm.getActivityInfo(cn, 0);
4925dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell            if (info.taskAffinity == null) {
4926dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell                return false;
4927dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell            }
4928dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell            return !ActivityManagerNative.getDefault()
4929dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell                    .targetTaskAffinityMatchesActivity(mToken, info.taskAffinity);
4930dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell        } catch (RemoteException e) {
4931dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell            return false;
4932dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell        } catch (NameNotFoundException e) {
4933dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell            return false;
4934dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell        }
4935dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell    }
4936dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell
4937dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell    /**
4938dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * Navigate from this activity to the activity specified by upIntent, finishing this activity
4939dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * in the process. If the activity indicated by upIntent already exists in the task's history,
4940dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * this activity and all others before the indicated activity in the history stack will be
494135c064b2e895328022f7ac02587ec9bb69895c74Adam Powell     * finished.
494235c064b2e895328022f7ac02587ec9bb69895c74Adam Powell     *
494335c064b2e895328022f7ac02587ec9bb69895c74Adam Powell     * <p>If the indicated activity does not appear in the history stack, this will finish
494435c064b2e895328022f7ac02587ec9bb69895c74Adam Powell     * each activity in this task until the root activity of the task is reached, resulting in
494535c064b2e895328022f7ac02587ec9bb69895c74Adam Powell     * an "in-app home" behavior. This can be useful in apps with a complex navigation hierarchy
494635c064b2e895328022f7ac02587ec9bb69895c74Adam Powell     * when an activity may be reached by a path not passing through a canonical parent
494735c064b2e895328022f7ac02587ec9bb69895c74Adam Powell     * activity.</p>
4948dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     *
4949dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * <p>This method should be used when performing up navigation from within the same task
4950dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * as the destination. If up navigation should cross tasks in some cases, see
4951dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * {@link #shouldUpRecreateTask(Intent)}.</p>
4952dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     *
4953dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * @param upIntent An intent representing the target destination for up navigation
4954dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     *
4955dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * @return true if up navigation successfully reached the activity indicated by upIntent and
4956dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     *         upIntent was delivered to it. false if an instance of the indicated activity could
4957dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     *         not be found and this activity was simply finished normally.
4958dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     */
4959dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell    public boolean navigateUpTo(Intent upIntent) {
4960dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell        if (mParent == null) {
4961dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell            ComponentName destInfo = upIntent.getComponent();
4962dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell            if (destInfo == null) {
4963dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell                destInfo = upIntent.resolveActivity(getPackageManager());
4964dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell                if (destInfo == null) {
4965dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell                    return false;
4966dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell                }
4967dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell                upIntent = new Intent(upIntent);
4968dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell                upIntent.setComponent(destInfo);
4969dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell            }
4970dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell            int resultCode;
4971dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell            Intent resultData;
4972dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell            synchronized (this) {
4973dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell                resultCode = mResultCode;
4974dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell                resultData = mResultData;
4975dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell            }
4976dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell            if (resultData != null) {
4977dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell                resultData.setAllowFds(false);
4978dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell            }
4979dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell            try {
4980dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell                return ActivityManagerNative.getDefault().navigateUpTo(mToken, upIntent,
4981dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell                        resultCode, resultData);
4982dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell            } catch (RemoteException e) {
4983dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell                return false;
4984dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell            }
4985dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell        } else {
4986dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell            return mParent.navigateUpToFromChild(this, upIntent);
4987dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell        }
4988dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell    }
4989dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell
4990dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell    /**
4991dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * This is called when a child activity of this one calls its
4992dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * {@link #navigateUpTo} method.  The default implementation simply calls
4993dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * navigateUpTo(upIntent) on this activity (the parent).
4994dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     *
4995dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * @param child The activity making the call.
4996dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * @param upIntent An intent representing the target destination for up navigation
4997dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     *
4998dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * @return true if up navigation successfully reached the activity indicated by upIntent and
4999dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     *         upIntent was delivered to it. false if an instance of the indicated activity could
5000dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     *         not be found and this activity was simply finished normally.
5001dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     */
5002dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell    public boolean navigateUpToFromChild(Activity child, Intent upIntent) {
5003dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell        return navigateUpTo(upIntent);
5004dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell    }
5005dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell
5006dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell    /**
5007dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * Obtain an {@link Intent} that will launch an explicit target activity specified by
5008dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * this activity's logical parent. The logical parent is named in the application's manifest
5009dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     * by the {@link android.R.attr#parentActivityName parentActivityName} attribute.
501004d5811500874d44010df2b4ce37a0b21095168fAdam Powell     * Activity subclasses may override this method to modify the Intent returned by
501104d5811500874d44010df2b4ce37a0b21095168fAdam Powell     * super.getParentActivityIntent() or to implement a different mechanism of retrieving
501204d5811500874d44010df2b4ce37a0b21095168fAdam Powell     * the parent intent entirely.
5013dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     *
501404d5811500874d44010df2b4ce37a0b21095168fAdam Powell     * @return a new Intent targeting the defined parent of this activity or null if
501504d5811500874d44010df2b4ce37a0b21095168fAdam Powell     *         there is no valid parent.
5016dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell     */
5017dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell    public Intent getParentActivityIntent() {
501804d5811500874d44010df2b4ce37a0b21095168fAdam Powell        final String parentName = mActivityInfo.parentActivityName;
501904d5811500874d44010df2b4ce37a0b21095168fAdam Powell        if (TextUtils.isEmpty(parentName)) {
502004d5811500874d44010df2b4ce37a0b21095168fAdam Powell            return null;
502104d5811500874d44010df2b4ce37a0b21095168fAdam Powell        }
50225a4010c054a4449156df885ad0f46f8db3263d87Adam Powell
50235a4010c054a4449156df885ad0f46f8db3263d87Adam Powell        // If the parent itself has no parent, generate a main activity intent.
50245a4010c054a4449156df885ad0f46f8db3263d87Adam Powell        final ComponentName target = new ComponentName(this, parentName);
50255a4010c054a4449156df885ad0f46f8db3263d87Adam Powell        try {
50265a4010c054a4449156df885ad0f46f8db3263d87Adam Powell            final ActivityInfo parentInfo = getPackageManager().getActivityInfo(target, 0);
50275a4010c054a4449156df885ad0f46f8db3263d87Adam Powell            final String parentActivity = parentInfo.parentActivityName;
50285a4010c054a4449156df885ad0f46f8db3263d87Adam Powell            final Intent parentIntent = parentActivity == null
50295a4010c054a4449156df885ad0f46f8db3263d87Adam Powell                    ? Intent.makeMainActivity(target)
50305a4010c054a4449156df885ad0f46f8db3263d87Adam Powell                    : new Intent().setComponent(target);
50315a4010c054a4449156df885ad0f46f8db3263d87Adam Powell            return parentIntent;
50325a4010c054a4449156df885ad0f46f8db3263d87Adam Powell        } catch (NameNotFoundException e) {
50335a4010c054a4449156df885ad0f46f8db3263d87Adam Powell            Log.e(TAG, "getParentActivityIntent: bad parentActivityName '" + parentName +
50345a4010c054a4449156df885ad0f46f8db3263d87Adam Powell                    "' in manifest");
50355a4010c054a4449156df885ad0f46f8db3263d87Adam Powell            return null;
50365a4010c054a4449156df885ad0f46f8db3263d87Adam Powell        }
5037dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell    }
5038dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell
50399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ------------------ Internal API ------------------
50409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
50419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void setParent(Activity parent) {
50429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mParent = parent;
50439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
50449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
50459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void attach(Context context, ActivityThread aThread, Instrumentation instr, IBinder token,
50469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Application application, Intent intent, ActivityInfo info, CharSequence title,
5047b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            Activity parent, String id, NonConfigurationInstances lastNonConfigurationInstances,
50489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Configuration config) {
5049b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn        attach(context, aThread, instr, token, 0, application, intent, info, title, parent, id,
5050b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            lastNonConfigurationInstances, config);
50519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
50529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5053b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn    final void attach(Context context, ActivityThread aThread,
5054b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn            Instrumentation instr, IBinder token, int ident,
5055b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn            Application application, Intent intent, ActivityInfo info,
5056b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn            CharSequence title, Activity parent, String id,
5057b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            NonConfigurationInstances lastNonConfigurationInstances,
5058b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn            Configuration config) {
50599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        attachBaseContext(context);
50609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
506162bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        mFragments.attachActivity(this, mContainer, null);
50622dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
50639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindow = PolicyManager.makeNewWindow(this);
50649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindow.setCallback(this);
5065420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn        mWindow.getLayoutInflater().setPrivateFactory(this);
50669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (info.softInputMode != WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED) {
50679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindow.setSoftInputMode(info.softInputMode);
50689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5069269248d112e35fe8e9f0d5d11c96dcb2ac1118b0Adam Powell        if (info.uiOptions != 0) {
5070269248d112e35fe8e9f0d5d11c96dcb2ac1118b0Adam Powell            mWindow.setUiOptions(info.uiOptions);
5071269248d112e35fe8e9f0d5d11c96dcb2ac1118b0Adam Powell        }
50729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUiThread = Thread.currentThread();
5073529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy
50749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread = aThread;
50759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mInstrumentation = instr;
50769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mToken = token;
5077b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn        mIdent = ident;
50789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mApplication = application;
50799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mIntent = intent;
50809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mComponent = intent.getComponent();
50819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mActivityInfo = info;
50829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTitle = title;
50839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mParent = parent;
50849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEmbeddedID = id;
5085b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mLastNonConfigurationInstances = lastNonConfigurationInstances;
50869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
508798365d7663cbd82979a5700faf0050220b01084dJeff Brown        mWindow.setWindowManager(
508898365d7663cbd82979a5700faf0050220b01084dJeff Brown                (WindowManager)context.getSystemService(Context.WINDOW_SERVICE),
508998365d7663cbd82979a5700faf0050220b01084dJeff Brown                mToken, mComponent.flattenToString(),
5090529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy                (info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0);
50919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent != null) {
50929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindow.setContainer(mParent.getWindow());
50939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
50949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindowManager = mWindow.getWindowManager();
50959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCurrentConfig = config;
50969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
50979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
50985320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn    /** @hide */
50995320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn    public final IBinder getActivityToken() {
51009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mParent != null ? mParent.getActivityToken() : mToken;
51019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
51029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51032dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    final void performCreate(Bundle icicle) {
51042dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        onCreate(icicle);
510530c9bd89556137157b2f686637ece961454ccabeDianne Hackborn        mVisibleFromClient = !mWindow.getWindowStyle().getBoolean(
510630c9bd89556137157b2f686637ece961454ccabeDianne Hackborn                com.android.internal.R.styleable.Window_windowNoDisplay, false);
5107c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn        mFragments.dispatchActivityCreated();
51082dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
51092dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
51109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performStart() {
5111fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn        mFragments.noteStateNotSaved();
51129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = false;
5113445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn        mFragments.execPendingActions();
51149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mInstrumentation.callActivityOnStart(this);
51159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mCalled) {
51169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SuperNotCalledException(
51179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "Activity " + mComponent.toShortString() +
51189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                " did not call through to super.onStart()");
51199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
51202dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        mFragments.dispatchStart();
51212707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn        if (mAllLoaderManagers != null) {
512262bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            LoaderManagerImpl loaders[] = new LoaderManagerImpl[mAllLoaderManagers.size()];
512362bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            mAllLoaderManagers.values().toArray(loaders);
512462bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            if (loaders != null) {
512562bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                for (int i=0; i<loaders.length; i++) {
512662bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                    LoaderManagerImpl lm = loaders[i];
512762bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                    lm.finishRetain();
512862bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                    lm.doReportStart();
512962bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                }
51302707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn            }
51312707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn        }
51329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
51339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performRestart() {
5135fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn        mFragments.noteStateNotSaved();
5136a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn
51379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mStopped) {
51389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStopped = false;
5139ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn            if (mToken != null && mParent == null) {
514098365d7663cbd82979a5700faf0050220b01084dJeff Brown                WindowManagerGlobal.getInstance().setStoppedState(mToken, false);
5141ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn            }
5142185e3e243ee1da136bcace854026b8abaf0c4c86Dianne Hackborn
5143185e3e243ee1da136bcace854026b8abaf0c4c86Dianne Hackborn            synchronized (mManagedCursors) {
5144185e3e243ee1da136bcace854026b8abaf0c4c86Dianne Hackborn                final int N = mManagedCursors.size();
5145185e3e243ee1da136bcace854026b8abaf0c4c86Dianne Hackborn                for (int i=0; i<N; i++) {
5146185e3e243ee1da136bcace854026b8abaf0c4c86Dianne Hackborn                    ManagedCursor mc = mManagedCursors.get(i);
5147185e3e243ee1da136bcace854026b8abaf0c4c86Dianne Hackborn                    if (mc.mReleased || mc.mUpdated) {
5148185e3e243ee1da136bcace854026b8abaf0c4c86Dianne Hackborn                        if (!mc.mCursor.requery()) {
5149a5445d3bbd7985ffeeeabc3813bec3d1e0463ceaDianne Hackborn                            if (getApplicationInfo().targetSdkVersion
5150a5445d3bbd7985ffeeeabc3813bec3d1e0463ceaDianne Hackborn                                    >= android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
5151a5445d3bbd7985ffeeeabc3813bec3d1e0463ceaDianne Hackborn                                throw new IllegalStateException(
5152a5445d3bbd7985ffeeeabc3813bec3d1e0463ceaDianne Hackborn                                        "trying to requery an already closed cursor  "
5153a5445d3bbd7985ffeeeabc3813bec3d1e0463ceaDianne Hackborn                                        + mc.mCursor);
5154a5445d3bbd7985ffeeeabc3813bec3d1e0463ceaDianne Hackborn                            }
5155185e3e243ee1da136bcace854026b8abaf0c4c86Dianne Hackborn                        }
5156185e3e243ee1da136bcace854026b8abaf0c4c86Dianne Hackborn                        mc.mReleased = false;
5157185e3e243ee1da136bcace854026b8abaf0c4c86Dianne Hackborn                        mc.mUpdated = false;
5158185e3e243ee1da136bcace854026b8abaf0c4c86Dianne Hackborn                    }
5159185e3e243ee1da136bcace854026b8abaf0c4c86Dianne Hackborn                }
5160185e3e243ee1da136bcace854026b8abaf0c4c86Dianne Hackborn            }
5161185e3e243ee1da136bcace854026b8abaf0c4c86Dianne Hackborn
5162185e3e243ee1da136bcace854026b8abaf0c4c86Dianne Hackborn            mCalled = false;
51639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mInstrumentation.callActivityOnRestart(this);
51649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mCalled) {
51659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new SuperNotCalledException(
51669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "Activity " + mComponent.toShortString() +
51679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    " did not call through to super.onRestart()");
51689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
51699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            performStart();
51709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
51719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
51729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performResume() {
51749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        performRestart();
51759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5176445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn        mFragments.execPendingActions();
5177445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn
5178b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mLastNonConfigurationInstances = null;
51799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = false;
518152d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamilton        // mResumed is set by the instrumentation
51829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mInstrumentation.callActivityOnResume(this);
51839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mCalled) {
51849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SuperNotCalledException(
51859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "Activity " + mComponent.toShortString() +
51869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                " did not call through to super.onResume()");
51879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
51889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Now really resume, and install the current status bar and menu.
51909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = false;
51912dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
51922dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        mFragments.dispatchResume();
5193445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn        mFragments.execPendingActions();
51942dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
51959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onPostResume();
51969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mCalled) {
51979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SuperNotCalledException(
51989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "Activity " + mComponent.toShortString() +
51999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                " did not call through to super.onPostResume()");
52009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
52019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
52029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performPause() {
52042dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        mFragments.dispatchPause();
5205e794e9f9b7599c1ad6b8760e601c81b19ecc80c6Dianne Hackborn        mCalled = false;
52069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onPause();
52074eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        mResumed = false;
5208e794e9f9b7599c1ad6b8760e601c81b19ecc80c6Dianne Hackborn        if (!mCalled && getApplicationInfo().targetSdkVersion
5209e794e9f9b7599c1ad6b8760e601c81b19ecc80c6Dianne Hackborn                >= android.os.Build.VERSION_CODES.GINGERBREAD) {
5210e794e9f9b7599c1ad6b8760e601c81b19ecc80c6Dianne Hackborn            throw new SuperNotCalledException(
5211e794e9f9b7599c1ad6b8760e601c81b19ecc80c6Dianne Hackborn                    "Activity " + mComponent.toShortString() +
5212e794e9f9b7599c1ad6b8760e601c81b19ecc80c6Dianne Hackborn                    " did not call through to super.onPause()");
5213e794e9f9b7599c1ad6b8760e601c81b19ecc80c6Dianne Hackborn        }
521452d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamilton        mResumed = false;
52159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
52169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performUserLeaving() {
52189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onUserInteraction();
52199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onUserLeaveHint();
52209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
52219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performStop() {
5223fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn        if (mLoadersStarted) {
5224fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn            mLoadersStarted = false;
52252707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn            if (mLoaderManager != null) {
52262707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn                if (!mChangingConfigurations) {
52272707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn                    mLoaderManager.doStop();
52282707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn                } else {
52292707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn                    mLoaderManager.doRetain();
52302707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn                }
52312707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn            }
52322707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn        }
52332707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn
52349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mStopped) {
52359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mWindow != null) {
52369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWindow.closeAllPanels();
52379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
52389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5239ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn            if (mToken != null && mParent == null) {
524098365d7663cbd82979a5700faf0050220b01084dJeff Brown                WindowManagerGlobal.getInstance().setStoppedState(mToken, true);
5241ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn            }
5242ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn
52432dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn            mFragments.dispatchStop();
52442dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
52459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCalled = false;
52469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mInstrumentation.callActivityOnStop(this);
52479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mCalled) {
52489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new SuperNotCalledException(
52499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "Activity " + mComponent.toShortString() +
52509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    " did not call through to super.onStop()");
52519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
52529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52532f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki            synchronized (mManagedCursors) {
52542f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                final int N = mManagedCursors.size();
52552f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                for (int i=0; i<N; i++) {
52562f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                    ManagedCursor mc = mManagedCursors.get(i);
52572f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                    if (!mc.mReleased) {
52582f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                        mc.mCursor.deactivate();
52592f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                        mc.mReleased = true;
52602f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                    }
52619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
52629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
52639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStopped = true;
52659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
52669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mResumed = false;
52679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
52689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52692dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    final void performDestroy() {
52706d9dcbccec126d9b87ab6587e686e28b87e5a04dDianne Hackborn        mDestroyed = true;
5271291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn        mWindow.destroy();
52722dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        mFragments.dispatchDestroy();
52732dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        onDestroy();
52745e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn        if (mLoaderManager != null) {
52755e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn            mLoaderManager.doDestroy();
52765e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn        }
52772dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
52782dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
527952d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamilton    /**
528052d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamilton     * @hide
528152d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamilton     */
528252d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamilton    public final boolean isResumed() {
52839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mResumed;
52849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
52859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void dispatchActivityResult(String who, int requestCode,
52879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int resultCode, Intent data) {
528843a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato        if (false) Log.v(
52899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            TAG, "Dispatching result: who=" + who + ", reqCode=" + requestCode
52909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            + ", resCode=" + resultCode + ", data=" + data);
5291fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn        mFragments.noteStateNotSaved();
52929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (who == null) {
52939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            onActivityResult(requestCode, resultCode, data);
52946e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        } else {
52956e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            Fragment frag = mFragments.findFragmentByWho(who);
52966e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            if (frag != null) {
52976e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                frag.onActivityResult(requestCode, resultCode, data);
52986e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            }
52999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
53009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
53019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5302