Activity.java revision c801768e4d29667a2608695449ebc2833ba0f200
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
1933b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powellimport java.util.ArrayList;
2033b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powellimport java.util.HashMap;
2175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentCallbacks;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentResolver;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
261ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapuimport android.content.IIntentSender;
2733b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powellimport android.content.Intent;
28fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackbornimport android.content.IntentSender;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.SharedPreferences;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ActivityInfo;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Configuration;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources;
33ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackbornimport android.content.res.TypedArray;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.Cursor;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Bitmap;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Canvas;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.media.AudioManager;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri;
408d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackbornimport android.os.Build;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder;
44b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackbornimport android.os.Parcelable;
4575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.os.RemoteException;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.Selection;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.SpannableStringBuilder;
4875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.text.TextUtils;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.method.TextKeyListener;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Config;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.EventLog;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseArray;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ContextMenu;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ContextThemeWrapper;
57ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackbornimport android.view.InflateException;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyEvent;
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.LayoutInflater;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Menu;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.MenuInflater;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.MenuItem;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.MotionEvent;
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View;
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewGroup;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewManager;
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Window;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManager;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ContextMenu.ContextMenuInfo;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View.OnCreateContextMenuListener;
7175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.view.ViewGroup.LayoutParams;
7275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.view.accessibility.AccessibilityEvent;
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.AdapterView;
7433b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powellimport android.widget.LinearLayout;
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7689e0645b4157961e8c465eb9c819f965fdb453d8Adam Powellimport com.android.internal.app.ActionBarImpl;
7733b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powellimport com.android.internal.policy.PolicyManager;
7889e0645b4157961e8c465eb9c819f965fdb453d8Adam Powellimport com.android.internal.widget.ActionBarView;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * An activity is a single, focused thing that the user can do.  Almost all
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activities interact with the user, so the Activity class takes care of
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * creating a window for you in which you can place your UI with
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #setContentView}.  While activities are often presented to the user
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as full-screen windows, they can also be used in other ways: as floating
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * windows (via a theme with {@link android.R.attr#windowIsFloating} set)
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or embedded inside of another activity (using {@link ActivityGroup}).
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * There are two methods almost all subclasses of Activity will implement:
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul>
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> {@link #onCreate} is where you initialize your activity.  Most
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     importantly, here you will usually call {@link #setContentView(int)}
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     with a layout resource defining your UI, and using {@link #findViewById}
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     to retrieve the widgets in that UI that you need to interact with
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     programmatically.
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> {@link #onPause} is where you deal with the user leaving your
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     activity.  Most importantly, any changes made by the user should at this
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     point be committed (usually to the
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     {@link android.content.ContentProvider} holding the data).
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>To be of use with {@link android.content.Context#startActivity Context.startActivity()}, all
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity classes must have a corresponding
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.styleable#AndroidManifestActivity &lt;activity&gt;}
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * declaration in their package's <code>AndroidManifest.xml</code>.</p>
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The Activity class is an important part of an application's overall lifecycle,
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and the way activities are launched and put together is a fundamental
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * part of the platform's application model. For a detailed perspective on the structure of
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Android applications and lifecycles, please read the <em>Dev Guide</em> document on
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a href="{@docRoot}guide/topics/fundamentals.html">Application Fundamentals</a>.</p>
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Topics covered here:
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ol>
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#ActivityLifecycle">Activity Lifecycle</a>
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#ConfigurationChanges">Configuration Changes</a>
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#StartingActivities">Starting Activities and Getting Results</a>
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#SavingPersistentState">Saving Persistent State</a>
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#Permissions">Permissions</a>
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#ProcessLifecycle">Process Lifecycle</a>
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ol>
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="ActivityLifecycle"></a>
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Activity Lifecycle</h3>
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Activities in the system are managed as an <em>activity stack</em>.
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * When a new activity is started, it is placed on the top of the stack
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and becomes the running activity -- the previous activity always remains
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * below it in the stack, and will not come to the foreground again until
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the new activity exits.</p>
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>An activity has essentially four states:</p>
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul>
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> If an activity in the foreground of the screen (at the top of
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         the stack),
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         it is <em>active</em> or  <em>running</em>. </li>
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li>If an activity has lost focus but is still visible (that is, a new non-full-sized
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         or transparent activity has focus on top of your activity), it
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         is <em>paused</em>. A paused activity is completely alive (it
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         maintains all state and member information and remains attached to
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         the window manager), but can be killed by the system in extreme
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         low memory situations.
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li>If an activity is completely obscured by another activity,
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         it is <em>stopped</em>. It still retains all state and member information,
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         however, it is no longer visible to the user so its window is hidden
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         and it will often be killed by the system when memory is needed
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         elsewhere.</li>
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li>If an activity is paused or stopped, the system can drop the activity
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         from memory by either asking it to finish, or simply killing its
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         process.  When it is displayed again to the user, it must be
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         completely restarted and restored to its previous state.</li>
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The following diagram shows the important state paths of an Activity.
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The square rectangles represent callback methods you can implement to
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * perform operations when the Activity moves between states.  The colored
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ovals are major states the Activity can be in.</p>
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><img src="../../../images/activity_lifecycle.png"
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      alt="State diagram for an Android Activity Lifecycle." border="0" /></p>
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>There are three key loops you may be interested in monitoring within your
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity:
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul>
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>The <b>entire lifetime</b> of an activity happens between the first call
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to {@link android.app.Activity#onCreate} through to a single final call
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to {@link android.app.Activity#onDestroy}.  An activity will do all setup
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of "global" state in onCreate(), and release all remaining resources in
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * onDestroy().  For example, if it has a thread running in the background
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to download data from the network, it may create that thread in onCreate()
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and then stop the thread in onDestroy().
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>The <b>visible lifetime</b> of an activity happens between a call to
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#onStart} until a corresponding call to
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#onStop}.  During this time the user can see the
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity on-screen, though it may not be in the foreground and interacting
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with the user.  Between these two methods you can maintain resources that
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are needed to show the activity to the user.  For example, you can register
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a {@link android.content.BroadcastReceiver} in onStart() to monitor for changes
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that impact your UI, and unregister it in onStop() when the user an no
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * longer see what you are displaying.  The onStart() and onStop() methods
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can be called multiple times, as the activity becomes visible and hidden
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to the user.
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>The <b>foreground lifetime</b> of an activity happens between a call to
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#onResume} until a corresponding call to
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#onPause}.  During this time the activity is
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in front of all other activities and interacting with the user.  An activity
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can frequently go between the resumed and paused states -- for example when
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the device goes to sleep, when an activity result is delivered, when a new
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * intent is delivered -- so the code in these methods should be fairly
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * lightweight.
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The entire lifecycle of an activity is defined by the following
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Activity methods.  All of these are hooks that you can override
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to do appropriate work when the activity changes state.  All
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activities will implement {@link android.app.Activity#onCreate}
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to do their initial setup; many will also implement
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#onPause} to commit changes to data and
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * otherwise prepare to stop interacting with the user.  You should always
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * call up to your superclass when implementing these methods.</p>
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p>
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint">
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * public class Activity extends ApplicationContext {
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onCreate(Bundle savedInstanceState);
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onStart();
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onRestart();
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onResume();
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onPause();
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onStop();
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onDestroy();
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * }
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </pre>
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>In general the movement through an activity's lifecycle looks like
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this:</p>
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <table border="2" width="85%" align="center" frame="hsides" rules="rows">
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <colgroup align="left" span="3" />
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <colgroup align="left" />
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <colgroup align="center" />
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <colgroup align="center" />
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <thead>
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th colspan="3">Method</th> <th>Description</th> <th>Killable?</th> <th>Next</th></tr>
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </thead>
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tbody>
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th colspan="3" align="left" border="0">{@link android.app.Activity#onCreate onCreate()}</th>
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>Called when the activity is first created.
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             This is where you should do all of your normal static set up:
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             create views, bind data to lists, etc.  This method also
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             provides you with a Bundle containing the activity's previously
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             frozen state, if there was one.
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             <p>Always followed by <code>onStart()</code>.</td>
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center">No</td>
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center"><code>onStart()</code></td>
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><td rowspan="5" style="border-left: none; border-right: none;">&nbsp;&nbsp;&nbsp;&nbsp;</td>
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <th colspan="2" align="left" border="0">{@link android.app.Activity#onRestart onRestart()}</th>
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>Called after your activity has been stopped, prior to it being
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             started again.
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             <p>Always followed by <code>onStart()</code></td>
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center">No</td>
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center"><code>onStart()</code></td>
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th colspan="2" align="left" border="0">{@link android.app.Activity#onStart onStart()}</th>
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>Called when the activity is becoming visible to the user.
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             <p>Followed by <code>onResume()</code> if the activity comes
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             to the foreground, or <code>onStop()</code> if it becomes hidden.</td>
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center">No</td>
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center"><code>onResume()</code> or <code>onStop()</code></td>
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><td rowspan="2" style="border-left: none;">&nbsp;&nbsp;&nbsp;&nbsp;</td>
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <th align="left" border="0">{@link android.app.Activity#onResume onResume()}</th>
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>Called when the activity will start
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             interacting with the user.  At this point your activity is at
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             the top of the activity stack, with user input going to it.
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             <p>Always followed by <code>onPause()</code>.</td>
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center">No</td>
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center"><code>onPause()</code></td>
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th align="left" border="0">{@link android.app.Activity#onPause onPause()}</th>
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>Called when the system is about to start resuming a previous
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             activity.  This is typically used to commit unsaved changes to
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             persistent data, stop animations and other things that may be consuming
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             CPU, etc.  Implementations of this method must be very quick because
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             the next activity will not be resumed until this method returns.
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             <p>Followed by either <code>onResume()</code> if the activity
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             returns back to the front, or <code>onStop()</code> if it becomes
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             invisible to the user.</td>
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center"><font color="#800000"><strong>Yes</strong></font></td>
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center"><code>onResume()</code> or<br>
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 <code>onStop()</code></td>
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th colspan="2" align="left" border="0">{@link android.app.Activity#onStop onStop()}</th>
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>Called when the activity is no longer visible to the user, because
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             another activity has been resumed and is covering this one.  This
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             may happen either because a new activity is being started, an existing
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             one is being brought in front of this one, or this one is being
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             destroyed.
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             <p>Followed by either <code>onRestart()</code> if
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             this activity is coming back to interact with the user, or
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             <code>onDestroy()</code> if this activity is going away.</td>
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center"><font color="#800000"><strong>Yes</strong></font></td>
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center"><code>onRestart()</code> or<br>
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 <code>onDestroy()</code></td>
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th colspan="3" align="left" border="0">{@link android.app.Activity#onDestroy onDestroy()}</th>
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>The final call you receive before your
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             activity is destroyed.  This can happen either because the
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             activity is finishing (someone called {@link Activity#finish} on
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             it, or because the system is temporarily destroying this
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             instance of the activity to save space.  You can distinguish
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             between these two scenarios with the {@link
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             Activity#isFinishing} method.</td>
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center"><font color="#800000"><strong>Yes</strong></font></td>
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center"><em>nothing</em></td>
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tbody>
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </table>
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Note the "Killable" column in the above table -- for those methods that
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are marked as being killable, after that method returns the process hosting the
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity may killed by the system <em>at any time</em> without another line
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of its code being executed.  Because of this, you should use the
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #onPause} method to write any persistent data (such as user edits)
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to storage.  In addition, the method
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #onSaveInstanceState(Bundle)} is called before placing the activity
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in such a background state, allowing you to save away any dynamic instance
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * state in your activity into the given Bundle, to be later received in
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #onCreate} if the activity needs to be re-created.
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the <a href="#ProcessLifecycle">Process Lifecycle</a>
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * section for more information on how the lifecycle of a process is tied
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to the activities it is hosting.  Note that it is important to save
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * persistent data in {@link #onPause} instead of {@link #onSaveInstanceState}
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * because the later is not part of the lifecycle callbacks, so will not
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be called in every situation as described in its documentation.</p>
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>For those methods that are not marked as being killable, the activity's
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * process will not be killed by the system starting from the time the method
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is called and continuing after it returns.  Thus an activity is in the killable
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * state, for example, between after <code>onPause()</code> to the start of
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <code>onResume()</code>.</p>
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="ConfigurationChanges"></a>
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Configuration Changes</h3>
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>If the configuration of the device (as defined by the
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Configuration Resources.Configuration} class) changes,
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * then anything displaying a user interface will need to update to match that
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * configuration.  Because Activity is the primary mechanism for interacting
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with the user, it includes special support for handling configuration
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * changes.</p>
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Unless you specify otherwise, a configuration change (such as a change
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in screen orientation, language, input devices, etc) will cause your
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current activity to be <em>destroyed</em>, going through the normal activity
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * lifecycle process of {@link #onPause},
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #onStop}, and {@link #onDestroy} as appropriate.  If the activity
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * had been in the foreground or visible to the user, once {@link #onDestroy} is
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * called in that instance then a new instance of the activity will be
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * created, with whatever savedInstanceState the previous instance had generated
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * from {@link #onSaveInstanceState}.</p>
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>This is done because any application resource,
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * including layout files, can change based on any configuration value.  Thus
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the only safe way to handle a configuration change is to re-retrieve all
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * resources, including layouts, drawables, and strings.  Because activities
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * must already know how to save their state and re-create themselves from
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that state, this is a convenient way to have an activity restart itself
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with a new configuration.</p>
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>In some special cases, you may want to bypass restarting of your
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity based on one or more types of configuration changes.  This is
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * done with the {@link android.R.attr#configChanges android:configChanges}
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * attribute in its manifest.  For any types of configuration changes you say
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that you handle there, you will receive a call to your current activity's
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #onConfigurationChanged} method instead of being restarted.  If
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a configuration change involves any that you do not handle, however, the
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity will still be restarted and {@link #onConfigurationChanged}
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will not be called.</p>
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="StartingActivities"></a>
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Starting Activities and Getting Results</h3>
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The {@link android.app.Activity#startActivity}
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * method is used to start a
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * new activity, which will be placed at the top of the activity stack.  It
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * takes a single argument, an {@link android.content.Intent Intent},
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * which describes the activity
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to be executed.</p>
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Sometimes you want to get a result back from an activity when it
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ends.  For example, you may start an activity that lets the user pick
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a person in a list of contacts; when it ends, it returns the person
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that was selected.  To do this, you call the
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#startActivityForResult(Intent, int)}
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * version with a second integer parameter identifying the call.  The result
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will come back through your {@link android.app.Activity#onActivityResult}
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * method.</p>
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>When an activity exits, it can call
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#setResult(int)}
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to return data back to its parent.  It must always supply a result code,
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * which can be the standard results RESULT_CANCELED, RESULT_OK, or any
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * custom values starting at RESULT_FIRST_USER.  In addition, it can optionally
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * return back an Intent containing any additional data it wants.  All of this
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * information appears back on the
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * parent's <code>Activity.onActivityResult()</code>, along with the integer
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * identifier it originally supplied.</p>
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>If a child activity fails for any reason (such as crashing), the parent
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity will receive a result with the code RESULT_CANCELED.</p>
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint">
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * public class MyActivity extends Activity {
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     ...
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     static final int PICK_CONTACT_REQUEST = 0;
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected boolean onKeyDown(int keyCode, KeyEvent event) {
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             // When the user center presses, let them pick a contact.
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             startActivityForResult(
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 new Intent(Intent.ACTION_PICK,
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 new Uri("content://contacts")),
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 PICK_CONTACT_REQUEST);
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *            return true;
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         }
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         return false;
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     }
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onActivityResult(int requestCode, int resultCode,
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             Intent data) {
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         if (requestCode == PICK_CONTACT_REQUEST) {
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             if (resultCode == RESULT_OK) {
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 // A contact was picked.  Here we will just display it
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 // to the user.
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 startActivity(new Intent(Intent.ACTION_VIEW, data));
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             }
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         }
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     }
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * }
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </pre>
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="SavingPersistentState"></a>
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Saving Persistent State</h3>
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>There are generally two kinds of persistent state than an activity
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will deal with: shared document-like data (typically stored in a SQLite
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * database using a {@linkplain android.content.ContentProvider content provider})
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and internal state such as user preferences.</p>
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>For content provider data, we suggest that activities use a
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * "edit in place" user model.  That is, any edits a user makes are effectively
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * made immediately without requiring an additional confirmation step.
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Supporting this model is generally a simple matter of following two rules:</p>
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul>
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> <p>When creating a new document, the backing database entry or file for
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             it is created immediately.  For example, if the user chooses to write
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             a new e-mail, a new entry for that e-mail is created as soon as they
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             start entering data, so that if they go to any other activity after
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             that point this e-mail will now appear in the list of drafts.</p>
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> <p>When an activity's <code>onPause()</code> method is called, it should
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             commit to the backing content provider or file any changes the user
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             has made.  This ensures that those changes will be seen by any other
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             activity that is about to run.  You will probably want to commit
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             your data even more aggressively at key times during your
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             activity's lifecycle: for example before starting a new
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             activity, before finishing your own activity, when the user
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             switches between input fields, etc.</p>
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>This model is designed to prevent data loss when a user is navigating
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * between activities, and allows the system to safely kill an activity (because
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * system resources are needed somewhere else) at any time after it has been
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * paused.  Note this implies
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that the user pressing BACK from your activity does <em>not</em>
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mean "cancel" -- it means to leave the activity with its current contents
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * saved away.  Cancelling edits in an activity must be provided through
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * some other mechanism, such as an explicit "revert" or "undo" option.</p>
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>See the {@linkplain android.content.ContentProvider content package} for
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * more information about content providers.  These are a key aspect of how
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * different activities invoke and propagate data between themselves.</p>
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The Activity class also provides an API for managing internal persistent state
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * associated with an activity.  This can be used, for example, to remember
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the user's preferred initial display in a calendar (day view or week view)
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or the user's default home page in a web browser.</p>
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Activity persistent state is managed
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with the method {@link #getPreferences},
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * allowing you to retrieve and
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * modify a set of name/value pairs associated with the activity.  To use
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * preferences that are shared across multiple application components
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (activities, receivers, services, providers), you can use the underlying
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Context#getSharedPreferences Context.getSharedPreferences()} method
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to retrieve a preferences
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * object stored under a specific name.
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (Note that it is not possible to share settings data across application
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * packages -- for that you will need a content provider.)</p>
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Here is an excerpt from a calendar activity that stores the user's
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * preferred view mode in its persistent settings:</p>
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint">
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * public class CalendarActivity extends Activity {
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     ...
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     static final int DAY_VIEW_MODE = 0;
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     static final int WEEK_VIEW_MODE = 1;
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     private SharedPreferences mPrefs;
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     private int mCurViewMode;
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onCreate(Bundle savedInstanceState) {
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         super.onCreate(savedInstanceState);
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         SharedPreferences mPrefs = getSharedPreferences();
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         mCurViewMode = mPrefs.getInt("view_mode" DAY_VIEW_MODE);
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     }
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onPause() {
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         super.onPause();
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         SharedPreferences.Editor ed = mPrefs.edit();
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         ed.putInt("view_mode", mCurViewMode);
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         ed.commit();
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     }
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * }
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </pre>
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="Permissions"></a>
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Permissions</h3>
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The ability to start a particular Activity can be enforced when it is
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * declared in its
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * manifest's {@link android.R.styleable#AndroidManifestActivity &lt;activity&gt;}
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * tag.  By doing so, other applications will need to declare a corresponding
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.styleable#AndroidManifestUsesPermission &lt;uses-permission&gt;}
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * element in their own manifest to be able to start that activity.
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>See the <a href="{@docRoot}guide/topics/security/security.html">Security and Permissions</a>
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * document for more information on permissions and security in general.
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="ProcessLifecycle"></a>
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Process Lifecycle</h3>
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The Android system attempts to keep application process around for as
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * long as possible, but eventually will need to remove old processes when
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * memory runs low.  As described in <a href="#ActivityLifecycle">Activity
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Lifecycle</a>, the decision about which process to remove is intimately
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * tied to the state of the user's interaction with it.  In general, there
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are four states a process can be in based on the activities running in it,
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * listed here in order of importance.  The system will kill less important
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * processes (the last ones) before it resorts to killing more important
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * processes (the first ones).
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ol>
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <p>The <b>foreground activity</b> (the activity at the top of the screen
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that the user is currently interacting with) is considered the most important.
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Its process will only be killed as a last resort, if it uses more memory
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * than is available on the device.  Generally at this point the device has
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * reached a memory paging state, so this is required in order to keep the user
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * interface responsive.
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <p>A <b>visible activity</b> (an activity that is visible to the user
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * but not in the foreground, such as one sitting behind a foreground dialog)
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is considered extremely important and will not be killed unless that is
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * required to keep the foreground activity running.
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <p>A <b>background activity</b> (an activity that is not visible to
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the user and has been paused) is no longer critical, so the system may
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * safely kill its process to reclaim memory for other foreground or
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * visible processes.  If its process needs to be killed, when the user navigates
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * back to the activity (making it visible on the screen again), its
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #onCreate} method will be called with the savedInstanceState it had previously
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * supplied in {@link #onSaveInstanceState} so that it can restart itself in the same
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * state as the user last left it.
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <p>An <b>empty process</b> is one hosting no activities or other
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * application components (such as {@link Service} or
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.BroadcastReceiver} classes).  These are killed very
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * quickly by the system as memory becomes low.  For this reason, any
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * background operation you do outside of an activity must be executed in the
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * context of an activity BroadcastReceiver or Service to ensure that the system
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * knows it needs to keep your process around.
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ol>
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Sometimes an Activity may need to do a long-running operation that exists
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * independently of the activity lifecycle itself.  An example may be a camera
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * application that allows you to upload a picture to a web site.  The upload
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * may take a long time, and the application should allow the user to leave
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the application will it is executing.  To accomplish this, your Activity
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * should start a {@link Service} in which the upload takes place.  This allows
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the system to properly prioritize your process (considering it to be more
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * important than other non-visible applications) for the duration of the
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * upload, independent of whether the original activity is paused, stopped,
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or finished.
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Activity extends ContextThemeWrapper
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        implements LayoutInflater.Factory,
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Window.Callback, KeyEvent.Callback,
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        OnCreateContextMenuListener, ComponentCallbacks {
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String TAG = "Activity";
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Standard activity result: operation canceled. */
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int RESULT_CANCELED    = 0;
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Standard activity result: operation succeeded. */
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int RESULT_OK           = -1;
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Start of user-defined activity results. */
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int RESULT_FIRST_USER   = 1;
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static long sInstanceCount = 0;
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String WINDOW_HIERARCHY_TAG = "android:viewHierarchyState";
614b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    private static final String FRAGMENTS_TAG = "android:fragments";
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String SAVED_DIALOG_IDS_KEY = "android:savedDialogIds";
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String SAVED_DIALOGS_TAG = "android:savedDialogs";
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String SAVED_DIALOG_KEY_PREFIX = "android:dialog_";
6188ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    private static final String SAVED_DIALOG_ARGS_KEY_PREFIX = "android:dialog_args_";
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6208ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    private static class ManagedDialog {
6218ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        Dialog mDialog;
6228ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        Bundle mArgs;
6238ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    }
6248ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    private SparseArray<ManagedDialog> mManagedDialogs;
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // set by the thread after the constructor and before onCreate(Bundle savedInstanceState) is called.
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Instrumentation mInstrumentation;
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IBinder mToken;
629b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn    private int mIdent;
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ String mEmbeddedID;
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Application mApplication;
632b70f3dff01e7e1e85f77cf0b0b2eaba8200eb82cChristopher Tate    /*package*/ Intent mIntent;
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ComponentName mComponent;
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ ActivityInfo mActivityInfo;
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ ActivityThread mMainThread;
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Activity mParent;
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mCalled;
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mResumed;
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mStopped;
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mFinished;
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mStartedActivity;
6423d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton    /** true if the activity is being destroyed in order to recreate it with a new configuration */
6433d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton    /*package*/ boolean mChangingConfigurations = false;
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ int mConfigChangeFlags;
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ Configuration mCurrentConfig;
6468d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert    private SearchManager mSearchManager;
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
648b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    static final class NonConfigurationInstances {
649b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        Object activity;
650b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        HashMap<String, Object> children;
651b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        ArrayList<Fragment> fragments;
652c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn        SparseArray<LoaderManager> loaders;
653b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
654b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    /* package */ NonConfigurationInstances mLastNonConfigurationInstances;
655b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Window mWindow;
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private WindowManager mWindowManager;
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ View mDecor = null;
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ boolean mWindowAdded = false;
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ boolean mVisibleFromServer = false;
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ boolean mVisibleFromClient = true;
66333b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell    /*package*/ ActionBar mActionBar = null;
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private CharSequence mTitle;
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mTitleColor = 0;
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6682dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    final FragmentManager mFragments = new FragmentManager();
6692dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
670c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn    SparseArray<LoaderManager> mAllLoaderManagers;
671c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn    LoaderManager mLoaderManager;
672c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final class ManagedCursor {
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ManagedCursor(Cursor cursor) {
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCursor = cursor;
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mReleased = false;
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUpdated = false;
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final Cursor mCursor;
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private boolean mReleased;
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private boolean mUpdated;
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final ArrayList<ManagedCursor> mManagedCursors =
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new ArrayList<ManagedCursor>();
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // protected by synchronized (this)
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mResultCode = RESULT_CANCELED;
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Intent mResultData = null;
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mTitleReady = false;
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mDefaultKeyMode = DEFAULT_KEYS_DISABLE;
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private SpannableStringBuilder mDefaultKeySsb = null;
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static final int[] FOCUSED_STATE_SET = {com.android.internal.R.attr.state_focused};
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Thread mUiThread;
699b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    final Handler mHandler = new Handler();
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
70182fe564267f276151063b2aa0d26075c3210d75fCarl Shapiro    // Used for debug only
70282fe564267f276151063b2aa0d26075c3210d75fCarl Shapiro    /*
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Activity() {
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ++sInstanceCount;
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void finalize() throws Throwable {
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.finalize();
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        --sInstanceCount;
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
71282fe564267f276151063b2aa0d26075c3210d75fCarl Shapiro    */
71382fe564267f276151063b2aa0d26075c3210d75fCarl Shapiro
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static long getInstanceCount() {
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sInstanceCount;
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Return the intent that started this activity. */
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Intent getIntent() {
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mIntent;
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Change the intent returned by {@link #getIntent}.  This holds a
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * reference to the given intent; it does not copy it.  Often used in
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * conjunction with {@link #onNewIntent}.
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param newIntent The new Intent object to return from getIntent
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getIntent
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onNewIntent
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setIntent(Intent newIntent) {
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mIntent = newIntent;
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Return the application that owns this activity. */
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final Application getApplication() {
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mApplication;
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Is this activity embedded inside of another activity? */
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean isChild() {
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mParent != null;
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Return the parent activity if this view is an embedded child. */
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final Activity getParent() {
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mParent;
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Retrieve the window manager for showing custom windows. */
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public WindowManager getWindowManager() {
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mWindowManager;
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the current {@link android.view.Window} for the activity.
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This can be used to directly access parts of the Window API that
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * are not available through Activity/Screen.
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Window The current window, or null if the activity is not
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         visual.
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Window getWindow() {
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mWindow;
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
770c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn     * Return the LoaderManager for this fragment, creating it if needed.
771c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn     */
772c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn    public LoaderManager getLoaderManager() {
773c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn        if (mLoaderManager != null) {
774c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn            return mLoaderManager;
775c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn        }
776c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn        mLoaderManager = getLoaderManager(-1, false);
777c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn        return mLoaderManager;
778c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn    }
779c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn
780c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn    LoaderManager getLoaderManager(int index, boolean started) {
781c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn        if (mAllLoaderManagers == null) {
782c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn            mAllLoaderManagers = new SparseArray<LoaderManager>();
783c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn        }
784c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn        LoaderManager lm = mAllLoaderManagers.get(index);
785c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn        if (lm == null) {
786c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn            lm = new LoaderManager(started);
787c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn            mAllLoaderManagers.put(index, lm);
788c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn        }
789c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn        return lm;
790c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn    }
791c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn
792c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn    /**
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Calls {@link android.view.Window#getCurrentFocus} on the
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Window of this Activity to return the currently focused view.
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return View The current View with focus or null.
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getWindow
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.view.Window#getCurrentFocus
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public View getCurrentFocus() {
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mWindow != null ? mWindow.getCurrentFocus() : null;
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getWallpaperDesiredMinimumWidth() {
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int width = super.getWallpaperDesiredMinimumWidth();
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return width <= 0 ? getWindowManager().getDefaultDisplay().getWidth() : width;
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getWallpaperDesiredMinimumHeight() {
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int height = super.getWallpaperDesiredMinimumHeight();
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return height <= 0 ? getWindowManager().getDefaultDisplay().getHeight() : height;
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when the activity is starting.  This is where most initialization
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * should go: calling {@link #setContentView(int)} to inflate the
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity's UI, using {@link #findViewById} to programmatically interact
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * with widgets in the UI, calling
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #managedQuery(android.net.Uri , String[], String, String[], String)} to retrieve
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * cursors for data being displayed, etc.
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>You can call {@link #finish} from within this function, in
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * which case onDestroy() will be immediately called without any of the rest
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of the activity lifecycle ({@link #onStart}, {@link #onResume},
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onPause}, etc) executing.
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Derived classes must call through to the super class's
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method.  If they do not, an exception will be
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thrown.</em></p>
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param savedInstanceState If the activity is being re-initialized after
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *     previously being shut down then this Bundle contains the data it most
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *     recently supplied in {@link #onSaveInstanceState}.  <b><i>Note: Otherwise it is null.</i></b>
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onStart
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onSaveInstanceState
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onRestoreInstanceState
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPostCreate
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onCreate(Bundle savedInstanceState) {
844bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn        mVisibleFromClient = !mWindow.getWindowStyle().getBoolean(
845bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn                com.android.internal.R.styleable.Window_windowNoDisplay, false);
846b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (savedInstanceState != null) {
847b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            Parcelable p = savedInstanceState.getParcelable(FRAGMENTS_TAG);
848b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            mFragments.restoreAllState(p, mLastNonConfigurationInstances != null
849b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    ? mLastNonConfigurationInstances.fragments : null);
850b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
851b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mFragments.dispatchCreate();
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The hook for {@link ActivityThread} to restore the state of this activity.
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Calls {@link #onSaveInstanceState(android.os.Bundle)} and
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #restoreManagedDialogs(android.os.Bundle)}.
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param savedInstanceState contains the saved state
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performRestoreInstanceState(Bundle savedInstanceState) {
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onRestoreInstanceState(savedInstanceState);
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        restoreManagedDialogs(savedInstanceState);
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This method is called after {@link #onStart} when the activity is
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * being re-initialized from a previously saved state, given here in
871305de9dbda4e40d60ca99dda307ccd5e3c23e0a0Mike LeBeau     * <var>savedInstanceState</var>.  Most implementations will simply use {@link #onCreate}
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to restore their state, but it is sometimes convenient to do it here
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * after all of the initialization has been done or to allow subclasses to
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * decide whether to use your default implementation.  The default
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method performs a restore of any view state that
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * had previously been frozen by {@link #onSaveInstanceState}.
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This method is called between {@link #onStart} and
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onPostCreate}.
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param savedInstanceState the data most recently supplied in {@link #onSaveInstanceState}.
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onCreate
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPostCreate
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onResume
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onSaveInstanceState
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onRestoreInstanceState(Bundle savedInstanceState) {
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mWindow != null) {
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Bundle windowState = savedInstanceState.getBundle(WINDOW_HIERARCHY_TAG);
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (windowState != null) {
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWindow.restoreHierarchyState(windowState);
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Restore the state of any saved managed dialogs.
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param savedInstanceState The bundle to restore from.
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void restoreManagedDialogs(Bundle savedInstanceState) {
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Bundle b = savedInstanceState.getBundle(SAVED_DIALOGS_TAG);
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (b == null) {
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int[] ids = b.getIntArray(SAVED_DIALOG_IDS_KEY);
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int numDialogs = ids.length;
9108ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        mManagedDialogs = new SparseArray<ManagedDialog>(numDialogs);
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < numDialogs; i++) {
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final Integer dialogId = ids[i];
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Bundle dialogState = b.getBundle(savedDialogKeyFor(dialogId));
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (dialogState != null) {
915e35c23514592efe07d54fdbed7e7ec0b717e8bbeRomain Guy                // Calling onRestoreInstanceState() below will invoke dispatchOnCreate
916e35c23514592efe07d54fdbed7e7ec0b717e8bbeRomain Guy                // so tell createDialog() not to do it, otherwise we get an exception
9178ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                final ManagedDialog md = new ManagedDialog();
9188ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                md.mArgs = b.getBundle(savedDialogArgsKeyFor(dialogId));
9198ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                md.mDialog = createDialog(dialogId, dialogState, md.mArgs);
9208ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                if (md.mDialog != null) {
9218ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                    mManagedDialogs.put(dialogId, md);
9228ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                    onPrepareDialog(dialogId, md.mDialog, md.mArgs);
9238ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                    md.mDialog.onRestoreInstanceState(dialogState);
9248ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                }
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9298ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    private Dialog createDialog(Integer dialogId, Bundle state, Bundle args) {
9308ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        final Dialog dialog = onCreateDialog(dialogId, args);
931764d5331d15c19162c938e617777b4bf15a6314dRomain Guy        if (dialog == null) {
9328ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            return null;
933764d5331d15c19162c938e617777b4bf15a6314dRomain Guy        }
9346de4aed1c67263269f83f579ec5b06263d173ef3Romain Guy        dialog.dispatchOnCreate(state);
935764d5331d15c19162c938e617777b4bf15a6314dRomain Guy        return dialog;
936764d5331d15c19162c938e617777b4bf15a6314dRomain Guy    }
937764d5331d15c19162c938e617777b4bf15a6314dRomain Guy
9388ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    private static String savedDialogKeyFor(int key) {
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return SAVED_DIALOG_KEY_PREFIX + key;
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9428ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    private static String savedDialogArgsKeyFor(int key) {
9438ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        return SAVED_DIALOG_ARGS_KEY_PREFIX + key;
9448ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    }
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when activity start-up is complete (after {@link #onStart}
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and {@link #onRestoreInstanceState} have been called).  Applications will
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * generally not implement this method; it is intended for system
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * classes to do final initialization after application code has run.
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Derived classes must call through to the super class's
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method.  If they do not, an exception will be
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thrown.</em></p>
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param savedInstanceState If the activity is being re-initialized after
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *     previously being shut down then this Bundle contains the data it most
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *     recently supplied in {@link #onSaveInstanceState}.  <b><i>Note: Otherwise it is null.</i></b>
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onCreate
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onPostCreate(Bundle savedInstanceState) {
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!isChild()) {
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTitleReady = true;
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            onTitleChanged(getTitle(), getTitleColor());
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
96696675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell        if (mWindow != null && mWindow.hasFeature(Window.FEATURE_ACTION_BAR)) {
96796675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell            // Invalidate the action bar menu so that it can initialize properly.
96896675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell            mWindow.invalidatePanelMenu(Window.FEATURE_ACTION_BAR);
96996675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell        }
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called after {@link #onCreate} &mdash; or after {@link #onRestart} when
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the activity had been stopped, but is now again being displayed to the
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	 * user.  It will be followed by {@link #onResume}.
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Derived classes must call through to the super class's
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method.  If they do not, an exception will be
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thrown.</em></p>
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onCreate
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onStop
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onResume
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onStart() {
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called after {@link #onStop} when the current activity is being
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * re-displayed to the user (the user has navigated back to it).  It will
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be followed by {@link #onStart} and then {@link #onResume}.
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>For activities that are using raw {@link Cursor} objects (instead of
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * creating them through
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #managedQuery(android.net.Uri , String[], String, String[], String)},
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this is usually the place
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * where the cursor should be requeried (because you had deactivated it in
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onStop}.
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Derived classes must call through to the super class's
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method.  If they do not, an exception will be
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thrown.</em></p>
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onStop
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onStart
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onResume
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onRestart() {
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called after {@link #onRestoreInstanceState}, {@link #onRestart}, or
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onPause}, for your activity to start interacting with the user.
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is a good place to begin animations, open exclusive-access devices
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * (such as the camera), etc.
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Keep in mind that onResume is not the best indicator that your activity
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is visible to the user; a system window such as the keyguard may be in
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * front.  Use {@link #onWindowFocusChanged} to know for certain that your
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity is visible to the user (for example, to resume a game).
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Derived classes must call through to the super class's
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method.  If they do not, an exception will be
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thrown.</em></p>
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onRestoreInstanceState
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onRestart
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPostResume
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPause
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onResume() {
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when activity resume is complete (after {@link #onResume} has
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * been called). Applications will generally not implement this method;
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * it is intended for system classes to do final setup after application
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * resume code has run.
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Derived classes must call through to the super class's
10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method.  If they do not, an exception will be
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thrown.</em></p>
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onResume
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onPostResume() {
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Window win = getWindow();
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (win != null) win.makeActive();
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is called for activities that set launchMode to "singleTop" in
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * their package, or if a client used the {@link Intent#FLAG_ACTIVITY_SINGLE_TOP}
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * flag when calling {@link #startActivity}.  In either case, when the
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity is re-launched while at the top of the activity stack instead
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of a new instance of the activity being started, onNewIntent() will be
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * called on the existing instance with the Intent that was used to
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * re-launch it.
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>An activity will always be paused before receiving a new intent, so
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * you can count on {@link #onResume} being called after this method.
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note that {@link #getIntent} still returns the original Intent.  You
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * can use {@link #setIntent} to update it to this new Intent.
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param intent The new intent that was started for the activity.
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getIntent
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setIntent
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onResume
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onNewIntent(Intent intent) {
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The hook for {@link ActivityThread} to save the state of this activity.
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Calls {@link #onSaveInstanceState(android.os.Bundle)}
10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and {@link #saveManagedDialogs(android.os.Bundle)}.
10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param outState The bundle to save the state to.
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performSaveInstanceState(Bundle outState) {
10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onSaveInstanceState(outState);
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        saveManagedDialogs(outState);
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called to retrieve per-instance state from an activity before being killed
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * so that the state can be restored in {@link #onCreate} or
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onRestoreInstanceState} (the {@link Bundle} populated by this method
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will be passed to both).
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This method is called before an activity may be killed so that when it
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * comes back some time in the future it can restore its state.  For example,
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if activity B is launched in front of activity A, and at some point activity
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A is killed to reclaim resources, activity A will have a chance to save the
11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * current state of its user interface via this method so that when the user
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returns to activity A, the state of the user interface can be restored
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * via {@link #onCreate} or {@link #onRestoreInstanceState}.
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Do not confuse this method with activity lifecycle callbacks such as
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onPause}, which is always called when an activity is being placed
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in the background or on its way to destruction, or {@link #onStop} which
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is called before destruction.  One example of when {@link #onPause} and
11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onStop} is called and not this method is when a user navigates back
11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * from activity B to activity A: there is no need to call {@link #onSaveInstanceState}
11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * on B because that particular instance will never be restored, so the
11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * system avoids calling it.  An example when {@link #onPause} is called and
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not {@link #onSaveInstanceState} is when activity B is launched in front of activity A:
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the system may avoid calling {@link #onSaveInstanceState} on activity A if it isn't
11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * killed during the lifetime of B since the state of the user interface of
11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A will stay intact.
11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The default implementation takes care of most of the UI per-instance
11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * state for you by calling {@link android.view.View#onSaveInstanceState()} on each
11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * view in the hierarchy that has an id, and by saving the id of the currently
11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * focused view (all of which is restored by the default implementation of
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onRestoreInstanceState}).  If you override this method to save additional
11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * information not captured by each individual view, you will likely want to
11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * call through to the default implementation, otherwise be prepared to save
11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * all of the state of each view yourself.
11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>If called, this method will occur before {@link #onStop}.  There are
11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * no guarantees about whether it will occur before or after {@link #onPause}.
11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param outState Bundle in which to place your saved state.
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onCreate
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onRestoreInstanceState
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPause
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onSaveInstanceState(Bundle outState) {
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outState.putBundle(WINDOW_HIERARCHY_TAG, mWindow.saveHierarchyState());
1140b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        Parcelable p = mFragments.saveAllState();
1141b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (p != null) {
1142b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            outState.putParcelable(FRAGMENTS_TAG, p);
1143b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Save the state of any managed dialogs.
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param outState place to store the saved state.
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void saveManagedDialogs(Bundle outState) {
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mManagedDialogs == null) {
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int numDialogs = mManagedDialogs.size();
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (numDialogs == 0) {
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Bundle dialogState = new Bundle();
11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int[] ids = new int[mManagedDialogs.size()];
11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // save each dialog's bundle, gather the ids
11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < numDialogs; i++) {
11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int key = mManagedDialogs.keyAt(i);
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ids[i] = key;
11698ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            final ManagedDialog md = mManagedDialogs.valueAt(i);
11708ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            dialogState.putBundle(savedDialogKeyFor(key), md.mDialog.onSaveInstanceState());
11718ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            if (md.mArgs != null) {
11728ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                dialogState.putBundle(savedDialogArgsKeyFor(key), md.mArgs);
11738ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            }
11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dialogState.putIntArray(SAVED_DIALOG_IDS_KEY, ids);
11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outState.putBundle(SAVED_DIALOGS_TAG, dialogState);
11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called as part of the activity lifecycle when an activity is going into
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the background, but has not (yet) been killed.  The counterpart to
11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onResume}.
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>When activity B is launched in front of activity A, this callback will
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be invoked on A.  B will not be created until A's {@link #onPause} returns,
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * so be sure to not do anything lengthy here.
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This callback is mostly used for saving any persistent state the
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity is editing, to present a "edit in place" model to the user and
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * making sure nothing is lost if there are not enough resources to start
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the new activity without first killing this one.  This is also a good
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * place to do things like stop animations and other things that consume a
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * noticeable mount of CPU in order to make the switch to the next activity
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * as fast as possible, or to close resources that are exclusive access
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * such as the camera.
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>In situations where the system needs more memory it may kill paused
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * processes to reclaim resources.  Because of this, you should be sure
12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that all of your state is saved by the time you return from
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this function.  In general {@link #onSaveInstanceState} is used to save
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * per-instance state in the activity and this method is used to store
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * global persistent data (in content providers, files, etc.)
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>After receiving this call you will usually receive a following call
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to {@link #onStop} (after the next activity has been resumed and
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * displayed), however in some cases there will be a direct call back to
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onResume} without going through the stopped state.
12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Derived classes must call through to the super class's
12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method.  If they do not, an exception will be
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thrown.</em></p>
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onResume
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onSaveInstanceState
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onStop
12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onPause() {
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called as part of the activity lifecycle when an activity is about to go
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * into the background as the result of user choice.  For example, when the
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * user presses the Home key, {@link #onUserLeaveHint} will be called, but
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * when an incoming phone call causes the in-call Activity to be automatically
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * brought to the foreground, {@link #onUserLeaveHint} will not be called on
12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the activity being interrupted.  In cases when it is invoked, this method
12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is called right before the activity's {@link #onPause} callback.
12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This callback and {@link #onUserInteraction} are intended to help
12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activities manage status bar notifications intelligently; specifically,
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for helping activities determine the proper time to cancel a notfication.
12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onUserInteraction()
12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onUserLeaveHint() {
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Generate a new thumbnail for this activity.  This method is called before
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * pausing the activity, and should draw into <var>outBitmap</var> the
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * imagery for the desired thumbnail in the dimensions of that bitmap.  It
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * can use the given <var>canvas</var>, which is configured to draw into the
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * bitmap, for rendering if desired.
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The default implementation renders the Screen's current view
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * hierarchy into the canvas to generate a thumbnail.
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>If you return false, the bitmap will be filled with a default
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thumbnail.
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param outBitmap The bitmap to contain the thumbnail.
12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param canvas Can be used to render into the bitmap.
12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Return true if you have drawn into the bitmap; otherwise after
12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         you return it will be filled with a default thumbnail.
12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onCreateDescription
12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onSaveInstanceState
12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPause
12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onCreateThumbnail(Bitmap outBitmap, Canvas canvas) {
12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final View view = mDecor;
12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (view == null) {
12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int vw = view.getWidth();
12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int vh = view.getHeight();
12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int dw = outBitmap.getWidth();
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int dh = outBitmap.getHeight();
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        canvas.save();
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        canvas.scale(((float)dw)/vw, ((float)dh)/vh);
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        view.draw(canvas);
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        canvas.restore();
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Generate a new description for this activity.  This method is called
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * before pausing the activity and can, if desired, return some textual
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * description of its current state to be displayed to the user.
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The default implementation returns null, which will cause you to
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * inherit the description from the previous activity.  If all activities
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * return null, generally the label of the top activity will be used as the
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * description.
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return A description of what the user is doing.  It should be short and
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         sweet (only a few words).
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onCreateThumbnail
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onSaveInstanceState
12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPause
12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public CharSequence onCreateDescription() {
13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when you are no longer visible to the user.  You will next
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * receive either {@link #onRestart}, {@link #onDestroy}, or nothing,
13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * depending on later user activity.
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note that this method may never be called, in low memory situations
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * where the system does not have enough memory to keep your activity's
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * process running after its {@link #onPause} method is called.
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Derived classes must call through to the super class's
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method.  If they do not, an exception will be
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thrown.</em></p>
13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onRestart
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onResume
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onSaveInstanceState
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onDestroy
13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onStop() {
13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Perform any final cleanup before an activity is destroyed.  This can
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * happen either because the activity is finishing (someone called
13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #finish} on it, or because the system is temporarily destroying
13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this instance of the activity to save space.  You can distinguish
13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * between these two scenarios with the {@link #isFinishing} method.
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Note: do not count on this method being called as a place for
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * saving data! For example, if an activity is editing data in a content
13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * provider, those edits should be committed in either {@link #onPause} or
13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onSaveInstanceState}, not here.</em> This method is usually implemented to
13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * free resources like threads that are associated with an activity, so
13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that a destroyed activity does not leave such things around while the
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * rest of its application is still running.  There are situations where
13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the system will simply kill the activity's hosting process without
13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * calling this method (or any others) in it, so it should not be used to
13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * do things that are intended to remain around after the process goes
13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * away.
13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Derived classes must call through to the super class's
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method.  If they do not, an exception will be
13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thrown.</em></p>
13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPause
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onStop
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #finish
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isFinishing
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onDestroy() {
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // dismiss any dialogs we are managing.
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mManagedDialogs != null) {
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int numDialogs = mManagedDialogs.size();
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i = 0; i < numDialogs; i++) {
13618ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                final ManagedDialog md = mManagedDialogs.valueAt(i);
13628ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                if (md.mDialog.isShowing()) {
13638ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                    md.mDialog.dismiss();
13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13668ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            mManagedDialogs = null;
13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // close any cursors we are managing.
13702f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki        synchronized (mManagedCursors) {
13712f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki            int numCursors = mManagedCursors.size();
13722f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki            for (int i = 0; i < numCursors; i++) {
13732f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                ManagedCursor c = mManagedCursors.get(i);
13742f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                if (c != null) {
13752f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                    c.mCursor.close();
13762f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                }
13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13782f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki            mManagedCursors.clear();
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13804986044fd3bce877247e425374b47967775081a8Amith Yamasani
13814986044fd3bce877247e425374b47967775081a8Amith Yamasani        // Close any open search dialog
13824986044fd3bce877247e425374b47967775081a8Amith Yamasani        if (mSearchManager != null) {
13834986044fd3bce877247e425374b47967775081a8Amith Yamasani            mSearchManager.stopSearch();
13844986044fd3bce877247e425374b47967775081a8Amith Yamasani        }
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called by the system when the device configuration changes while your
13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity is running.  Note that this will <em>only</em> be called if
13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * you have selected configurations you would like to handle with the
13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.R.attr#configChanges} attribute in your manifest.  If
13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * any configuration change occurs that is not selected to be reported
13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * by that attribute, then instead of reporting it the system will stop
13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and restart the activity (to have it launched with the new
13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * configuration).
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>At the time that this function has been called, your Resources
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * object will have been updated to return resource values matching the
13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * new configuration.
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param newConfig The new device configuration.
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onConfigurationChanged(Configuration newConfig) {
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
1405444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mWindow != null) {
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Pass the configuration changed event to the window
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindow.onConfigurationChanged(newConfig);
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If this activity is being destroyed because it can not handle a
14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * configuration parameter being changed (and thus its
14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onConfigurationChanged(Configuration)} method is
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <em>not</em> being called), then you can use this method to discover
14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the set of changes that have occurred while in the process of being
14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * destroyed.  Note that there is no guarantee that these will be
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * accurate (other changes could have happened at any time), so you should
14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * only use this as an optimization hint.
14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns a bit field of the configuration parameters that are
14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * changing, as defined by the {@link android.content.res.Configuration}
14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * class.
14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getChangingConfigurations() {
14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mConfigChangeFlags;
14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the non-configuration instance data that was previously
14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returned by {@link #onRetainNonConfigurationInstance()}.  This will
14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be available from the initial {@link #onCreate} and
14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onStart} calls to the new instance, allowing you to extract
14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * any useful dynamic state from the previous instance.
14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note that the data you retrieve here should <em>only</em> be used
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * as an optimization for handling configuration changes.  You should always
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be able to handle getting a null pointer back, and an activity must
14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * still be able to restore itself to its previous state (through the
14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * normal {@link #onSaveInstanceState(Bundle)} mechanism) even if this
14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * function returns null.
14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the object previously returned by
14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onRetainNonConfigurationInstance()}.
14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Object getLastNonConfigurationInstance() {
1448b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return mLastNonConfigurationInstances != null
1449b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                ? mLastNonConfigurationInstances.activity : null;
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called by the system, as part of destroying an
14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity due to a configuration change, when it is known that a new
14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * instance will immediately be created for the new configuration.  You
14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * can return any object you like here, including the activity instance
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * itself, which can later be retrieved by calling
14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getLastNonConfigurationInstance()} in the new activity
14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * instance.
14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This function is called purely as an optimization, and you must
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not rely on it being called.  When it is called, a number of guarantees
14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will be made to help optimize configuration switching:
14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <ul>
14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li> The function will be called between {@link #onStop} and
14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onDestroy}.
14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li> A new instance of the activity will <em>always</em> be immediately
14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * created after this one's {@link #onDestroy()} is called.
14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li> The object you return here will <em>always</em> be available from
14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the {@link #getLastNonConfigurationInstance()} method of the following
14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity instance as described there.
14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </ul>
14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>These guarantees are designed so that an activity can use this API
14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to propagate extensive state from the old to new activity instance, from
14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * loaded bitmaps, to network connections, to evenly actively running
14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * threads.  Note that you should <em>not</em> propagate any data that
14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * may change based on the configuration, including any data loaded from
14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * resources such as strings, layouts, or drawables.
14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Return any Object holding the desired state to propagate to the
14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * next activity instance.
14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Object onRetainNonConfigurationInstance() {
14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the non-configuration instance data that was previously
14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returned by {@link #onRetainNonConfigurationChildInstances()}.  This will
14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be available from the initial {@link #onCreate} and
14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onStart} calls to the new instance, allowing you to extract
14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * any useful dynamic state from the previous instance.
14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note that the data you retrieve here should <em>only</em> be used
14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * as an optimization for handling configuration changes.  You should always
14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be able to handle getting a null pointer back, and an activity must
14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * still be able to restore itself to its previous state (through the
14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * normal {@link #onSaveInstanceState(Bundle)} mechanism) even if this
15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * function returns null.
15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the object previously returned by
15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onRetainNonConfigurationChildInstances()}
15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1505b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    HashMap<String, Object> getLastNonConfigurationChildInstances() {
1506b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return mLastNonConfigurationInstances != null
1507b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                ? mLastNonConfigurationInstances.children : null;
15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This method is similar to {@link #onRetainNonConfigurationInstance()} except that
15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * it should return either a mapping from  child activity id strings to arbitrary objects,
15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * or null.  This method is intended to be used by Activity framework subclasses that control a
15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * set of child activities, such as ActivityGroup.  The same guarantees and restrictions apply
15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * as for {@link #onRetainNonConfigurationInstance()}.  The default implementation returns null.
15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    HashMap<String,Object> onRetainNonConfigurationChildInstances() {
15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1521b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    NonConfigurationInstances retainNonConfigurationInstances() {
1522b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        Object activity = onRetainNonConfigurationInstance();
1523b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        HashMap<String, Object> children = onRetainNonConfigurationChildInstances();
1524b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        ArrayList<Fragment> fragments = mFragments.retainNonConfig();
1525b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (activity == null && children == null && fragments == null) {
1526b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            return null;
1527b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
1528b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
1529b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        NonConfigurationInstances nci = new NonConfigurationInstances();
1530b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        nci.activity = activity;
1531b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        nci.children = children;
1532b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        nci.fragments = fragments;
1533b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return nci;
1534b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
1535b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onLowMemory() {
15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
15412dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn     * Start a series of edit operations on the Fragments associated with
15422dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn     * this activity.
15432dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn     */
15442dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    public FragmentTransaction openFragmentTransaction() {
1545b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return new BackStackEntry(mFragments);
15462dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
15472dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
15482dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    /**
1549c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn     * Called when a Fragment is being attached to this activity, immediately
1550c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn     * after the call to its {@link Fragment#onAttach Fragment.onAttach()}
1551c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn     * method and before {@link Fragment#onCreate Fragment.onCreate()}.
1552c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn     */
1553c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn    public void onAttachFragment(Fragment fragment) {
1554c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn    }
1555c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn
1556c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn    /**
15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Wrapper around
15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link ContentResolver#query(android.net.Uri , String[], String, String[], String)}
15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that gives the resulting {@link Cursor} to call
15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #startManagingCursor} so that the activity will manage its
15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * lifecycle for you.
15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param uri The URI of the content provider to query.
15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param projection List of columns to return.
15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param selection SQL WHERE clause.
15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param sortOrder SQL ORDER BY clause.
15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The Cursor that was returned by query().
15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see ContentResolver#query(android.net.Uri , String[], String, String[], String)
15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startManagingCursor
15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final Cursor managedQuery(Uri uri,
15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                     String[] projection,
15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                     String selection,
15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                     String sortOrder)
15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Cursor c = getContentResolver().query(uri, projection, selection, null, sortOrder);
15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (c != null) {
15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            startManagingCursor(c);
15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return c;
15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Wrapper around
15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link ContentResolver#query(android.net.Uri , String[], String, String[], String)}
15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that gives the resulting {@link Cursor} to call
15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #startManagingCursor} so that the activity will manage its
15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * lifecycle for you.
15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param uri The URI of the content provider to query.
15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param projection List of columns to return.
15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param selection SQL WHERE clause.
15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param selectionArgs The arguments to selection, if any ?s are pesent
15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param sortOrder SQL ORDER BY clause.
15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The Cursor that was returned by query().
16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see ContentResolver#query(android.net.Uri , String[], String, String[], String)
16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startManagingCursor
16039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final Cursor managedQuery(Uri uri,
16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                     String[] projection,
16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                     String selection,
16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                     String[] selectionArgs,
16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                     String sortOrder)
16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Cursor c = getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder);
16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (c != null) {
16129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            startManagingCursor(c);
16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return c;
16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This method allows the activity to take care of managing the given
16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link Cursor}'s lifecycle for you based on the activity's lifecycle.
16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * That is, when the activity is stopped it will automatically call
16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link Cursor#deactivate} on the given Cursor, and when it is later restarted
16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * it will call {@link Cursor#requery} for you.  When the activity is
16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * destroyed, all managed Cursors will be closed automatically.
16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param c The Cursor to be managed.
16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #managedQuery(android.net.Uri , String[], String, String[], String)
16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #stopManagingCursor
16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startManagingCursor(Cursor c) {
16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mManagedCursors) {
16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mManagedCursors.add(new ManagedCursor(c));
16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Given a Cursor that was previously given to
16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #startManagingCursor}, stop the activity's management of that
16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * cursor.
16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param c The Cursor that was being managed.
16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startManagingCursor
16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void stopManagingCursor(Cursor c) {
16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mManagedCursors) {
16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = mManagedCursors.size();
16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=0; i<N; i++) {
16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ManagedCursor mc = mManagedCursors.get(i);
16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mc.mCursor == c) {
16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mManagedCursors.remove(i);
16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Control whether this activity is required to be persistent.  By default
16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activities are not persistent; setting this to true will prevent the
16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * system from stopping this activity or its process when running low on
16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * resources.
16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>You should avoid using this method</em>, it has severe negative
16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * consequences on how well the system can manage its resources.  A better
16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * approach is to implement an application service that you control with
16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link Context#startService} and {@link Context#stopService}.
16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param isPersistent Control whether the current activity must be
16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                     persistent, true if so, false for the normal
16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                     behavior.
16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setPersistent(boolean isPersistent) {
16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent == null) {
16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityManagerNative.getDefault()
16779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    .setPersistent(mToken, isPersistent);
16789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Empty
16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("setPersistent() not yet supported for embedded activities");
16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Finds a view that was identified by the id attribute from the XML that
16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * was processed in {@link #onCreate}.
16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The view if found or null otherwise.
16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public View findViewById(int id) {
16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getWindow().findViewById(id);
16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
169533b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell
169633b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell    /**
169733b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell     * Retrieve a reference to this activity's ActionBar.
169833b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell     *
169933b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell     * <p><em>Note:</em> The ActionBar is initialized when a content view
170033b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell     * is set. This function will return null if called before {@link #setContentView}
170133b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell     * or {@link #addContentView}.
170233b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell     * @return The Activity's ActionBar, or null if it does not have one.
170333b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell     */
170433b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell    public ActionBar getActionBar() {
170533b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell        return mActionBar;
170633b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell    }
170733b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell
17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
170933b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell     * Creates a new ActionBar, locates the inflated ActionBarView,
171033b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell     * initializes the ActionBar with the view, and sets mActionBar.
171133b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell     */
171233b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell    private void initActionBar() {
171389e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell        Window window = getWindow();
1714661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell        if (!window.hasFeature(Window.FEATURE_ACTION_BAR) || mActionBar != null) {
171533b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell            return;
171633b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell        }
171733b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell
1718661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell        mActionBar = new ActionBarImpl(this);
171933b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell    }
172033b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell
172133b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell    /**
1722b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * Finds a fragment that was identified by the given id either when inflated
1723b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * from XML or as the container ID when added in a transaction.  This only
1724b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * returns fragments that are currently added to the activity's content.
1725b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * @return The fragment if found or null otherwise.
1726b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     */
1727b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public Fragment findFragmentById(int id) {
1728b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return mFragments.findFragmentById(id);
1729b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
1730b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
1731b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    /**
1732b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * Finds a fragment that was identified by the given tag either when inflated
1733b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * from XML or as supplied when added in a transaction.  This only
1734b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * returns fragments that are currently added to the activity's content.
1735b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * @return The fragment if found or null otherwise.
1736b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     */
1737b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public Fragment findFragmentByTag(String tag) {
1738b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return mFragments.findFragmentByTag(tag);
1739b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
1740b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
1741b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    /**
17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the activity content from a layout resource.  The resource will be
17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * inflated, adding all top-level views to the activity.
17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param layoutResID Resource ID to be inflated.
17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setContentView(int layoutResID) {
17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setContentView(layoutResID);
174933b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell        initActionBar();
17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the activity content to an explicit view.  This view is placed
17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * directly into the activity's view hierarchy.  It can itself be a complex
17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * view hierarhcy.
17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param view The desired content to display.
17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setContentView(View view) {
17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setContentView(view);
176133b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell        initActionBar();
17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the activity content to an explicit view.  This view is placed
17669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * directly into the activity's view hierarchy.  It can itself be a complex
17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * view hierarhcy.
17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param view The desired content to display.
17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param params Layout parameters for the view.
17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setContentView(View view, ViewGroup.LayoutParams params) {
17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setContentView(view, params);
177433b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell        initActionBar();
17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Add an additional content view to the activity.  Added after any existing
17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ones in the activity -- existing views are NOT removed.
17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
17819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param view The desired content to display.
17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param params Layout parameters for the view.
17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void addContentView(View view, ViewGroup.LayoutParams params) {
17859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().addContentView(view, params);
178633b974393b6fadcefc896ec4a0f9b66724f61e9fAdam Powell        initActionBar();
17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setDefaultKeyMode} to turn off default handling of
17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * keys.
17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setDefaultKeyMode
17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public final int DEFAULT_KEYS_DISABLE = 0;
17969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
17979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setDefaultKeyMode} to launch the dialer during default
17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * key handling.
17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setDefaultKeyMode
18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public final int DEFAULT_KEYS_DIALER = 1;
18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setDefaultKeyMode} to execute a menu shortcut in
18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * default key handling.
18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>That is, the user does not need to hold down the menu key to execute menu shortcuts.
18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setDefaultKeyMode
18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public final int DEFAULT_KEYS_SHORTCUT = 2;
18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setDefaultKeyMode} to specify that unhandled keystrokes
18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will start an application-defined search.  (If the application or activity does not
18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * actually define a search, the the keys will be ignored.)
18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>See {@link android.app.SearchManager android.app.SearchManager} for more details.
18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setDefaultKeyMode
18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public final int DEFAULT_KEYS_SEARCH_LOCAL = 3;
18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setDefaultKeyMode} to specify that unhandled keystrokes
18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will start a global search (typically web search, but some platforms may define alternate
18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * methods for global search)
18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>See {@link android.app.SearchManager android.app.SearchManager} for more details.
18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setDefaultKeyMode
18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public final int DEFAULT_KEYS_SEARCH_GLOBAL = 4;
18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Select the default key handling for this activity.  This controls what
18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will happen to key events that are not otherwise handled.  The default
18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * mode ({@link #DEFAULT_KEYS_DISABLE}) will simply drop them on the
18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * floor. Other modes allow you to launch the dialer
18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ({@link #DEFAULT_KEYS_DIALER}), execute a shortcut in your options
18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * menu without requiring the menu key be held down
18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ({@link #DEFAULT_KEYS_SHORTCUT}), or launch a search ({@link #DEFAULT_KEYS_SEARCH_LOCAL}
18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and {@link #DEFAULT_KEYS_SEARCH_GLOBAL}).
18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note that the mode selected here does not impact the default
18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * handling of system keys, such as the "back" and "menu" keys, and your
18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity and its views always get a first chance to receive and handle
18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * all application keys.
18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param mode The desired default key mode constant.
18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #DEFAULT_KEYS_DISABLE
18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #DEFAULT_KEYS_DIALER
18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #DEFAULT_KEYS_SHORTCUT
18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #DEFAULT_KEYS_SEARCH_LOCAL
18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #DEFAULT_KEYS_SEARCH_GLOBAL
18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onKeyDown
18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setDefaultKeyMode(int mode) {
18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDefaultKeyMode = mode;
18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Some modes use a SpannableStringBuilder to track & dispatch input events
18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // This list must remain in sync with the switch in onKeyDown()
18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (mode) {
18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case DEFAULT_KEYS_DISABLE:
18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case DEFAULT_KEYS_SHORTCUT:
18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDefaultKeySsb = null;      // not used in these modes
18679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case DEFAULT_KEYS_DIALER:
18699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case DEFAULT_KEYS_SEARCH_LOCAL:
18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case DEFAULT_KEYS_SEARCH_GLOBAL:
18719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDefaultKeySsb = new SpannableStringBuilder();
18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Selection.setSelection(mDefaultKeySsb,0);
18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
18749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        default:
18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException();
18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
18809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when a key was pressed down and not handled by any of the views
18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * inside of the activity. So, for example, key presses while the cursor
18829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is inside a TextView will not trigger the event (unless it is a navigation
18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to another object) because TextView handles its own key presses.
18849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>If the focused view didn't want this event, this method is called.
18869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18878d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn     * <p>The default implementation takes care of {@link KeyEvent#KEYCODE_BACK}
18888d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn     * by calling {@link #onBackPressed()}, though the behavior varies based
18898d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn     * on the application compatibility mode: for
18908d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn     * {@link android.os.Build.VERSION_CODES#ECLAIR} or later applications,
18918d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn     * it will set up the dispatch to call {@link #onKeyUp} where the action
18928d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn     * will be performed; for earlier applications, it will perform the
18938d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn     * action immediately in on-down, as those versions of the platform
18948d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn     * behaved.
18958d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn     *
18968d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn     * <p>Other additional default key handling may be performed
189783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * if configured with {@link #setDefaultKeyMode}.
18989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Return <code>true</code> to prevent this event from being propagated
19009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * further, or <code>false</code> to indicate that you have not handled
19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this event and it should continue to be propagated.
19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onKeyUp
19039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.view.KeyEvent
19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onKeyDown(int keyCode, KeyEvent event)  {
190683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        if (keyCode == KeyEvent.KEYCODE_BACK) {
19078d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn            if (getApplicationInfo().targetSdkVersion
19088d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                    >= Build.VERSION_CODES.ECLAIR) {
19098d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                event.startTracking();
19108d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn            } else {
19118d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                onBackPressed();
19128d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn            }
19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mDefaultKeyMode == DEFAULT_KEYS_DISABLE) {
19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
19189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (mDefaultKeyMode == DEFAULT_KEYS_SHORTCUT) {
191983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            if (getWindow().performPanelShortcut(Window.FEATURE_OPTIONS_PANEL,
192083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                    keyCode, event, Menu.FLAG_ALWAYS_PERFORM_CLOSE)) {
192183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                return true;
192283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            }
192383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            return false;
19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Common code for DEFAULT_KEYS_DIALER & DEFAULT_KEYS_SEARCH_*
19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean clearSpannable = false;
19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean handled;
19289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((event.getRepeatCount() != 0) || event.isSystem()) {
19299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                clearSpannable = true;
19309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                handled = false;
19319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
193283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                handled = TextKeyListener.getInstance().onKeyDown(
193383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                        null, mDefaultKeySsb, keyCode, event);
19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (handled && mDefaultKeySsb.length() > 0) {
19359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // something useable has been typed - dispatch it now.
19369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final String str = mDefaultKeySsb.toString();
19389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    clearSpannable = true;
19399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    switch (mDefaultKeyMode) {
19419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    case DEFAULT_KEYS_DIALER:
19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Intent intent = new Intent(Intent.ACTION_DIAL,  Uri.parse("tel:" + str));
19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        startActivity(intent);
19459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    case DEFAULT_KEYS_SEARCH_LOCAL:
19479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        startSearch(str, false, null, false);
19489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    case DEFAULT_KEYS_SEARCH_GLOBAL:
19509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        startSearch(str, false, null, true);
19519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
19539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (clearSpannable) {
19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mDefaultKeySsb.clear();
19579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mDefaultKeySsb.clearSpans();
19589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Selection.setSelection(mDefaultKeySsb,0);
19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return handled;
19619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
196583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * Default implementation of {@link KeyEvent.Callback#onKeyLongPress(int, KeyEvent)
196683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * KeyEvent.Callback.onKeyLongPress()}: always returns false (doesn't handle
196783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * the event).
196883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
196983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public boolean onKeyLongPress(int keyCode, KeyEvent event) {
197083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        return false;
197183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    }
197283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
197383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when a key was released and not handled by any of the views
19759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * inside of the activity. So, for example, key presses while the cursor
19769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is inside a TextView will not trigger the event (unless it is a navigation
19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to another object) because TextView handles its own key presses.
19789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
197983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * <p>The default implementation handles KEYCODE_BACK to stop the activity
198083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * and go back.
198183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     *
19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Return <code>true</code> to prevent this event from being propagated
19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * further, or <code>false</code> to indicate that you have not handled
19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this event and it should continue to be propagated.
19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onKeyDown
19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see KeyEvent
19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onKeyUp(int keyCode, KeyEvent event) {
19898d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn        if (getApplicationInfo().targetSdkVersion
19908d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                >= Build.VERSION_CODES.ECLAIR) {
19918d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn            if (keyCode == KeyEvent.KEYCODE_BACK && event.isTracking()
19928d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                    && !event.isCanceled()) {
19938d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                onBackPressed();
19948d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                return true;
19958d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn            }
199683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        }
19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
19989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default implementation of {@link KeyEvent.Callback#onKeyMultiple(int, int, KeyEvent)
20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * KeyEvent.Callback.onKeyMultiple()}: always returns false (doesn't handle
20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the event).
20049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
20059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event) {
20069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
20079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2010ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn     * Pop the last fragment transition from the local activity's fragment
2011ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn     * back stack.  If there is nothing to pop, false is returned.
2012f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn     * @param name If non-null, this is the name of a previous back state
2013f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn     * to look for; if found, all states up to (but not including) that
2014f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn     * state will be popped.  If null, only the top state is popped.
2015ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn     */
2016f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    public boolean popBackStack(String name) {
2017f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        return mFragments.popBackStackState(mHandler, name);
2018ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn    }
2019ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn
2020ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn    /**
202183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * Called when the activity has detected the user's press of the back
202283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * key.  The default implementation simply finishes the current activity,
202383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * but you can override this to do whatever you want.
202483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
202583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public void onBackPressed() {
2026f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        if (!popBackStack(null)) {
2027ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn            finish();
2028ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        }
202983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    }
203083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
203183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when a touch screen event was not handled by any of the views
20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * under it.  This is most useful to process touch events that happen
20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * outside of your window bounds, where there is no view to receive it.
20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param event The touch screen event being processed.
20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Return true if you have consumed the event, false if you haven't.
20399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The default implementation always returns false.
20409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onTouchEvent(MotionEvent event) {
20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
20439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
20469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when the trackball was moved and not handled by any of the
20479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * views inside of the activity.  So, for example, if the trackball moves
20489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * while focus is on a button, you will receive a call here because
20499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * buttons do not normally do anything with trackball events.  The call
20509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * here happens <em>before</em> trackball movements are converted to
20519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * DPAD key events, which then get sent back to the view hierarchy, and
20529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will be processed at the point for things like focus navigation.
20539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
20549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param event The trackball event being processed.
20559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
20569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Return true if you have consumed the event, false if you haven't.
20579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The default implementation always returns false.
20589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
20599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onTrackballEvent(MotionEvent event) {
20609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called whenever a key, touch, or trackball event is dispatched to the
20659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity.  Implement this method if you wish to know that the user has
20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * interacted with the device in some way while your activity is running.
20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This callback and {@link #onUserLeaveHint} are intended to help
20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activities manage status bar notifications intelligently; specifically,
20699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for helping activities determine the proper time to cancel a notfication.
20709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>All calls to your activity's {@link #onUserLeaveHint} callback will
20729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be accompanied by calls to {@link #onUserInteraction}.  This
20739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ensures that your activity will be told of relevant user activity such
20749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * as pulling down the notification pane and touching an item there.
20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note that this callback will be invoked for the touch down action
20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that begins a touch gesture, but may not be invoked for the touch-moved
20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and touch-up actions that follow.
20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onUserLeaveHint()
20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
20829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onUserInteraction() {
20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onWindowAttributesChanged(WindowManager.LayoutParams params) {
20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Update window manager if: we have a view, that view is
20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // attached to its parent (which will be a RootView), and
20889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this activity is not embedded.
20899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent == null) {
20909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            View decor = mDecor;
20919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (decor != null && decor.getParent() != null) {
20929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                getWindowManager().updateViewLayout(decor, params);
20939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onContentChanged() {
20989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
21019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when the current {@link Window} of the activity gains or loses
21029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * focus.  This is the best indicator of whether this activity is visible
210383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * to the user.  The default implementation clears the key tracking
210483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * state, so should always be called.
21059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
210683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * <p>Note that this provides information about global focus state, which
21079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is managed independently of activity lifecycles.  As such, while focus
21089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * changes will generally have some relation to lifecycle changes (an
21099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity that is stopped will not generally get window focus), you
21109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * should not rely on any particular order between the callbacks here and
21119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * those in the other lifecycle methods such as {@link #onResume}.
21129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
21139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>As a general rule, however, a resumed activity will have window
21149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * focus...  unless it has displayed other dialogs or popups that take
21159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * input focus, in which case the activity itself will not have focus
21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * when the other windows have it.  Likewise, the system may display
21179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * system-level windows (such as the status bar notification panel or
21189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a system alert) which will temporarily take window input focus without
21199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * pausing the foreground activity.
21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
21219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param hasFocus Whether the window of this activity has focus.
21229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
21239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #hasWindowFocus()
21249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onResume
21253be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     * @see View#onWindowFocusChanged(boolean)
21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
21279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onWindowFocusChanged(boolean hasFocus) {
21289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
21313be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     * Called when the main window associated with the activity has been
21323be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     * attached to the window manager.
21333be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     * See {@link View#onAttachedToWindow() View.onAttachedToWindow()}
21343be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     * for more information.
21353be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     * @see View#onAttachedToWindow
21363be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     */
21373be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn    public void onAttachedToWindow() {
21383be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn    }
21393be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn
21403be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn    /**
21413be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     * Called when the main window associated with the activity has been
21423be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     * detached from the window manager.
21433be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     * See {@link View#onDetachedFromWindow() View.onDetachedFromWindow()}
21443be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     * for more information.
21453be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     * @see View#onDetachedFromWindow
21463be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn     */
21473be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn    public void onDetachedFromWindow() {
21483be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn    }
21493be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn
21503be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn    /**
21519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns true if this activity's <em>main</em> window currently has window focus.
21529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Note that this is not the same as the view itself having focus.
21539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
21549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if this activity's main window currently has window focus.
21559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onWindowAttributesChanged(android.view.WindowManager.LayoutParams)
21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
21589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean hasWindowFocus() {
21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Window w = getWindow();
21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (w != null) {
21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            View d = w.getDecorView();
21629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (d != null) {
21639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return d.hasWindowFocus();
21649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
21679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
21709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called to process key events.  You can override this to intercept all
21719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * key events before they are dispatched to the window.  Be sure to call
21729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this implementation for key events that should be handled normally.
21739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param event The key event.
21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return boolean Return true if this event was consumed.
21779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean dispatchKeyEvent(KeyEvent event) {
21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onUserInteraction();
21808d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn        Window win = getWindow();
21818d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn        if (win.superDispatchKeyEvent(event)) {
21829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
21839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21848d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn        View decor = mDecor;
21858d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn        if (decor == null) decor = win.getDecorView();
21868d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn        return event.dispatch(this, decor != null
21878d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                ? decor.getKeyDispatcherState() : null, this);
21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
21919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called to process touch screen events.  You can override this to
21929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * intercept all touch screen events before they are dispatched to the
21939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * window.  Be sure to call this implementation for touch screen events
21949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that should be handled normally.
21959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param ev The touch screen event.
21979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
21989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return boolean Return true if this event was consumed.
21999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
22009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean dispatchTouchEvent(MotionEvent ev) {
22019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
22029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            onUserInteraction();
22039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (getWindow().superDispatchTouchEvent(ev)) {
22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
22069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return onTouchEvent(ev);
22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
22119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called to process trackball events.  You can override this to
22129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * intercept all trackball events before they are dispatched to the
22139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * window.  Be sure to call this implementation for trackball events
22149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that should be handled normally.
22159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
22169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param ev The trackball event.
22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
22189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return boolean Return true if this event was consumed.
22199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
22209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean dispatchTrackballEvent(MotionEvent ev) {
22219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onUserInteraction();
22229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (getWindow().superDispatchTrackballEvent(ev)) {
22239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
22249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return onTrackballEvent(ev);
22269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
222775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
222875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
222975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        event.setClassName(getClass().getName());
223075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        event.setPackageName(getPackageName());
223175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
223275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        LayoutParams params = getWindow().getAttributes();
2233980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy        boolean isFullScreen = (params.width == LayoutParams.MATCH_PARENT) &&
2234980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy            (params.height == LayoutParams.MATCH_PARENT);
223575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        event.setFullScreen(isFullScreen);
223675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
223775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        CharSequence title = getTitle();
223875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        if (!TextUtils.isEmpty(title)) {
223975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov           event.getText().add(title);
224075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        }
224175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
224275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        return true;
224375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    }
224475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
22459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
22469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default implementation of
22479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window.Callback#onCreatePanelView}
22489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for activities. This
22499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * simply returns null so that all panel sub-windows will have the default
22509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * menu behavior.
22519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
22529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public View onCreatePanelView(int featureId) {
22539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
22549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
22579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default implementation of
22589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window.Callback#onCreatePanelMenu}
22599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for activities.  This calls through to the new
22609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onCreateOptionsMenu} method for the
22619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window#FEATURE_OPTIONS_PANEL} panel,
22629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * so that subclasses of Activity don't need to deal with feature codes.
22639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
22649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onCreatePanelMenu(int featureId, Menu menu) {
22659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (featureId == Window.FEATURE_OPTIONS_PANEL) {
2266b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn            boolean show = onCreateOptionsMenu(menu);
2267b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn            show |= mFragments.dispatchCreateOptionsMenu(menu, getMenuInflater());
2268b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn            return show;
22699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
22719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
22749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default implementation of
22759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window.Callback#onPreparePanel}
22769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for activities.  This
22779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * calls through to the new {@link #onPrepareOptionsMenu} method for the
22789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window#FEATURE_OPTIONS_PANEL}
22799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * panel, so that subclasses of
22809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Activity don't need to deal with feature codes.
22819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
22829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onPreparePanel(int featureId, View view, Menu menu) {
22839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (featureId == Window.FEATURE_OPTIONS_PANEL && menu != null) {
22849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean goforit = onPrepareOptionsMenu(menu);
2285b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn            goforit |= mFragments.dispatchPrepareOptionsMenu(menu);
22869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return goforit && menu.hasVisibleItems();
22879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
22899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
22929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
22939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
22949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The default implementation returns true.
22959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
22969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onMenuOpened(int featureId, Menu menu) {
22979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
22989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
23019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default implementation of
23029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window.Callback#onMenuItemSelected}
23039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for activities.  This calls through to the new
23049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onOptionsItemSelected} method for the
23059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window#FEATURE_OPTIONS_PANEL}
23069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * panel, so that subclasses of
23079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Activity don't need to deal with feature codes.
23089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
23099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onMenuItemSelected(int featureId, MenuItem item) {
23109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (featureId) {
23119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case Window.FEATURE_OPTIONS_PANEL:
23129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Put event logging here so it gets called even if subclass
23139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // doesn't call through to superclass's implmeentation of each
23149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // of these methods below
23159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                EventLog.writeEvent(50000, 0, item.getTitleCondensed());
2316b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                if (onOptionsItemSelected(item)) {
2317b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                    return true;
2318b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                }
2319b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                return mFragments.dispatchOptionsItemSelected(item);
23209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case Window.FEATURE_CONTEXT_MENU:
23229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                EventLog.writeEvent(50000, 1, item.getTitleCondensed());
23235ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn                if (onContextItemSelected(item)) {
23245ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn                    return true;
23255ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn                }
23265ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn                return mFragments.dispatchContextItemSelected(item);
23279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default:
23299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
23309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
23349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default implementation of
23359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window.Callback#onPanelClosed(int, Menu)} for
23369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activities. This calls through to {@link #onOptionsMenuClosed(Menu)}
23379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * method for the {@link android.view.Window#FEATURE_OPTIONS_PANEL} panel,
23389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * so that subclasses of Activity don't need to deal with feature codes.
23399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * For context menus ({@link Window#FEATURE_CONTEXT_MENU}), the
23409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onContextMenuClosed(Menu)} will be called.
23419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
23429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onPanelClosed(int featureId, Menu menu) {
23439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (featureId) {
23449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case Window.FEATURE_OPTIONS_PANEL:
2345b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                mFragments.dispatchOptionsMenuClosed(menu);
23469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                onOptionsMenuClosed(menu);
23479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
23489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case Window.FEATURE_CONTEXT_MENU:
23509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                onContextMenuClosed(menu);
23519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
23529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2356b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     * Declare that the options menu has changed, so should be recreated.
2357b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     * The {@link #onCreateOptionsMenu(Menu)} method will be called the next
2358b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     * time it needs to be displayed.
2359b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     */
2360b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    public void invalidateOptionsMenu() {
2361b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn        mWindow.invalidatePanelMenu(Window.FEATURE_OPTIONS_PANEL);
2362b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    }
2363b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn
2364b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    /**
23659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Initialize the contents of the Activity's standard options menu.  You
23669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * should place your menu items in to <var>menu</var>.
23679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This is only called once, the first time the options menu is
23699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * displayed.  To update the menu every time it is displayed, see
23709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onPrepareOptionsMenu}.
23719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The default implementation populates the menu with standard system
23739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * menu items.  These are placed in the {@link Menu#CATEGORY_SYSTEM} group so that
23749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * they will be correctly ordered with application-defined menu items.
23759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Deriving classes should always call through to the base implementation.
23769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>You can safely hold on to <var>menu</var> (and any items created
23789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * from it), making modifications to it as desired, until the next
23799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * time onCreateOptionsMenu() is called.
23809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>When you add items to the menu, you can implement the Activity's
23829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onOptionsItemSelected} method to handle them there.
23839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param menu The options menu in which you place your items.
23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return You must return true for the menu to be displayed;
23879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         if you return false it will not be shown.
23889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPrepareOptionsMenu
23909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onOptionsItemSelected
23919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
23929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onCreateOptionsMenu(Menu menu) {
23939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent != null) {
23949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mParent.onCreateOptionsMenu(menu);
23959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
23979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Prepare the Screen's standard options menu to be displayed.  This is
24019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * called right before the menu is shown, every time it is shown.  You can
24029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * use this method to efficiently enable/disable items or otherwise
24039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * dynamically modify the contents.
24049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
24059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The default implementation updates the system menu items based on the
24069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity's state.  Deriving classes should always call through to the
24079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * base class implementation.
24089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
24099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param menu The options menu as last shown or first initialized by
24109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             onCreateOptionsMenu().
24119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
24129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return You must return true for the menu to be displayed;
24139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         if you return false it will not be shown.
24149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
24159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onCreateOptionsMenu
24169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
24179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onPrepareOptionsMenu(Menu menu) {
24189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent != null) {
24199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mParent.onPrepareOptionsMenu(menu);
24209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
24229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
24259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This hook is called whenever an item in your options menu is selected.
24269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The default implementation simply returns false to have the normal
24279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * processing happen (calling the item's Runnable or sending a message to
24289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * its Handler as appropriate).  You can use this method for any items
24299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for which you would like to do processing without those other
24309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * facilities.
24319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
24329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Derived classes should call through to the base class for it to
24339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * perform the default menu handling.
24349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
24359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param item The menu item that was selected.
24369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
24379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return boolean Return false to allow normal menu processing to
24389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         proceed, true to consume it here.
24399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
24409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onCreateOptionsMenu
24419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
24429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onOptionsItemSelected(MenuItem item) {
24439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent != null) {
24449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mParent.onOptionsItemSelected(item);
24459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
24479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
24509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This hook is called whenever the options menu is being closed (either by the user canceling
24519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the menu with the back/menu button, or when an item is selected).
24529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
24539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param menu The options menu as last shown or first initialized by
24549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             onCreateOptionsMenu().
24559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
24569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onOptionsMenuClosed(Menu menu) {
24579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent != null) {
24589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParent.onOptionsMenuClosed(menu);
24599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
24639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Programmatically opens the options menu. If the options menu is already
24649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * open, this method does nothing.
24659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
24669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void openOptionsMenu() {
24679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindow.openPanel(Window.FEATURE_OPTIONS_PANEL, null);
24689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
24719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Progammatically closes the options menu. If the options menu is already
24729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * closed, this method does nothing.
24739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
24749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void closeOptionsMenu() {
24759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindow.closePanel(Window.FEATURE_OPTIONS_PANEL);
24769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
24799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when a context menu for the {@code view} is about to be shown.
24809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Unlike {@link #onCreateOptionsMenu(Menu)}, this will be called every
24819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * time the context menu is about to be shown and should be populated for
24829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the view (or item inside the view for {@link AdapterView} subclasses,
24839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this can be found in the {@code menuInfo})).
24849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
24859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use {@link #onContextItemSelected(android.view.MenuItem)} to know when an
24869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * item has been selected.
24879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
24889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * It is not safe to hold onto the context menu after this method returns.
24899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
24909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
24919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
24929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
24959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Registers a context menu to be shown for the given view (multiple views
24969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * can show the context menu). This method will set the
24979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link OnCreateContextMenuListener} on the view to this activity, so
24989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onCreateContextMenu(ContextMenu, View, ContextMenuInfo)} will be
24999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * called when it is time to show the context menu.
25009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
25019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #unregisterForContextMenu(View)
25029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param view The view that should show a context menu.
25039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
25049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void registerForContextMenu(View view) {
25059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        view.setOnCreateContextMenuListener(this);
25069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
25099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Prevents a context menu to be shown for the given view. This method will remove the
25109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link OnCreateContextMenuListener} on the view.
25119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
25129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #registerForContextMenu(View)
25139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param view The view that should stop showing a context menu.
25149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
25159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void unregisterForContextMenu(View view) {
25169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        view.setOnCreateContextMenuListener(null);
25179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
25209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Programmatically opens the context menu for a particular {@code view}.
25219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The {@code view} should have been added via
25229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #registerForContextMenu(View)}.
25239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
25249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param view The view to show the context menu for.
25259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
25269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void openContextMenu(View view) {
25279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        view.showContextMenu();
25289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
25319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Programmatically closes the most recently opened context menu, if showing.
25329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
25339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void closeContextMenu() {
25349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindow.closePanel(Window.FEATURE_CONTEXT_MENU);
25359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
25389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This hook is called whenever an item in a context menu is selected. The
25399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * default implementation simply returns false to have the normal processing
25409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * happen (calling the item's Runnable or sending a message to its Handler
25419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * as appropriate). You can use this method for any items for which you
25429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * would like to do processing without those other facilities.
25439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
25449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use {@link MenuItem#getMenuInfo()} to get extra information set by the
25459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * View that added this menu item.
25469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
25479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Derived classes should call through to the base class for it to perform
25489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the default menu handling.
25499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
25509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param item The context menu item that was selected.
25519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return boolean Return false to allow normal context menu processing to
25529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         proceed, true to consume it here.
25539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
25549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onContextItemSelected(MenuItem item) {
25559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent != null) {
25569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mParent.onContextItemSelected(item);
25579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
25599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
25629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This hook is called whenever the context menu is being closed (either by
25639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the user canceling the menu with the back/menu button, or when an item is
25649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * selected).
25659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
25669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param menu The context menu that is being closed.
25679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
25689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onContextMenuClosed(Menu menu) {
25699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent != null) {
25709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParent.onContextMenuClosed(menu);
25719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
25758ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @deprecated Old no-arguments version of {@link #onCreateDialog(int, Bundle)}.
25768ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     */
25778ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    @Deprecated
25788ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    protected Dialog onCreateDialog(int id) {
25798ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        return null;
25808ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    }
25818ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn
25828ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    /**
25839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Callback for creating dialogs that are managed (saved and restored) for you
25848ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * by the activity.  The default implementation calls through to
25858ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * {@link #onCreateDialog(int)} for compatibility.
25869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
25878ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * <p>If you use {@link #showDialog(int)}, the activity will call through to
25889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this method the first time, and hang onto it thereafter.  Any dialog
25899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that is created by this method will automatically be saved and restored
25909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for you, including whether it is showing.
25919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
25928ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * <p>If you would like the activity to manage saving and restoring dialogs
25939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for you, you should override this method and handle any ids that are
25949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * passed to {@link #showDialog}.
25959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
25968ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * <p>If you would like an opportunity to prepare your dialog before it is shown,
25978ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * override {@link #onPrepareDialog(int, Dialog, Bundle)}.
25989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
25999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param id The id of the dialog.
26008ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @param args The dialog arguments provided to {@link #showDialog(int, Bundle)}.
26018ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @return The dialog.  If you return null, the dialog will not be created.
26029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26038ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @see #onPrepareDialog(int, Dialog, Bundle)
26048ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @see #showDialog(int, Bundle)
26059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #dismissDialog(int)
26069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #removeDialog(int)
26079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
26088ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    protected Dialog onCreateDialog(int id, Bundle args) {
26098ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        return onCreateDialog(id);
26108ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    }
26118ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn
26128ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    /**
26138ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @deprecated Old no-arguments version of
26148ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * {@link #onPrepareDialog(int, Dialog, Bundle)}.
26158ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     */
26168ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    @Deprecated
26178ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    protected void onPrepareDialog(int id, Dialog dialog) {
26188ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        dialog.setOwnerActivity(this);
26199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
26229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Provides an opportunity to prepare a managed dialog before it is being
26238ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * shown.  The default implementation calls through to
26248ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * {@link #onPrepareDialog(int, Dialog)} for compatibility.
26258ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     *
26269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
26279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Override this if you need to update a managed dialog based on the state
26289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of the application each time it is shown. For example, a time picker
26299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * dialog might want to be updated with the current time. You should call
26309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * through to the superclass's implementation. The default implementation
26319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will set this Activity as the owner activity on the Dialog.
26329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param id The id of the managed dialog.
26349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param dialog The dialog.
26358ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @param args The dialog arguments provided to {@link #showDialog(int, Bundle)}.
26368ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @see #onCreateDialog(int, Bundle)
26379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #showDialog(int)
26389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #dismissDialog(int)
26399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #removeDialog(int)
26409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
26418ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    protected void onPrepareDialog(int id, Dialog dialog, Bundle args) {
26428ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        onPrepareDialog(id, dialog);
26439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
26468ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * Simple version of {@link #showDialog(int, Bundle)} that does not
26478ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * take any arguments.  Simply calls {@link #showDialog(int, Bundle)}
26488ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * with null arguments.
26498ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     */
26508ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    public final void showDialog(int id) {
26518ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        showDialog(id, null);
26528ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    }
26538ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn
26548ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    /**
26558ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * Show a dialog managed by this activity.  A call to {@link #onCreateDialog(int, Bundle)}
26569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will be made with the same id the first time this is called for a given
26579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * id.  From thereafter, the dialog will be automatically saved and restored.
26589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26598ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * <p>Each time a dialog is shown, {@link #onPrepareDialog(int, Dialog, Bundle)} will
26609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be made to provide an opportunity to do any timely preparation.
26619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param id The id of the managed dialog.
26638ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @param args Arguments to pass through to the dialog.  These will be saved
26648ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * and restored for you.  Note that if the dialog is already created,
26658ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * {@link #onCreateDialog(int, Bundle)} will not be called with the new
26668ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * arguments but {@link #onPrepareDialog(int, Dialog, Bundle)} will be.
2667d47c6ed4a9f2b5bd31f6c806b74701428efe458bDianne Hackborn     * If you need to rebuild the dialog, call {@link #removeDialog(int)} first.
26688ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @return Returns true if the Dialog was created; false is returned if
26698ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * it is not created because {@link #onCreateDialog(int, Bundle)} returns false.
26708ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     *
267137296dc4edae8d1383179e956dff2ecf806ac166Joe Onorato     * @see Dialog
26728ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @see #onCreateDialog(int, Bundle)
26738ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @see #onPrepareDialog(int, Dialog, Bundle)
26749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #dismissDialog(int)
26759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #removeDialog(int)
26769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
26778ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    public final boolean showDialog(int id, Bundle args) {
26789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mManagedDialogs == null) {
26798ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            mManagedDialogs = new SparseArray<ManagedDialog>();
26809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26818ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        ManagedDialog md = mManagedDialogs.get(id);
26828ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        if (md == null) {
26838ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            md = new ManagedDialog();
26848ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            md.mDialog = createDialog(id, null, args);
26858ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            if (md.mDialog == null) {
26868ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                return false;
26878ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            }
26888ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            mManagedDialogs.put(id, md);
26899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26918ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        md.mArgs = args;
26928ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        onPrepareDialog(id, md.mDialog, args);
26938ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        md.mDialog.show();
26948ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        return true;
26959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
26989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Dismiss a dialog that was previously shown via {@link #showDialog(int)}.
26999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
27009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param id The id of the managed dialog.
27019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
27029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalArgumentException if the id was not previously shown via
27039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *   {@link #showDialog(int)}.
27049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
27058ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @see #onCreateDialog(int, Bundle)
27068ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @see #onPrepareDialog(int, Dialog, Bundle)
27079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #showDialog(int)
27089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #removeDialog(int)
27099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
27109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void dismissDialog(int id) {
27119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mManagedDialogs == null) {
27129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw missingDialog(id);
27139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27148ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn
27158ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        final ManagedDialog md = mManagedDialogs.get(id);
27168ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        if (md == null) {
27179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw missingDialog(id);
27189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27198ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        md.mDialog.dismiss();
27209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
27239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Creates an exception to throw if a user passed in a dialog id that is
27249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * unexpected.
27259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
27269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IllegalArgumentException missingDialog(int id) {
27279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new IllegalArgumentException("no dialog with id " + id + " was ever "
27289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + "shown via Activity#showDialog");
27299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
27329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Removes any internal references to a dialog managed by this Activity.
27339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If the dialog is showing, it will dismiss it as part of the clean up.
27349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
27358ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * <p>This can be useful if you know that you will never show a dialog again and
27369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * want to avoid the overhead of saving and restoring it in the future.
27379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
27389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param id The id of the managed dialog.
27399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
27408ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @see #onCreateDialog(int, Bundle)
27418ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * @see #onPrepareDialog(int, Dialog, Bundle)
27429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #showDialog(int)
27439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #dismissDialog(int)
27449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
27459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void removeDialog(int id) {
27469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mManagedDialogs == null) {
27479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
27489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27508ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        final ManagedDialog md = mManagedDialogs.get(id);
27518ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        if (md == null) {
27529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
27539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27558ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        md.mDialog.dismiss();
27569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mManagedDialogs.remove(id);
27579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
27609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This hook is called when the user signals the desire to start a search.
27619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
27626266e40a754d82afa717ef068898c8418a0bb5c3Bjorn Bringert     * <p>You can use this function as a simple way to launch the search UI, in response to a
27636266e40a754d82afa717ef068898c8418a0bb5c3Bjorn Bringert     * menu item, search button, or other widgets within your activity. Unless overidden,
27646266e40a754d82afa717ef068898c8418a0bb5c3Bjorn Bringert     * calling this function is the same as calling
27656266e40a754d82afa717ef068898c8418a0bb5c3Bjorn Bringert     * {@link #startSearch startSearch(null, false, null, false)}, which launches
27666266e40a754d82afa717ef068898c8418a0bb5c3Bjorn Bringert     * search for the current activity as specified in its manifest, see {@link SearchManager}.
27679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
27689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>You can override this function to force global search, e.g. in response to a dedicated
27699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * search key, or to block search entirely (by simply returning false).
27709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
27716266e40a754d82afa717ef068898c8418a0bb5c3Bjorn Bringert     * @return Returns {@code true} if search launched, and {@code false} if activity blocks it.
27726266e40a754d82afa717ef068898c8418a0bb5c3Bjorn Bringert     *         The default implementation always returns {@code true}.
27739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
27749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.app.SearchManager
27759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
27769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onSearchRequested() {
27779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        startSearch(null, false, null, false);
27789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
27799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
27829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This hook is called to launch the search UI.
27839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
27849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>It is typically called from onSearchRequested(), either directly from
27859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Activity.onSearchRequested() or from an overridden version in any given
27869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Activity.  If your goal is simply to activate search, it is preferred to call
27879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * onSearchRequested(), which may have been overriden elsewhere in your Activity.  If your goal
27889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is to inject specific data such as context data, it is preferred to <i>override</i>
27899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * onSearchRequested(), so that any callers to it will benefit from the override.
27909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
27919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param initialQuery Any non-null non-empty string will be inserted as
27929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * pre-entered text in the search query box.
27939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param selectInitialQuery If true, the intial query will be preselected, which means that
27949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * any further typing will replace it.  This is useful for cases where an entire pre-formed
27959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * query is being inserted.  If false, the selection point will be placed at the end of the
27969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * inserted query.  This is useful when the inserted query is text that the user entered,
27979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and the user would expect to be able to keep typing.  <i>This parameter is only meaningful
27989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if initialQuery is a non-empty string.</i>
27999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param appSearchData An application can insert application-specific
28009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * context here, in order to improve quality or specificity of its own
28019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * searches.  This data will be returned with SEARCH intent(s).  Null if
28029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * no extra data is required.
28039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param globalSearch If false, this will only launch the search that has been specifically
28049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * defined by the application (which is usually defined as a local search).  If no default
2805cfa419b754332e12f8cd45244c2f3bee9d6a74bbMike LeBeau     * search is defined in the current application or activity, global search will be launched.
28069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If true, this will always launch a platform-global (e.g. web-based) search instead.
28079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.app.SearchManager
28099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onSearchRequested
28109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
28119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startSearch(String initialQuery, boolean selectInitialQuery,
28129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Bundle appSearchData, boolean globalSearch) {
2813b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn        ensureSearchManager();
28148d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert        mSearchManager.startSearch(initialQuery, selectInitialQuery, getComponentName(),
28159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        appSearchData, globalSearch);
28169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2819d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     * Similar to {@link #startSearch}, but actually fires off the search query after invoking
2820d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     * the search dialog.  Made available for testing purposes.
2821d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     *
2822d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     * @param query The query to trigger.  If empty, the request will be ignored.
2823d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     * @param appSearchData An application can insert application-specific
2824d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     * context here, in order to improve quality or specificity of its own
2825d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     * searches.  This data will be returned with SEARCH intent(s).  Null if
2826d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     * no extra data is required.
2827d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     */
2828b782a2f4f0a3072f2677f6f10fb255c77468ae66Bjorn Bringert    public void triggerSearch(String query, Bundle appSearchData) {
2829d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen        ensureSearchManager();
2830b782a2f4f0a3072f2677f6f10fb255c77468ae66Bjorn Bringert        mSearchManager.triggerSearch(query, getComponentName(), appSearchData);
2831d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen    }
2832d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen
2833d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen    /**
28349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Request that key events come to this activity. Use this if your
28359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity has no views with focus, but the activity still wants
28369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a chance to process key events.
28379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.view.Window#takeKeyEvents
28399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
28409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void takeKeyEvents(boolean get) {
28419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().takeKeyEvents(get);
28429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
28459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Enable extended window features.  This is a convenience for calling
28469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window#requestFeature getWindow().requestFeature()}.
28479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param featureId The desired feature as defined in
28499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                  {@link android.view.Window}.
28509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns true if the requested feature is supported and now
28519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         enabled.
28529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.view.Window#requestFeature
28549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
28559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean requestWindowFeature(int featureId) {
28569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getWindow().requestFeature(featureId);
28579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
28609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Convenience for calling
28619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window#setFeatureDrawableResource}.
28629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
28639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setFeatureDrawableResource(int featureId, int resId) {
28649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setFeatureDrawableResource(featureId, resId);
28659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
28689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Convenience for calling
28699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window#setFeatureDrawableUri}.
28709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
28719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setFeatureDrawableUri(int featureId, Uri uri) {
28729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setFeatureDrawableUri(featureId, uri);
28739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
28769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Convenience for calling
28779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window#setFeatureDrawable(int, Drawable)}.
28789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
28799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setFeatureDrawable(int featureId, Drawable drawable) {
28809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setFeatureDrawable(featureId, drawable);
28819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
28849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Convenience for calling
28859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window#setFeatureDrawableAlpha}.
28869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
28879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setFeatureDrawableAlpha(int featureId, int alpha) {
28889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setFeatureDrawableAlpha(featureId, alpha);
28899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
28929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Convenience for calling
28939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window#getLayoutInflater}.
28949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
28959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public LayoutInflater getLayoutInflater() {
28969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getWindow().getLayoutInflater();
28979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
29009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns a {@link MenuInflater} with this context.
29019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
29029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public MenuInflater getMenuInflater() {
29039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new MenuInflater(this);
29049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2907bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn    protected void onApplyThemeResource(Resources.Theme theme, int resid,
2908bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            boolean first) {
29099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent == null) {
29109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super.onApplyThemeResource(theme, resid, first);
29119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
29129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
29139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                theme.setTo(mParent.getTheme());
29149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (Exception e) {
29159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Empty
29169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            theme.applyStyle(resid, false);
29189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
29229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Launch an activity for which you would like a result when it finished.
29239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * When this activity exits, your
29249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * onActivityResult() method will be called with the given requestCode.
29259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Using a negative requestCode is the same as calling
29269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #startActivity} (the activity is not launched as a sub-activity).
29279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
29289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note that this method should only be used with Intent protocols
29299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that are defined to return a result.  In other protocols (such as
29309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link Intent#ACTION_MAIN} or {@link Intent#ACTION_VIEW}), you may
29319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not get the result when you expect.  For example, if the activity you
29329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * are launching uses the singleTask launch mode, it will not run in your
29339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * task and thus you will immediately receive a cancel result.
29349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
29359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>As a special case, if you call startActivityForResult() with a requestCode
29369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * >= 0 during the initial onCreate(Bundle savedInstanceState)/onResume() of your
29379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity, then your window will not be displayed until a result is
29389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returned back from the started activity.  This is to avoid visible
29399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * flickering when redirecting to another activity.
29409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
29419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This method throws {@link android.content.ActivityNotFoundException}
29429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if there was no Activity found to run the given Intent.
29439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
29449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param intent The intent to start.
29459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param requestCode If >= 0, this code will be returned in
29469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                    onActivityResult() when the activity exits.
29479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
29489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws android.content.ActivityNotFoundException
29499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
29509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startActivity
29519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
29529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startActivityForResult(Intent intent, int requestCode) {
29539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent == null) {
29549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Instrumentation.ActivityResult ar =
29559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mInstrumentation.execStartActivity(
29569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    this, mMainThread.getApplicationThread(), mToken, this,
29579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    intent, requestCode);
29589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ar != null) {
29599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.sendActivityResult(
29609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mToken, mEmbeddedID, requestCode, ar.getResultCode(),
29619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ar.getResultData());
29629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (requestCode >= 0) {
29649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If this start is requesting a result, we can avoid making
29659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // the activity visible until the result is received.  Setting
29669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // this code during onCreate(Bundle savedInstanceState) or onResume() will keep the
29679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // activity hidden during this time, to avoid flickering.
29689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // This can only be done when a result is requested because
29699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // that guarantees we will get information back when the
29709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // activity is finished, no matter what happens to it.
29719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mStartedActivity = true;
29729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
29749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParent.startActivityFromChild(this, intent, requestCode);
29759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2979bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * Like {@link #startActivityForResult(Intent, int)}, but allowing you
2980fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * to use a IntentSender to describe the activity to be started.  If
2981fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * the IntentSender is for an activity, that activity will be started
2982fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * as if you had called the regular {@link #startActivityForResult(Intent, int)}
2983fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * here; otherwise, its associated action will be executed (such as
2984fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * sending a broadcast) as if you had called
2985fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * {@link IntentSender#sendIntent IntentSender.sendIntent} on it.
2986fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     *
2987fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * @param intent The IntentSender to launch.
2988bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * @param requestCode If >= 0, this code will be returned in
2989bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     *                    onActivityResult() when the activity exits.
2990bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * @param fillInIntent If non-null, this will be provided as the
2991fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * intent parameter to {@link IntentSender#sendIntent}.
2992fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * @param flagsMask Intent flags in the original IntentSender that you
2993bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * would like to change.
2994bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * @param flagsValues Desired values for any bits set in
2995bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * <var>flagsMask</var>
2996fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * @param extraFlags Always set to 0.
2997bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     */
2998fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn    public void startIntentSenderForResult(IntentSender intent, int requestCode,
2999fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)
3000fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            throws IntentSender.SendIntentException {
3001bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn        if (mParent == null) {
3002fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            startIntentSenderForResultInner(intent, requestCode, fillInIntent,
3003bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                    flagsMask, flagsValues, this);
3004bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn        } else {
3005fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            mParent.startIntentSenderFromChild(this, intent, requestCode,
3006fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                    fillInIntent, flagsMask, flagsValues, extraFlags);
3007bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn        }
3008bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn    }
3009bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn
3010fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn    private void startIntentSenderForResultInner(IntentSender intent, int requestCode,
3011bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            Intent fillInIntent, int flagsMask, int flagsValues, Activity activity)
3012fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            throws IntentSender.SendIntentException {
3013bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn        try {
3014bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            String resolvedType = null;
3015bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            if (fillInIntent != null) {
3016bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                resolvedType = fillInIntent.resolveTypeIfNeeded(getContentResolver());
3017bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            }
3018bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            int result = ActivityManagerNative.getDefault()
3019fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                .startActivityIntentSender(mMainThread.getApplicationThread(), intent,
3020bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        fillInIntent, resolvedType, mToken, activity.mEmbeddedID,
3021bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        requestCode, flagsMask, flagsValues);
3022bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            if (result == IActivityManager.START_CANCELED) {
3023fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                throw new IntentSender.SendIntentException();
3024bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            }
3025bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            Instrumentation.checkStartActivityResult(result, null);
3026bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn        } catch (RemoteException e) {
3027bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn        }
3028bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn        if (requestCode >= 0) {
3029bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            // If this start is requesting a result, we can avoid making
3030bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            // the activity visible until the result is received.  Setting
3031bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            // this code during onCreate(Bundle savedInstanceState) or onResume() will keep the
3032bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            // activity hidden during this time, to avoid flickering.
3033bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            // This can only be done when a result is requested because
3034bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            // that guarantees we will get information back when the
3035bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            // activity is finished, no matter what happens to it.
3036bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            mStartedActivity = true;
3037bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn        }
3038bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn    }
3039bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn
3040bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn    /**
30419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Launch a new activity.  You will not receive any information about when
30429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the activity exits.  This implementation overrides the base version,
30439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * providing information about
30449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the activity performing the launch.  Because of this additional
30459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * information, the {@link Intent#FLAG_ACTIVITY_NEW_TASK} launch flag is not
30469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * required; if not specified, the new activity will be added to the
30479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * task of the caller.
30489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
30499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This method throws {@link android.content.ActivityNotFoundException}
30509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if there was no Activity found to run the given Intent.
30519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
30529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param intent The intent to start.
30539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
30549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws android.content.ActivityNotFoundException
30559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
30569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startActivityForResult
30579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
30589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
30599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startActivity(Intent intent) {
30609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        startActivityForResult(intent, -1);
30619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3064fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * Like {@link #startActivity(Intent)}, but taking a IntentSender
3065bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * to start; see
3066ae22c05b91d1e7a458066792eb5cfc0974c1be9eDianne Hackborn     * {@link #startIntentSenderForResult(IntentSender, int, Intent, int, int, int)}
3067bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * for more information.
3068bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     *
3069fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * @param intent The IntentSender to launch.
3070bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * @param fillInIntent If non-null, this will be provided as the
3071fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * intent parameter to {@link IntentSender#sendIntent}.
3072fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * @param flagsMask Intent flags in the original IntentSender that you
3073bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * would like to change.
3074bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * @param flagsValues Desired values for any bits set in
3075bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * <var>flagsMask</var>
3076fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * @param extraFlags Always set to 0.
3077bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     */
3078fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn    public void startIntentSender(IntentSender intent,
3079fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)
3080fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            throws IntentSender.SendIntentException {
3081fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn        startIntentSenderForResult(intent, -1, fillInIntent, flagsMask,
3082fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                flagsValues, extraFlags);
3083bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn    }
3084bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn
3085bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn    /**
30869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A special variation to launch an activity only if a new activity
30879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * instance is needed to handle the given Intent.  In other words, this is
30889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * just like {@link #startActivityForResult(Intent, int)} except: if you are
30899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * using the {@link Intent#FLAG_ACTIVITY_SINGLE_TOP} flag, or
30909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * singleTask or singleTop
30919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.R.styleable#AndroidManifestActivity_launchMode launchMode},
30929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and the activity
30939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that handles <var>intent</var> is the same as your currently running
30949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity, then a new instance is not needed.  In this case, instead of
30959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the normal behavior of calling {@link #onNewIntent} this function will
30969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * return and you can handle the Intent yourself.
30979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
30989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This function can only be called from a top-level activity; if it is
30999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * called from a child activity, a runtime exception will be thrown.
31009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
31019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param intent The intent to start.
31029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param requestCode If >= 0, this code will be returned in
31039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         onActivityResult() when the activity exits, as described in
31049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         {@link #startActivityForResult}.
31059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
31069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return If a new activity was launched then true is returned; otherwise
31079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         false is returned and you must handle the Intent yourself.
31089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
31099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startActivity
31109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startActivityForResult
31119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
31129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean startActivityIfNeeded(Intent intent, int requestCode) {
31139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent == null) {
31149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int result = IActivityManager.START_RETURN_INTENT_TO_CALLER;
31159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
31169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                result = ActivityManagerNative.getDefault()
31179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    .startActivity(mMainThread.getApplicationThread(),
31189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            intent, intent.resolveTypeIfNeeded(
31199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    getContentResolver()),
31209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            null, 0,
31219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mToken, mEmbeddedID, requestCode, true, false);
31229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
31239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Empty
31249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Instrumentation.checkStartActivityResult(result, intent);
31279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (requestCode >= 0) {
31299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If this start is requesting a result, we can avoid making
31309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // the activity visible until the result is received.  Setting
31319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // this code during onCreate(Bundle savedInstanceState) or onResume() will keep the
31329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // activity hidden during this time, to avoid flickering.
31339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // This can only be done when a result is requested because
31349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // that guarantees we will get information back when the
31359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // activity is finished, no matter what happens to it.
31369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mStartedActivity = true;
31379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return result != IActivityManager.START_RETURN_INTENT_TO_CALLER;
31399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new UnsupportedOperationException(
31429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "startActivityIfNeeded can only be called from a top-level activity");
31439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
31469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Special version of starting an activity, for use when you are replacing
31479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * other activity components.  You can use this to hand the Intent off
31489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to the next Activity that can handle it.  You typically call this in
31499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onCreate} with the Intent returned by {@link #getIntent}.
31509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
31519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param intent The intent to dispatch to the next activity.  For
31529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * correct behavior, this must be the same as the Intent that started
31539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * your own activity; the only changes you can make are to the extras
31549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * inside of it.
31559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
31569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns a boolean indicating whether there was another Activity
31579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to start: true if there was a next activity to start, false if there
31589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * wasn't.  In general, if true is returned you will then want to call
31599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * finish() on yourself.
31609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
31619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean startNextMatchingActivity(Intent intent) {
31629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent == null) {
31639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
31649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return ActivityManagerNative.getDefault()
31659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    .startNextMatchingActivity(mToken, intent);
31669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
31679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Empty
31689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
31709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new UnsupportedOperationException(
31739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "startNextMatchingActivity can only be called from a top-level activity");
31749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
31779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is called when a child activity of this one calls its
31789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #startActivity} or {@link #startActivityForResult} method.
31799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
31809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This method throws {@link android.content.ActivityNotFoundException}
31819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if there was no Activity found to run the given Intent.
31829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
31839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param child The activity making the call.
31849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param intent The intent to start.
31859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param requestCode Reply request code.  < 0 if reply is not requested.
31869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
31879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws android.content.ActivityNotFoundException
31889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
31899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startActivity
31909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startActivityForResult
31919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
31929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startActivityFromChild(Activity child, Intent intent,
31939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int requestCode) {
31949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Instrumentation.ActivityResult ar =
31959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mInstrumentation.execStartActivity(
31969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                this, mMainThread.getApplicationThread(), mToken, child,
31979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                intent, requestCode);
31989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ar != null) {
31999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mMainThread.sendActivityResult(
32009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mToken, child.mEmbeddedID, requestCode,
32019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ar.getResultCode(), ar.getResultData());
32029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
32066e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * This is called when a Fragment in this activity calls its
32076e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * {@link Fragment#startActivity} or {@link Fragment#startActivityForResult}
32086e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * method.
32096e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     *
32106e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * <p>This method throws {@link android.content.ActivityNotFoundException}
32116e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * if there was no Activity found to run the given Intent.
32126e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     *
32136e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * @param fragment The fragment making the call.
32146e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * @param intent The intent to start.
32156e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * @param requestCode Reply request code.  < 0 if reply is not requested.
32166e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     *
32176e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * @throws android.content.ActivityNotFoundException
32186e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     *
32196e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * @see Fragment#startActivity
32206e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * @see Fragment#startActivityForResult
32216e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     */
32226e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    public void startActivityFromFragment(Fragment fragment, Intent intent,
32236e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            int requestCode) {
32246e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        Instrumentation.ActivityResult ar =
32256e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            mInstrumentation.execStartActivity(
32266e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                this, mMainThread.getApplicationThread(), mToken, fragment,
32276e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                intent, requestCode);
32286e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (ar != null) {
32296e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            mMainThread.sendActivityResult(
32306e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                mToken, fragment.mWho, requestCode,
32316e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                ar.getResultCode(), ar.getResultData());
32326e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        }
32336e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    }
32346e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn
32356e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    /**
3236bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * Like {@link #startActivityFromChild(Activity, Intent, int)}, but
3237fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn     * taking a IntentSender; see
3238ae22c05b91d1e7a458066792eb5cfc0974c1be9eDianne Hackborn     * {@link #startIntentSenderForResult(IntentSender, int, Intent, int, int, int)}
3239bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     * for more information.
3240bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn     */
3241fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn    public void startIntentSenderFromChild(Activity child, IntentSender intent,
3242fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            int requestCode, Intent fillInIntent, int flagsMask, int flagsValues,
3243fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            int extraFlags)
3244fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            throws IntentSender.SendIntentException {
3245fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn        startIntentSenderForResultInner(intent, requestCode, fillInIntent,
3246bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                flagsMask, flagsValues, child);
3247bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn    }
3248bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn
3249bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn    /**
32503b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn     * Call immediately after one of the flavors of {@link #startActivity(Intent)}
32513b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn     * or {@link #finish} to specify an explicit transition animation to
32523b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn     * perform next.
32533b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn     * @param enterAnim A resource ID of the animation resource to use for
32548b571a817cc953ce96750f440645f104c7f55157Dianne Hackborn     * the incoming activity.  Use 0 for no animation.
32553b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn     * @param exitAnim A resource ID of the animation resource to use for
32568b571a817cc953ce96750f440645f104c7f55157Dianne Hackborn     * the outgoing activity.  Use 0 for no animation.
32573b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn     */
32583b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn    public void overridePendingTransition(int enterAnim, int exitAnim) {
32593b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        try {
32603b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            ActivityManagerNative.getDefault().overridePendingTransition(
32613b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    mToken, getPackageName(), enterAnim, exitAnim);
32623b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        } catch (RemoteException e) {
32633b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        }
32643b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn    }
32653b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn
32663b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn    /**
32679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Call this to set the result that your activity will return to its
32689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * caller.
32699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
32709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param resultCode The result code to propagate back to the originating
32719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                   activity, often RESULT_CANCELED or RESULT_OK
32729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
32739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #RESULT_CANCELED
32749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #RESULT_OK
32759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #RESULT_FIRST_USER
32769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setResult(int, Intent)
32779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
32789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setResult(int resultCode) {
32799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (this) {
32809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mResultCode = resultCode;
32819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mResultData = null;
32829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
32869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Call this to set the result that your activity will return to its
32879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * caller.
32889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
32899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param resultCode The result code to propagate back to the originating
32909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                   activity, often RESULT_CANCELED or RESULT_OK
32919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param data The data to propagate back to the originating activity.
32929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
32939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #RESULT_CANCELED
32949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #RESULT_OK
32959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #RESULT_FIRST_USER
32969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setResult(int)
32979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
32989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setResult(int resultCode, Intent data) {
32999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (this) {
33009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mResultCode = resultCode;
33019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mResultData = data;
33029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
33039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
33049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
33069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the name of the package that invoked this activity.  This is who
33079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the data in {@link #setResult setResult()} will be sent to.  You can
33089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * use this information to validate that the recipient is allowed to
33099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * receive the data.
33109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
33119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note: if the calling activity is not expecting a result (that is it
33129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * did not use the {@link #startActivityForResult}
33139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * form that includes a request code), then the calling package will be
33149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * null.
33159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
33169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The package of the activity that will receive your
33179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         reply, or null if none.
33189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
33199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getCallingPackage() {
33209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
33219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().getCallingPackage(mToken);
33229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
33239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
33249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
33259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
33269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
33289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the name of the activity that invoked this activity.  This is
33299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * who the data in {@link #setResult setResult()} will be sent to.  You
33309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * can use this information to validate that the recipient is allowed to
33319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * receive the data.
33329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
33339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note: if the calling activity is not expecting a result (that is it
33349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * did not use the {@link #startActivityForResult}
33359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * form that includes a request code), then the calling package will be
33369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * null.
33379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
33389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return String The full name of the activity that will receive your
33399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         reply, or null if none.
33409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
33419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ComponentName getCallingActivity() {
33429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
33439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().getCallingActivity(mToken);
33449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
33459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
33469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
33479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
33489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
33509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Control whether this activity's main window is visible.  This is intended
33519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * only for the special case of an activity that is not going to show a
33529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * UI itself, but can't just finish prior to onResume() because it needs
33539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to wait for a service binding or such.  Setting this to false allows
33549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * you to prevent your UI from being shown during that time.
33559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
33569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The default value for this is taken from the
33579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.R.attr#windowNoDisplay} attribute of the activity's theme.
33589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
33599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setVisible(boolean visible) {
33609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mVisibleFromClient != visible) {
33619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mVisibleFromClient = visible;
33629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mVisibleFromServer) {
33639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (visible) makeVisible();
33649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                else mDecor.setVisibility(View.INVISIBLE);
33659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
33669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
33679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
33689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void makeVisible() {
33709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mWindowAdded) {
33719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ViewManager wm = getWindowManager();
33729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wm.addView(mDecor, getWindow().getAttributes());
33739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindowAdded = true;
33749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
33759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDecor.setVisibility(View.VISIBLE);
33769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
33779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
33799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Check to see whether this activity is in the process of finishing,
33809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * either because you called {@link #finish} on it or someone else
33819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * has requested that it finished.  This is often used in
33829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onPause} to determine whether the activity is simply pausing or
33839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * completely finishing.
33849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
33859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return If the activity is finishing, returns true; else returns false.
33869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
33879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #finish
33889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
33899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isFinishing() {
33909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mFinished;
33919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
33929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
33943d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton     * Check to see whether this activity is in the process of being destroyed in order to be
33953d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton     * recreated with a new configuration. This is often used in
33963d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton     * {@link #onStop} to determine whether the state needs to be cleaned up or will be passed
33973d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton     * on to the next instance of the activity via {@link #onRetainNonConfigurationInstance()}.
33983d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton     *
33993d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton     * @return If the activity is being torn down in order to be recreated with a new configuration,
34003d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton     * returns true; else returns false.
34013d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton     */
34023d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton    public boolean isChangingConfigurations() {
34033d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton        return mChangingConfigurations;
34043d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton    }
34053d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton
34063d32f6e5228e5dfbfe88b24f6df64406628a3e0cJeff Hamilton    /**
34079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Call this when your activity is done and should be closed.  The
34089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ActivityResult is propagated back to whoever launched you via
34099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * onActivityResult().
34109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
34119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void finish() {
34129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent == null) {
34139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int resultCode;
34149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Intent resultData;
34159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (this) {
34169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                resultCode = mResultCode;
34179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                resultData = mResultData;
34189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
34199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (Config.LOGV) Log.v(TAG, "Finishing self: token=" + mToken);
34209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
34219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ActivityManagerNative.getDefault()
34229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    .finishActivity(mToken, resultCode, resultData)) {
34239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mFinished = true;
34249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
34259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
34269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Empty
34279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
34289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
34299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParent.finishFromChild(this);
34309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
34329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
34349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is called when a child activity of this one calls its
34359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #finish} method.  The default implementation simply calls
34369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * finish() on this activity (the parent), finishing the entire group.
34379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
34389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param child The activity making the call.
34399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
34409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #finish
34419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
34429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void finishFromChild(Activity child) {
34439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        finish();
34449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
34459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
34479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Force finish another activity that you had previously started with
34489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #startActivityForResult}.
34499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
34509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param requestCode The request code of the activity that you had
34519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                    given to startActivityForResult().  If there are multiple
34529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                    activities started with this request code, they
34539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                    will all be finished.
34549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
34559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void finishActivity(int requestCode) {
34569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent == null) {
34579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
34589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityManagerNative.getDefault()
34599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    .finishSubActivity(mToken, mEmbeddedID, requestCode);
34609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
34619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Empty
34629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
34639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
34649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParent.finishActivityFromChild(this, requestCode);
34659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
34679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
34699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is called when a child activity of this one calls its
34709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * finishActivity().
34719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
34729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param child The activity making the call.
34739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param requestCode Request code that had been used to start the
34749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                    activity.
34759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
34769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void finishActivityFromChild(Activity child, int requestCode) {
34779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
34789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault()
34799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                .finishSubActivity(mToken, child.mEmbeddedID, requestCode);
34809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
34819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Empty
34829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
34849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
34869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when an activity you launched exits, giving you the requestCode
34879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * you started it with, the resultCode it returned, and any additional
34889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * data from it.  The <var>resultCode</var> will be
34899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #RESULT_CANCELED} if the activity explicitly returned that,
34909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * didn't return any result, or crashed during its operation.
34919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
34929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>You will receive this call immediately before onResume() when your
34939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity is re-starting.
34949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
34959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param requestCode The integer request code originally supplied to
34969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                    startActivityForResult(), allowing you to identify who this
34979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                    result came from.
34989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param resultCode The integer result code returned by the child activity
34999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                   through its setResult().
35009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param data An Intent, which can return result data to the caller
35019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *               (various data can be attached to Intent "extras").
35029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
35039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startActivityForResult
35049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #createPendingResult
35059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setResult(int)
35069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
35076e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
35089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
35099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
35119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new PendingIntent object which you can hand to others
35129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for them to use to send result data back to your
35139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onActivityResult} callback.  The created object will be either
35149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * one-shot (becoming invalid after a result is sent back) or multiple
35159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * (allowing any number of results to be sent through it).
35169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
35179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param requestCode Private request code for the sender that will be
35189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * associated with the result data when it is returned.  The sender can not
35199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * modify this value, allowing you to identify incoming results.
35209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param data Default data to supply in the result, which may be modified
35219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * by the sender.
35229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param flags May be {@link PendingIntent#FLAG_ONE_SHOT PendingIntent.FLAG_ONE_SHOT},
35239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link PendingIntent#FLAG_NO_CREATE PendingIntent.FLAG_NO_CREATE},
35249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link PendingIntent#FLAG_CANCEL_CURRENT PendingIntent.FLAG_CANCEL_CURRENT},
35259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link PendingIntent#FLAG_UPDATE_CURRENT PendingIntent.FLAG_UPDATE_CURRENT},
35269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * or any of the flags as supported by
35279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link Intent#fillIn Intent.fillIn()} to control which unspecified parts
35289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of the intent that can be supplied when the actual send happens.
35299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
35309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns an existing or new PendingIntent matching the given
35319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * parameters.  May return null only if
35329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link PendingIntent#FLAG_NO_CREATE PendingIntent.FLAG_NO_CREATE} has been
35339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * supplied.
35349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
35359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see PendingIntent
35369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
35379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public PendingIntent createPendingResult(int requestCode, Intent data,
35389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int flags) {
35399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String packageName = getPackageName();
35409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
35419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IIntentSender target =
35429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityManagerNative.getDefault().getIntentSender(
35439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        IActivityManager.INTENT_SENDER_ACTIVITY_RESULT, packageName,
35449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mParent == null ? mToken : mParent.mToken,
35459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mEmbeddedID, requestCode, data, null, flags);
35469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return target != null ? new PendingIntent(target) : null;
35479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
35489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Empty
35499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
35509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
35519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
35529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
35549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Change the desired orientation of this activity.  If the activity
35559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is currently in the foreground or otherwise impacting the screen
35569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * orientation, the screen will immediately be changed (possibly causing
35579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the activity to be restarted). Otherwise, this will be used the next
35589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * time the activity is visible.
35599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
35609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param requestedOrientation An orientation constant as used in
35619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link ActivityInfo#screenOrientation ActivityInfo.screenOrientation}.
35629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
35639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setRequestedOrientation(int requestedOrientation) {
35649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent == null) {
35659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
35669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityManagerNative.getDefault().setRequestedOrientation(
35679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mToken, requestedOrientation);
35689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
35699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Empty
35709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
35729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParent.setRequestedOrientation(requestedOrientation);
35739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
35749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
35759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
35779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the current requested orientation of the activity.  This will
35789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * either be the orientation requested in its component's manifest, or
35799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the last requested orientation given to
35809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setRequestedOrientation(int)}.
35819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
35829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns an orientation constant as used in
35839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link ActivityInfo#screenOrientation ActivityInfo.screenOrientation}.
35849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
35859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getRequestedOrientation() {
35869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent == null) {
35879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
35889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return ActivityManagerNative.getDefault()
35899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        .getRequestedOrientation(mToken);
35909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
35919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Empty
35929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
35949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mParent.getRequestedOrientation();
35959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
35969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
35979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
35989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
36009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the identifier of the task this activity is in.  This identifier
36019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will remain the same for the lifetime of the activity.
36029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
36039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Task identifier, an opaque integer.
36049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
36059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getTaskId() {
36069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
36079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault()
36089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                .getTaskForActivity(mToken, false);
36099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
36109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return -1;
36119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
36129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
36139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
36159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return whether this activity is the root of a task.  The root is the
36169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * first activity in a task.
36179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
36189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if this is the root activity, else false.
36199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
36209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isTaskRoot() {
36219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
36229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault()
36239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                .getTaskForActivity(mToken, true) >= 0;
36249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
36259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
36269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
36279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
36289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
36309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Move the task containing this activity to the back of the activity
36319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * stack.  The activity's order within the task is unchanged.
36329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
36339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param nonRoot If false then this only works if the activity is the root
36349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                of a task; if true it will work for any activity in
36359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                a task.
36369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
36379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return If the task was moved (or it was already at the
36389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         back) true is returned, else false.
36399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
36409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean moveTaskToBack(boolean nonRoot) {
36419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
36429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().moveActivityTaskToBack(
36439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mToken, nonRoot);
36449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
36459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Empty
36469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
36479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
36489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
36499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
36519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns class name for this activity with the package prefix removed.
36529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is the default name used to read and write settings.
36539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
36549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The local class name.
36559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
36569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getLocalClassName() {
36579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String pkg = getPackageName();
36589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String cls = mComponent.getClassName();
36599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int packageLen = pkg.length();
36609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!cls.startsWith(pkg) || cls.length() <= packageLen
36619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                || cls.charAt(packageLen) != '.') {
36629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return cls;
36639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
36649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return cls.substring(packageLen+1);
36659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
36669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
36689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns complete component name of this activity.
36699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
36709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the complete component name for this activity
36719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
36729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ComponentName getComponentName()
36739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
36749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mComponent;
36759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
36769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
36789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve a {@link SharedPreferences} object for accessing preferences
36799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that are private to this activity.  This simply calls the underlying
36809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getSharedPreferences(String, int)} method by passing in this activity's
36819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * class name as the preferences name.
36829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
36839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param mode Operating mode.  Use {@link #MODE_PRIVATE} for the default
36849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             operation, {@link #MODE_WORLD_READABLE} and
36859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             {@link #MODE_WORLD_WRITEABLE} to control permissions.
36869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
36879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the single SharedPreferences instance that can be used
36889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         to retrieve and modify the preference values.
36899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
36909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public SharedPreferences getPreferences(int mode) {
36919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getSharedPreferences(getLocalClassName(), mode);
36929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
36939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3694b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn    private void ensureSearchManager() {
3695b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn        if (mSearchManager != null) {
3696b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn            return;
3697b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn        }
3698b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn
3699e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani        mSearchManager = new SearchManager(this, null);
3700b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn    }
3701b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn
37029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
37039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Object getSystemService(String name) {
37049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (getBaseContext() == null) {
37059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalStateException(
37069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "System services not available to Activities before onCreate()");
37079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
37089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (WINDOW_SERVICE.equals(name)) {
37109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mWindowManager;
37118d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert        } else if (SEARCH_SERVICE.equals(name)) {
3712b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn            ensureSearchManager();
37138d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert            return mSearchManager;
37149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
37159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return super.getSystemService(name);
37169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
37179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
37199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Change the title associated with this activity.  If this is a
37209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * top-level activity, the title for its window will change.  If it
37219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is an embedded activity, the parent can do whatever it wants
37229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * with it.
37239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
37249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setTitle(CharSequence title) {
37259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTitle = title;
37269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onTitleChanged(title, mTitleColor);
37279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent != null) {
37299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParent.onChildTitleChanged(this, title);
37309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
37319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
37329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
37349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Change the title associated with this activity.  If this is a
37359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * top-level activity, the title for its window will change.  If it
37369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is an embedded activity, the parent can do whatever it wants
37379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * with it.
37389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
37399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setTitle(int titleId) {
37409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setTitle(getText(titleId));
37419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
37429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setTitleColor(int textColor) {
37449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTitleColor = textColor;
37459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onTitleChanged(mTitle, textColor);
37469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
37479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final CharSequence getTitle() {
37499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mTitle;
37509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
37519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getTitleColor() {
37539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mTitleColor;
37549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
37559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onTitleChanged(CharSequence title, int color) {
37579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mTitleReady) {
37589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final Window win = getWindow();
37599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win != null) {
37609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.setTitle(title);
37619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (color != 0) {
37629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.setTitleColor(color);
37639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
37659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
37669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
37679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onChildTitleChanged(Activity childActivity, CharSequence title) {
37699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
37709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
37729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the visibility of the progress bar in the title.
37739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
37749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * In order for the progress bar to be shown, the feature must be requested
37759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * via {@link #requestWindowFeature(int)}.
37769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
37779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param visible Whether to show the progress bars in the title.
37789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
37799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setProgressBarVisibility(boolean visible) {
37809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setFeatureInt(Window.FEATURE_PROGRESS, visible ? Window.PROGRESS_VISIBILITY_ON :
37819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Window.PROGRESS_VISIBILITY_OFF);
37829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
37839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
37859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the visibility of the indeterminate progress bar in the title.
37869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
37879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * In order for the progress bar to be shown, the feature must be requested
37889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * via {@link #requestWindowFeature(int)}.
37899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
37909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param visible Whether to show the progress bars in the title.
37919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
37929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setProgressBarIndeterminateVisibility(boolean visible) {
37939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setFeatureInt(Window.FEATURE_INDETERMINATE_PROGRESS,
37949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                visible ? Window.PROGRESS_VISIBILITY_ON : Window.PROGRESS_VISIBILITY_OFF);
37959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
37969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
37989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets whether the horizontal progress bar in the title should be indeterminate (the circular
37999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is always indeterminate).
38009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
38019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * In order for the progress bar to be shown, the feature must be requested
38029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * via {@link #requestWindowFeature(int)}.
38039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
38049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param indeterminate Whether the horizontal progress bar should be indeterminate.
38059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
38069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setProgressBarIndeterminate(boolean indeterminate) {
38079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setFeatureInt(Window.FEATURE_PROGRESS,
38089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                indeterminate ? Window.PROGRESS_INDETERMINATE_ON : Window.PROGRESS_INDETERMINATE_OFF);
38099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
38109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
38129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the progress for the progress bars in the title.
38139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
38149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * In order for the progress bar to be shown, the feature must be requested
38159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * via {@link #requestWindowFeature(int)}.
38169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
38179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param progress The progress for the progress bar. Valid ranges are from
38189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            0 to 10000 (both inclusive). If 10000 is given, the progress
38199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            bar will be completely filled and will fade out.
38209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
38219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setProgress(int progress) {
38229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setFeatureInt(Window.FEATURE_PROGRESS, progress + Window.PROGRESS_START);
38239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
38249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
38269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the secondary progress for the progress bar in the title. This
38279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * progress is drawn between the primary progress (set via
38289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setProgress(int)} and the background. It can be ideal for media
38299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * scenarios such as showing the buffering progress while the default
38309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * progress shows the play progress.
38319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
38329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * In order for the progress bar to be shown, the feature must be requested
38339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * via {@link #requestWindowFeature(int)}.
38349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
38359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param secondaryProgress The secondary progress for the progress bar. Valid ranges are from
38369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            0 to 10000 (both inclusive).
38379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
38389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setSecondaryProgress(int secondaryProgress) {
38399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setFeatureInt(Window.FEATURE_PROGRESS,
38409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                secondaryProgress + Window.PROGRESS_SECONDARY_START);
38419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
38429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
38449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Suggests an audio stream whose volume should be changed by the hardware
38459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * volume controls.
38469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
38479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The suggested audio stream will be tied to the window of this Activity.
38489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If the Activity is switched, the stream set here is no longer the
38499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * suggested stream. The client does not need to save and restore the old
38509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * suggested stream value in onPause and onResume.
38519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
38529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param streamType The type of the audio stream whose volume should be
38539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        changed by the hardware volume controls. It is not guaranteed that
38549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        the hardware volume controls will always change this stream's
38559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        volume (for example, if a call is in progress, its stream's volume
38569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        may be changed instead). To reset back to the default, use
38579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        {@link AudioManager#USE_DEFAULT_STREAM_TYPE}.
38589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
38599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setVolumeControlStream(int streamType) {
38609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setVolumeControlStream(streamType);
38619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
38629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
38649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the suggested audio stream whose volume should be changed by the
38659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * harwdare volume controls.
38669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
38679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The suggested audio stream type whose volume should be changed by
38689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         the hardware volume controls.
38699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setVolumeControlStream(int)
38709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
38719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getVolumeControlStream() {
38729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getWindow().getVolumeControlStream();
38739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
38749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
38769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Runs the specified action on the UI thread. If the current thread is the UI
38779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thread, then the action is executed immediately. If the current thread is
38789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not the UI thread, the action is posted to the event queue of the UI thread.
38799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
38809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param action the action to run on the UI thread
38819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
38829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void runOnUiThread(Runnable action) {
38839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (Thread.currentThread() != mUiThread) {
38849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mHandler.post(action);
38859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
38869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            action.run();
38879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
38889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
38899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3891ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn     * Standard implementation of
3892ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn     * {@link android.view.LayoutInflater.Factory#onCreateView} used when
3893ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn     * inflating with the LayoutInflater returned by {@link #getSystemService}.
3894ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn     * This implementation handles <fragment> tags to embed fragments inside
3895ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn     * of the activity.
38969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
38979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.view.LayoutInflater#createView
38989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.view.Window#getLayoutInflater
38999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
39009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public View onCreateView(String name, Context context, AttributeSet attrs) {
3901ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        if (!"fragment".equals(name)) {
3902ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn            return null;
3903ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        }
3904ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn
3905ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        TypedArray a =
3906ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn            context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.Fragment);
3907ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        String fname = a.getString(com.android.internal.R.styleable.Fragment_name);
3908b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        int id = a.getResourceId(com.android.internal.R.styleable.Fragment_id, 0);
3909ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        String tag = a.getString(com.android.internal.R.styleable.Fragment_tag);
3910ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        a.recycle();
3911ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn
3912b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (id == 0) {
3913b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            throw new IllegalArgumentException(attrs.getPositionDescription()
3914b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    + ": Must specify unique android:id for " + fname);
3915b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
3916b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
3917ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        try {
3918b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            // If we restored from a previous state, we may already have
3919b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            // instantiated this fragment from the state and should use
3920b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            // that instance instead of making a new one.
3921b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            Fragment fragment = mFragments.findFragmentById(id);
39225ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn            if (FragmentManager.DEBUG) Log.v(TAG, "onCreateView: id=0x"
39235ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                    + Integer.toHexString(id) + " fname=" + fname
39245ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                    + " existing=" + fragment);
3925b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            if (fragment == null) {
3926b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                fragment = Fragment.instantiate(this, fname);
3927b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                fragment.mFromLayout = true;
3928b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                fragment.mFragmentId = id;
3929b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                fragment.mTag = tag;
3930b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                fragment.mImmediateActivity = this;
3931b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                mFragments.addFragment(fragment, true);
3932ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn            }
39336e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            // If this fragment is newly instantiated (either right now, or
39346e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            // from last saved state), then give it the attributes to
39356e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            // initialize itself.
39366e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            if (!fragment.mRetaining) {
39376e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                fragment.onInflate(this, attrs, fragment.mSavedFragmentState);
39386e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            }
3939ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn            if (fragment.mView == null) {
3940ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn                throw new IllegalStateException("Fragment " + fname
3941ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn                        + " did not create a view.");
3942ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn            }
3943b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            fragment.mView.setId(id);
3944b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            if (fragment.mView.getTag() == null) {
3945b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                fragment.mView.setTag(tag);
3946b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            }
3947ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn            return fragment.mView;
3948ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        } catch (Exception e) {
3949ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn            InflateException ie = new InflateException(attrs.getPositionDescription()
3950b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    + ": Error inflating fragment " + fname);
3951ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn            ie.initCause(e);
3952b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            throw ie;
3953ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        }
39549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
39559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
395669a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler    /**
395769a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * Bit indicating that this activity is "immersive" and should not be
395869a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * interrupted by notifications if possible.
395969a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     *
396069a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * This value is initially set by the manifest property
396169a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * <code>android:immersive</code> but may be changed at runtime by
396269a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * {@link #setImmersive}.
396369a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     *
396469a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * @see android.content.pm.ActivityInfo#FLAG_IMMERSIVE
396569a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     */
396669a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler    public boolean isImmersive() {
396769a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler        try {
396869a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler            return ActivityManagerNative.getDefault().isImmersive(mToken);
396969a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler        } catch (RemoteException e) {
397069a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler            return false;
397169a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler        }
397269a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler    }
397369a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler
397469a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler    /**
397569a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * Adjust the current immersive mode setting.
397669a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     *
397769a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * Note that changing this value will have no effect on the activity's
397869a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * {@link android.content.pm.ActivityInfo} structure; that is, if
397969a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * <code>android:immersive</code> is set to <code>true</code>
398069a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * in the application's manifest entry for this activity, the {@link
398169a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * android.content.pm.ActivityInfo#flags ActivityInfo.flags} member will
398269a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * always have its {@link android.content.pm.ActivityInfo#FLAG_IMMERSIVE
398369a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * FLAG_IMMERSIVE} bit set.
398469a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     *
398569a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * @see #isImmersive
398669a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     * @see android.content.pm.ActivityInfo#FLAG_IMMERSIVE
398769a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler     */
398869a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler    public void setImmersive(boolean i) {
398969a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler        try {
399069a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler            ActivityManagerNative.getDefault().setImmersive(mToken, i);
399169a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler        } catch (RemoteException e) {
399269a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler            // pass
399369a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler        }
399469a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler    }
399569a4817e3e1e368e758ff8c238deb5ee26963c04Daniel Sandler
39969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ------------------ Internal API ------------------
39979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void setParent(Activity parent) {
39999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mParent = parent;
40009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void attach(Context context, ActivityThread aThread, Instrumentation instr, IBinder token,
40039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Application application, Intent intent, ActivityInfo info, CharSequence title,
4004b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            Activity parent, String id, NonConfigurationInstances lastNonConfigurationInstances,
40059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Configuration config) {
4006b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn        attach(context, aThread, instr, token, 0, application, intent, info, title, parent, id,
4007b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            lastNonConfigurationInstances, config);
40089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4010b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn    final void attach(Context context, ActivityThread aThread,
4011b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn            Instrumentation instr, IBinder token, int ident,
4012b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn            Application application, Intent intent, ActivityInfo info,
4013b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn            CharSequence title, Activity parent, String id,
4014b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            NonConfigurationInstances lastNonConfigurationInstances,
4015b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn            Configuration config) {
40169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        attachBaseContext(context);
40179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40182dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        mFragments.attachActivity(this);
40192dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
40209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindow = PolicyManager.makeNewWindow(this);
40219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindow.setCallback(this);
4022ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        mWindow.getLayoutInflater().setFactory(this);
40239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (info.softInputMode != WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED) {
40249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindow.setSoftInputMode(info.softInputMode);
40259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUiThread = Thread.currentThread();
40279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread = aThread;
40299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mInstrumentation = instr;
40309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mToken = token;
4031b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn        mIdent = ident;
40329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mApplication = application;
40339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mIntent = intent;
40349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mComponent = intent.getComponent();
40359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mActivityInfo = info;
40369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTitle = title;
40379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mParent = parent;
40389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEmbeddedID = id;
4039b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mLastNonConfigurationInstances = lastNonConfigurationInstances;
40409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindow.setWindowManager(null, mToken, mComponent.flattenToString());
40429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent != null) {
40439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindow.setContainer(mParent.getWindow());
40449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindowManager = mWindow.getWindowManager();
40469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCurrentConfig = config;
40479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final IBinder getActivityToken() {
40509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mParent != null ? mParent.getActivityToken() : mToken;
40519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40532dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    final void performCreate(Bundle icicle) {
40542dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        onCreate(icicle);
4055c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn        mFragments.dispatchActivityCreated();
40562dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
40572dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
40589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performStart() {
40599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = false;
4060445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn        mFragments.execPendingActions();
40619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mInstrumentation.callActivityOnStart(this);
40629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mCalled) {
40639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SuperNotCalledException(
40649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "Activity " + mComponent.toShortString() +
40659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                " did not call through to super.onStart()");
40669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40672dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        mFragments.dispatchStart();
40689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performRestart() {
40712f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki        synchronized (mManagedCursors) {
40722f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki            final int N = mManagedCursors.size();
40732f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki            for (int i=0; i<N; i++) {
40742f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                ManagedCursor mc = mManagedCursors.get(i);
40752f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                if (mc.mReleased || mc.mUpdated) {
40762f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                    mc.mCursor.requery();
40772f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                    mc.mReleased = false;
40782f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                    mc.mUpdated = false;
40792f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                }
40809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
40819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mStopped) {
40849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStopped = false;
40859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCalled = false;
40869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mInstrumentation.callActivityOnRestart(this);
40879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mCalled) {
40889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new SuperNotCalledException(
40899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "Activity " + mComponent.toShortString() +
40909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    " did not call through to super.onRestart()");
40919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
40929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            performStart();
40939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performResume() {
40979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        performRestart();
40989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4099445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn        mFragments.execPendingActions();
4100445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn
4101b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mLastNonConfigurationInstances = null;
41029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // First call onResume() -before- setting mResumed, so we don't
41049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // send out any status bar / menu notifications the client makes.
41059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = false;
41069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mInstrumentation.callActivityOnResume(this);
41079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mCalled) {
41089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SuperNotCalledException(
41099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "Activity " + mComponent.toShortString() +
41109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                " did not call through to super.onResume()");
41119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
41129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Now really resume, and install the current status bar and menu.
41149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mResumed = true;
41159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = false;
41162dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
41172dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        mFragments.dispatchResume();
4118445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn        mFragments.execPendingActions();
41192dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
41209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onPostResume();
41219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mCalled) {
41229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SuperNotCalledException(
41239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "Activity " + mComponent.toShortString() +
41249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                " did not call through to super.onPostResume()");
41259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
41269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performPause() {
41292dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        mFragments.dispatchPause();
41309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onPause();
41319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performUserLeaving() {
41349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onUserInteraction();
41359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onUserLeaveHint();
41369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performStop() {
41399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mStopped) {
41409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mWindow != null) {
41419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWindow.closeAllPanels();
41429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
41439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41442dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn            mFragments.dispatchStop();
41452dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
41469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCalled = false;
41479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mInstrumentation.callActivityOnStop(this);
41489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mCalled) {
41499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new SuperNotCalledException(
41509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "Activity " + mComponent.toShortString() +
41519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    " did not call through to super.onStop()");
41529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
41539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41542f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki            synchronized (mManagedCursors) {
41552f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                final int N = mManagedCursors.size();
41562f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                for (int i=0; i<N; i++) {
41572f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                    ManagedCursor mc = mManagedCursors.get(i);
41582f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                    if (!mc.mReleased) {
41592f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                        mc.mCursor.deactivate();
41602f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                        mc.mReleased = true;
41612f6a01858bea6c669039b0b1e10aa65fc73c7256Makoto Onuki                    }
41629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
41639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
41649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStopped = true;
41669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
41679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mResumed = false;
41689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41702dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    final void performDestroy() {
41712dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        mFragments.dispatchDestroy();
41722dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        onDestroy();
41732dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
41742dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
41759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final boolean isResumed() {
41769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mResumed;
41779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void dispatchActivityResult(String who, int requestCode,
41809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int resultCode, Intent data) {
41819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (Config.LOGV) Log.v(
41829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            TAG, "Dispatching result: who=" + who + ", reqCode=" + requestCode
41839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            + ", resCode=" + resultCode + ", data=" + data);
41849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (who == null) {
41859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            onActivityResult(requestCode, resultCode, data);
41866e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        } else {
41876e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            Fragment frag = mFragments.findFragmentByWho(who);
41886e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            if (frag != null) {
41896e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                frag.onActivityResult(requestCode, resultCode, data);
41906e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            }
41919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
41929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4194