Activity.java revision 9066cfe9886ac131c34d59ed0e2d287b0e3c0087
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
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentCallbacks;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentResolver;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.SharedPreferences;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ActivityInfo;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Configuration;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.Cursor;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Bitmap;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Canvas;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.media.AudioManager;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.Selection;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.SpannableStringBuilder;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.method.TextKeyListener;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Config;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.EventLog;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseArray;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ContextMenu;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ContextThemeWrapper;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyEvent;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.LayoutInflater;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Menu;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.MenuInflater;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.MenuItem;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.MotionEvent;
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewGroup;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewManager;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Window;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManager;
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ContextMenu.ContextMenuInfo;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View.OnCreateContextMenuListener;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.AdapterView;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.policy.PolicyManager;
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap;
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * An activity is a single, focused thing that the user can do.  Almost all
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activities interact with the user, so the Activity class takes care of
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * creating a window for you in which you can place your UI with
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #setContentView}.  While activities are often presented to the user
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as full-screen windows, they can also be used in other ways: as floating
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * windows (via a theme with {@link android.R.attr#windowIsFloating} set)
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or embedded inside of another activity (using {@link ActivityGroup}).
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * There are two methods almost all subclasses of Activity will implement:
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul>
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> {@link #onCreate} is where you initialize your activity.  Most
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     importantly, here you will usually call {@link #setContentView(int)}
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     with a layout resource defining your UI, and using {@link #findViewById}
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     to retrieve the widgets in that UI that you need to interact with
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     programmatically.
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> {@link #onPause} is where you deal with the user leaving your
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     activity.  Most importantly, any changes made by the user should at this
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     point be committed (usually to the
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     {@link android.content.ContentProvider} holding the data).
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>To be of use with {@link android.content.Context#startActivity Context.startActivity()}, all
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity classes must have a corresponding
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.styleable#AndroidManifestActivity &lt;activity&gt;}
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * declaration in their package's <code>AndroidManifest.xml</code>.</p>
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The Activity class is an important part of an application's overall lifecycle,
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and the way activities are launched and put together is a fundamental
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * part of the platform's application model. For a detailed perspective on the structure of
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Android applications and lifecycles, please read the <em>Dev Guide</em> document on
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a href="{@docRoot}guide/topics/fundamentals.html">Application Fundamentals</a>.</p>
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Topics covered here:
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ol>
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#ActivityLifecycle">Activity Lifecycle</a>
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#ConfigurationChanges">Configuration Changes</a>
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#StartingActivities">Starting Activities and Getting Results</a>
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#SavingPersistentState">Saving Persistent State</a>
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#Permissions">Permissions</a>
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#ProcessLifecycle">Process Lifecycle</a>
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ol>
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="ActivityLifecycle"></a>
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Activity Lifecycle</h3>
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Activities in the system are managed as an <em>activity stack</em>.
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * When a new activity is started, it is placed on the top of the stack
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and becomes the running activity -- the previous activity always remains
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * below it in the stack, and will not come to the foreground again until
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the new activity exits.</p>
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>An activity has essentially four states:</p>
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul>
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> If an activity in the foreground of the screen (at the top of
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         the stack),
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         it is <em>active</em> or  <em>running</em>. </li>
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li>If an activity has lost focus but is still visible (that is, a new non-full-sized
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         or transparent activity has focus on top of your activity), it
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         is <em>paused</em>. A paused activity is completely alive (it
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         maintains all state and member information and remains attached to
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         the window manager), but can be killed by the system in extreme
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         low memory situations.
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li>If an activity is completely obscured by another activity,
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         it is <em>stopped</em>. It still retains all state and member information,
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         however, it is no longer visible to the user so its window is hidden
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         and it will often be killed by the system when memory is needed
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         elsewhere.</li>
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li>If an activity is paused or stopped, the system can drop the activity
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         from memory by either asking it to finish, or simply killing its
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         process.  When it is displayed again to the user, it must be
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         completely restarted and restored to its previous state.</li>
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The following diagram shows the important state paths of an Activity.
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The square rectangles represent callback methods you can implement to
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * perform operations when the Activity moves between states.  The colored
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ovals are major states the Activity can be in.</p>
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><img src="../../../images/activity_lifecycle.png"
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      alt="State diagram for an Android Activity Lifecycle." border="0" /></p>
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>There are three key loops you may be interested in monitoring within your
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity:
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul>
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>The <b>entire lifetime</b> of an activity happens between the first call
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to {@link android.app.Activity#onCreate} through to a single final call
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to {@link android.app.Activity#onDestroy}.  An activity will do all setup
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of "global" state in onCreate(), and release all remaining resources in
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * onDestroy().  For example, if it has a thread running in the background
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to download data from the network, it may create that thread in onCreate()
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and then stop the thread in onDestroy().
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>The <b>visible lifetime</b> of an activity happens between a call to
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#onStart} until a corresponding call to
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#onStop}.  During this time the user can see the
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity on-screen, though it may not be in the foreground and interacting
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with the user.  Between these two methods you can maintain resources that
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are needed to show the activity to the user.  For example, you can register
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a {@link android.content.BroadcastReceiver} in onStart() to monitor for changes
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that impact your UI, and unregister it in onStop() when the user an no
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * longer see what you are displaying.  The onStart() and onStop() methods
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can be called multiple times, as the activity becomes visible and hidden
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to the user.
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>The <b>foreground lifetime</b> of an activity happens between a call to
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#onResume} until a corresponding call to
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#onPause}.  During this time the activity is
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in front of all other activities and interacting with the user.  An activity
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can frequently go between the resumed and paused states -- for example when
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the device goes to sleep, when an activity result is delivered, when a new
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * intent is delivered -- so the code in these methods should be fairly
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * lightweight.
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The entire lifecycle of an activity is defined by the following
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Activity methods.  All of these are hooks that you can override
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to do appropriate work when the activity changes state.  All
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activities will implement {@link android.app.Activity#onCreate}
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to do their initial setup; many will also implement
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#onPause} to commit changes to data and
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * otherwise prepare to stop interacting with the user.  You should always
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * call up to your superclass when implementing these methods.</p>
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p>
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint">
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * public class Activity extends ApplicationContext {
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onCreate(Bundle savedInstanceState);
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onStart();
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onRestart();
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onResume();
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onPause();
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onStop();
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onDestroy();
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * }
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </pre>
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>In general the movement through an activity's lifecycle looks like
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this:</p>
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <table border="2" width="85%" align="center" frame="hsides" rules="rows">
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <colgroup align="left" span="3" />
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <colgroup align="left" />
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <colgroup align="center" />
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <colgroup align="center" />
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <thead>
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th colspan="3">Method</th> <th>Description</th> <th>Killable?</th> <th>Next</th></tr>
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </thead>
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tbody>
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th colspan="3" align="left" border="0">{@link android.app.Activity#onCreate onCreate()}</th>
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>Called when the activity is first created.
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             This is where you should do all of your normal static set up:
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             create views, bind data to lists, etc.  This method also
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             provides you with a Bundle containing the activity's previously
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             frozen state, if there was one.
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             <p>Always followed by <code>onStart()</code>.</td>
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center">No</td>
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center"><code>onStart()</code></td>
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><td rowspan="5" style="border-left: none; border-right: none;">&nbsp;&nbsp;&nbsp;&nbsp;</td>
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <th colspan="2" align="left" border="0">{@link android.app.Activity#onRestart onRestart()}</th>
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>Called after your activity has been stopped, prior to it being
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             started again.
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             <p>Always followed by <code>onStart()</code></td>
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center">No</td>
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center"><code>onStart()</code></td>
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th colspan="2" align="left" border="0">{@link android.app.Activity#onStart onStart()}</th>
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>Called when the activity is becoming visible to the user.
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             <p>Followed by <code>onResume()</code> if the activity comes
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             to the foreground, or <code>onStop()</code> if it becomes hidden.</td>
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center">No</td>
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center"><code>onResume()</code> or <code>onStop()</code></td>
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><td rowspan="2" style="border-left: none;">&nbsp;&nbsp;&nbsp;&nbsp;</td>
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <th align="left" border="0">{@link android.app.Activity#onResume onResume()}</th>
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>Called when the activity will start
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             interacting with the user.  At this point your activity is at
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             the top of the activity stack, with user input going to it.
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             <p>Always followed by <code>onPause()</code>.</td>
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center">No</td>
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center"><code>onPause()</code></td>
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th align="left" border="0">{@link android.app.Activity#onPause onPause()}</th>
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>Called when the system is about to start resuming a previous
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             activity.  This is typically used to commit unsaved changes to
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             persistent data, stop animations and other things that may be consuming
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             CPU, etc.  Implementations of this method must be very quick because
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             the next activity will not be resumed until this method returns.
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             <p>Followed by either <code>onResume()</code> if the activity
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             returns back to the front, or <code>onStop()</code> if it becomes
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             invisible to the user.</td>
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center"><font color="#800000"><strong>Yes</strong></font></td>
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center"><code>onResume()</code> or<br>
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 <code>onStop()</code></td>
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th colspan="2" align="left" border="0">{@link android.app.Activity#onStop onStop()}</th>
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>Called when the activity is no longer visible to the user, because
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             another activity has been resumed and is covering this one.  This
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             may happen either because a new activity is being started, an existing
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             one is being brought in front of this one, or this one is being
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             destroyed.
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             <p>Followed by either <code>onRestart()</code> if
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             this activity is coming back to interact with the user, or
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             <code>onDestroy()</code> if this activity is going away.</td>
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center"><font color="#800000"><strong>Yes</strong></font></td>
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center"><code>onRestart()</code> or<br>
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 <code>onDestroy()</code></td>
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th colspan="3" align="left" border="0">{@link android.app.Activity#onDestroy onDestroy()}</th>
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>The final call you receive before your
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             activity is destroyed.  This can happen either because the
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             activity is finishing (someone called {@link Activity#finish} on
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             it, or because the system is temporarily destroying this
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             instance of the activity to save space.  You can distinguish
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             between these two scenarios with the {@link
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             Activity#isFinishing} method.</td>
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center"><font color="#800000"><strong>Yes</strong></font></td>
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center"><em>nothing</em></td>
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tbody>
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </table>
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Note the "Killable" column in the above table -- for those methods that
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are marked as being killable, after that method returns the process hosting the
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity may killed by the system <em>at any time</em> without another line
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of its code being executed.  Because of this, you should use the
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #onPause} method to write any persistent data (such as user edits)
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to storage.  In addition, the method
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #onSaveInstanceState(Bundle)} is called before placing the activity
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in such a background state, allowing you to save away any dynamic instance
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * state in your activity into the given Bundle, to be later received in
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #onCreate} if the activity needs to be re-created.
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the <a href="#ProcessLifecycle">Process Lifecycle</a>
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * section for more information on how the lifecycle of a process is tied
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to the activities it is hosting.  Note that it is important to save
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * persistent data in {@link #onPause} instead of {@link #onSaveInstanceState}
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * because the later is not part of the lifecycle callbacks, so will not
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be called in every situation as described in its documentation.</p>
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>For those methods that are not marked as being killable, the activity's
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * process will not be killed by the system starting from the time the method
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is called and continuing after it returns.  Thus an activity is in the killable
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * state, for example, between after <code>onPause()</code> to the start of
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <code>onResume()</code>.</p>
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="ConfigurationChanges"></a>
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Configuration Changes</h3>
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>If the configuration of the device (as defined by the
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Configuration Resources.Configuration} class) changes,
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * then anything displaying a user interface will need to update to match that
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * configuration.  Because Activity is the primary mechanism for interacting
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with the user, it includes special support for handling configuration
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * changes.</p>
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Unless you specify otherwise, a configuration change (such as a change
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in screen orientation, language, input devices, etc) will cause your
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current activity to be <em>destroyed</em>, going through the normal activity
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * lifecycle process of {@link #onPause},
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #onStop}, and {@link #onDestroy} as appropriate.  If the activity
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * had been in the foreground or visible to the user, once {@link #onDestroy} is
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * called in that instance then a new instance of the activity will be
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * created, with whatever savedInstanceState the previous instance had generated
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * from {@link #onSaveInstanceState}.</p>
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>This is done because any application resource,
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * including layout files, can change based on any configuration value.  Thus
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the only safe way to handle a configuration change is to re-retrieve all
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * resources, including layouts, drawables, and strings.  Because activities
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * must already know how to save their state and re-create themselves from
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that state, this is a convenient way to have an activity restart itself
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with a new configuration.</p>
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>In some special cases, you may want to bypass restarting of your
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity based on one or more types of configuration changes.  This is
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * done with the {@link android.R.attr#configChanges android:configChanges}
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * attribute in its manifest.  For any types of configuration changes you say
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that you handle there, you will receive a call to your current activity's
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #onConfigurationChanged} method instead of being restarted.  If
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a configuration change involves any that you do not handle, however, the
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity will still be restarted and {@link #onConfigurationChanged}
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will not be called.</p>
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="StartingActivities"></a>
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Starting Activities and Getting Results</h3>
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The {@link android.app.Activity#startActivity}
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * method is used to start a
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * new activity, which will be placed at the top of the activity stack.  It
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * takes a single argument, an {@link android.content.Intent Intent},
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * which describes the activity
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to be executed.</p>
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Sometimes you want to get a result back from an activity when it
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ends.  For example, you may start an activity that lets the user pick
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a person in a list of contacts; when it ends, it returns the person
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that was selected.  To do this, you call the
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#startActivityForResult(Intent, int)}
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * version with a second integer parameter identifying the call.  The result
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will come back through your {@link android.app.Activity#onActivityResult}
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * method.</p>
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>When an activity exits, it can call
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#setResult(int)}
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to return data back to its parent.  It must always supply a result code,
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * which can be the standard results RESULT_CANCELED, RESULT_OK, or any
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * custom values starting at RESULT_FIRST_USER.  In addition, it can optionally
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * return back an Intent containing any additional data it wants.  All of this
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * information appears back on the
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * parent's <code>Activity.onActivityResult()</code>, along with the integer
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * identifier it originally supplied.</p>
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>If a child activity fails for any reason (such as crashing), the parent
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity will receive a result with the code RESULT_CANCELED.</p>
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint">
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * public class MyActivity extends Activity {
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     ...
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     static final int PICK_CONTACT_REQUEST = 0;
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected boolean onKeyDown(int keyCode, KeyEvent event) {
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             // When the user center presses, let them pick a contact.
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             startActivityForResult(
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 new Intent(Intent.ACTION_PICK,
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 new Uri("content://contacts")),
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 PICK_CONTACT_REQUEST);
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *            return true;
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         }
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         return false;
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     }
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onActivityResult(int requestCode, int resultCode,
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             Intent data) {
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         if (requestCode == PICK_CONTACT_REQUEST) {
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             if (resultCode == RESULT_OK) {
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 // A contact was picked.  Here we will just display it
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 // to the user.
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 startActivity(new Intent(Intent.ACTION_VIEW, data));
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             }
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         }
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     }
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * }
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </pre>
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="SavingPersistentState"></a>
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Saving Persistent State</h3>
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>There are generally two kinds of persistent state than an activity
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will deal with: shared document-like data (typically stored in a SQLite
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * database using a {@linkplain android.content.ContentProvider content provider})
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and internal state such as user preferences.</p>
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>For content provider data, we suggest that activities use a
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * "edit in place" user model.  That is, any edits a user makes are effectively
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * made immediately without requiring an additional confirmation step.
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Supporting this model is generally a simple matter of following two rules:</p>
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul>
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> <p>When creating a new document, the backing database entry or file for
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             it is created immediately.  For example, if the user chooses to write
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             a new e-mail, a new entry for that e-mail is created as soon as they
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             start entering data, so that if they go to any other activity after
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             that point this e-mail will now appear in the list of drafts.</p>
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> <p>When an activity's <code>onPause()</code> method is called, it should
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             commit to the backing content provider or file any changes the user
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             has made.  This ensures that those changes will be seen by any other
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             activity that is about to run.  You will probably want to commit
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             your data even more aggressively at key times during your
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             activity's lifecycle: for example before starting a new
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             activity, before finishing your own activity, when the user
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             switches between input fields, etc.</p>
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>This model is designed to prevent data loss when a user is navigating
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * between activities, and allows the system to safely kill an activity (because
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * system resources are needed somewhere else) at any time after it has been
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * paused.  Note this implies
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that the user pressing BACK from your activity does <em>not</em>
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mean "cancel" -- it means to leave the activity with its current contents
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * saved away.  Cancelling edits in an activity must be provided through
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * some other mechanism, such as an explicit "revert" or "undo" option.</p>
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>See the {@linkplain android.content.ContentProvider content package} for
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * more information about content providers.  These are a key aspect of how
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * different activities invoke and propagate data between themselves.</p>
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The Activity class also provides an API for managing internal persistent state
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * associated with an activity.  This can be used, for example, to remember
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the user's preferred initial display in a calendar (day view or week view)
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or the user's default home page in a web browser.</p>
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Activity persistent state is managed
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with the method {@link #getPreferences},
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * allowing you to retrieve and
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * modify a set of name/value pairs associated with the activity.  To use
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * preferences that are shared across multiple application components
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (activities, receivers, services, providers), you can use the underlying
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Context#getSharedPreferences Context.getSharedPreferences()} method
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to retrieve a preferences
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * object stored under a specific name.
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (Note that it is not possible to share settings data across application
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * packages -- for that you will need a content provider.)</p>
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Here is an excerpt from a calendar activity that stores the user's
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * preferred view mode in its persistent settings:</p>
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint">
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * public class CalendarActivity extends Activity {
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     ...
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     static final int DAY_VIEW_MODE = 0;
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     static final int WEEK_VIEW_MODE = 1;
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     private SharedPreferences mPrefs;
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     private int mCurViewMode;
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onCreate(Bundle savedInstanceState) {
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         super.onCreate(savedInstanceState);
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         SharedPreferences mPrefs = getSharedPreferences();
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         mCurViewMode = mPrefs.getInt("view_mode" DAY_VIEW_MODE);
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     }
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     protected void onPause() {
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         super.onPause();
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         SharedPreferences.Editor ed = mPrefs.edit();
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         ed.putInt("view_mode", mCurViewMode);
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         ed.commit();
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     }
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * }
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </pre>
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="Permissions"></a>
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Permissions</h3>
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The ability to start a particular Activity can be enforced when it is
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * declared in its
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * manifest's {@link android.R.styleable#AndroidManifestActivity &lt;activity&gt;}
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * tag.  By doing so, other applications will need to declare a corresponding
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.styleable#AndroidManifestUsesPermission &lt;uses-permission&gt;}
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * element in their own manifest to be able to start that activity.
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>See the <a href="{@docRoot}guide/topics/security/security.html">Security and Permissions</a>
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * document for more information on permissions and security in general.
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="ProcessLifecycle"></a>
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Process Lifecycle</h3>
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The Android system attempts to keep application process around for as
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * long as possible, but eventually will need to remove old processes when
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * memory runs low.  As described in <a href="#ActivityLifecycle">Activity
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Lifecycle</a>, the decision about which process to remove is intimately
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * tied to the state of the user's interaction with it.  In general, there
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are four states a process can be in based on the activities running in it,
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * listed here in order of importance.  The system will kill less important
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * processes (the last ones) before it resorts to killing more important
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * processes (the first ones).
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ol>
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <p>The <b>foreground activity</b> (the activity at the top of the screen
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that the user is currently interacting with) is considered the most important.
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Its process will only be killed as a last resort, if it uses more memory
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * than is available on the device.  Generally at this point the device has
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * reached a memory paging state, so this is required in order to keep the user
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * interface responsive.
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <p>A <b>visible activity</b> (an activity that is visible to the user
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * but not in the foreground, such as one sitting behind a foreground dialog)
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is considered extremely important and will not be killed unless that is
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * required to keep the foreground activity running.
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <p>A <b>background activity</b> (an activity that is not visible to
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the user and has been paused) is no longer critical, so the system may
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * safely kill its process to reclaim memory for other foreground or
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * visible processes.  If its process needs to be killed, when the user navigates
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * back to the activity (making it visible on the screen again), its
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #onCreate} method will be called with the savedInstanceState it had previously
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * supplied in {@link #onSaveInstanceState} so that it can restart itself in the same
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * state as the user last left it.
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <p>An <b>empty process</b> is one hosting no activities or other
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * application components (such as {@link Service} or
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.BroadcastReceiver} classes).  These are killed very
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * quickly by the system as memory becomes low.  For this reason, any
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * background operation you do outside of an activity must be executed in the
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * context of an activity BroadcastReceiver or Service to ensure that the system
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * knows it needs to keep your process around.
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ol>
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Sometimes an Activity may need to do a long-running operation that exists
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * independently of the activity lifecycle itself.  An example may be a camera
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * application that allows you to upload a picture to a web site.  The upload
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * may take a long time, and the application should allow the user to leave
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the application will it is executing.  To accomplish this, your Activity
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * should start a {@link Service} in which the upload takes place.  This allows
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the system to properly prioritize your process (considering it to be more
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * important than other non-visible applications) for the duration of the
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * upload, independent of whether the original activity is paused, stopped,
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or finished.
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Activity extends ContextThemeWrapper
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        implements LayoutInflater.Factory,
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Window.Callback, KeyEvent.Callback,
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        OnCreateContextMenuListener, ComponentCallbacks {
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String TAG = "Activity";
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Standard activity result: operation canceled. */
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int RESULT_CANCELED    = 0;
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Standard activity result: operation succeeded. */
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int RESULT_OK           = -1;
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Start of user-defined activity results. */
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int RESULT_FIRST_USER   = 1;
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static long sInstanceCount = 0;
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String WINDOW_HIERARCHY_TAG = "android:viewHierarchyState";
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String SAVED_DIALOG_IDS_KEY = "android:savedDialogIds";
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String SAVED_DIALOGS_TAG = "android:savedDialogs";
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String SAVED_DIALOG_KEY_PREFIX = "android:dialog_";
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String SAVED_SEARCH_DIALOG_KEY = "android:search_dialog";
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private SparseArray<Dialog> mManagedDialogs;
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // set by the thread after the constructor and before onCreate(Bundle savedInstanceState) is called.
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Instrumentation mInstrumentation;
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IBinder mToken;
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ String mEmbeddedID;
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Application mApplication;
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Intent mIntent;
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ComponentName mComponent;
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ ActivityInfo mActivityInfo;
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ ActivityThread mMainThread;
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ Object mLastNonConfigurationInstance;
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ HashMap<String,Object> mLastNonConfigurationChildInstances;
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Activity mParent;
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mCalled;
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mResumed;
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mStopped;
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mFinished;
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mStartedActivity;
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ int mConfigChangeFlags;
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ Configuration mCurrentConfig;
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Window mWindow;
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private WindowManager mWindowManager;
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ View mDecor = null;
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ boolean mWindowAdded = false;
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ boolean mVisibleFromServer = false;
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ boolean mVisibleFromClient = true;
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private CharSequence mTitle;
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mTitleColor = 0;
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final class ManagedCursor {
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ManagedCursor(Cursor cursor) {
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCursor = cursor;
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mReleased = false;
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUpdated = false;
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final Cursor mCursor;
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private boolean mReleased;
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private boolean mUpdated;
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final ArrayList<ManagedCursor> mManagedCursors =
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new ArrayList<ManagedCursor>();
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // protected by synchronized (this)
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mResultCode = RESULT_CANCELED;
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Intent mResultData = null;
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mTitleReady = false;
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mDefaultKeyMode = DEFAULT_KEYS_DISABLE;
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private SpannableStringBuilder mDefaultKeySsb = null;
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static final int[] FOCUSED_STATE_SET = {com.android.internal.R.attr.state_focused};
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Thread mUiThread;
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final Handler mHandler = new Handler();
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Activity() {
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ++sInstanceCount;
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void finalize() throws Throwable {
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.finalize();
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        --sInstanceCount;
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static long getInstanceCount() {
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sInstanceCount;
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Return the intent that started this activity. */
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Intent getIntent() {
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mIntent;
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Change the intent returned by {@link #getIntent}.  This holds a
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * reference to the given intent; it does not copy it.  Often used in
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * conjunction with {@link #onNewIntent}.
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param newIntent The new Intent object to return from getIntent
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getIntent
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onNewIntent
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setIntent(Intent newIntent) {
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mIntent = newIntent;
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Return the application that owns this activity. */
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final Application getApplication() {
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mApplication;
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Is this activity embedded inside of another activity? */
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean isChild() {
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mParent != null;
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Return the parent activity if this view is an embedded child. */
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final Activity getParent() {
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mParent;
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Retrieve the window manager for showing custom windows. */
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public WindowManager getWindowManager() {
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mWindowManager;
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the current {@link android.view.Window} for the activity.
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This can be used to directly access parts of the Window API that
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * are not available through Activity/Screen.
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Window The current window, or null if the activity is not
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         visual.
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Window getWindow() {
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mWindow;
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Calls {@link android.view.Window#getCurrentFocus} on the
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Window of this Activity to return the currently focused view.
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return View The current View with focus or null.
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getWindow
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.view.Window#getCurrentFocus
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public View getCurrentFocus() {
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mWindow != null ? mWindow.getCurrentFocus() : null;
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getWallpaperDesiredMinimumWidth() {
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int width = super.getWallpaperDesiredMinimumWidth();
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return width <= 0 ? getWindowManager().getDefaultDisplay().getWidth() : width;
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getWallpaperDesiredMinimumHeight() {
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int height = super.getWallpaperDesiredMinimumHeight();
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return height <= 0 ? getWindowManager().getDefaultDisplay().getHeight() : height;
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when the activity is starting.  This is where most initialization
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * should go: calling {@link #setContentView(int)} to inflate the
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity's UI, using {@link #findViewById} to programmatically interact
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * with widgets in the UI, calling
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #managedQuery(android.net.Uri , String[], String, String[], String)} to retrieve
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * cursors for data being displayed, etc.
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>You can call {@link #finish} from within this function, in
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * which case onDestroy() will be immediately called without any of the rest
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of the activity lifecycle ({@link #onStart}, {@link #onResume},
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onPause}, etc) executing.
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Derived classes must call through to the super class's
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method.  If they do not, an exception will be
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thrown.</em></p>
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param savedInstanceState If the activity is being re-initialized after
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *     previously being shut down then this Bundle contains the data it most
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *     recently supplied in {@link #onSaveInstanceState}.  <b><i>Note: Otherwise it is null.</i></b>
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onStart
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onSaveInstanceState
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onRestoreInstanceState
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPostCreate
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onCreate(Bundle savedInstanceState) {
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mVisibleFromClient = mWindow.getWindowStyle().getBoolean(
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.Window_windowNoDisplay, true);
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The hook for {@link ActivityThread} to restore the state of this activity.
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Calls {@link #onSaveInstanceState(android.os.Bundle)} and
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #restoreManagedDialogs(android.os.Bundle)}.
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param savedInstanceState contains the saved state
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performRestoreInstanceState(Bundle savedInstanceState) {
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onRestoreInstanceState(savedInstanceState);
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        restoreManagedDialogs(savedInstanceState);
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Also restore the state of a search dialog (if any)
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // TODO more generic than just this manager
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SearchManager searchManager =
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            (SearchManager) getSystemService(Context.SEARCH_SERVICE);
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        searchManager.restoreSearchDialog(savedInstanceState, SAVED_SEARCH_DIALOG_KEY);
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This method is called after {@link #onStart} when the activity is
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * being re-initialized from a previously saved state, given here in
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <var>state</var>.  Most implementations will simply use {@link #onCreate}
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to restore their state, but it is sometimes convenient to do it here
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * after all of the initialization has been done or to allow subclasses to
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * decide whether to use your default implementation.  The default
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method performs a restore of any view state that
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * had previously been frozen by {@link #onSaveInstanceState}.
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This method is called between {@link #onStart} and
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onPostCreate}.
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param savedInstanceState the data most recently supplied in {@link #onSaveInstanceState}.
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onCreate
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPostCreate
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onResume
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onSaveInstanceState
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onRestoreInstanceState(Bundle savedInstanceState) {
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mWindow != null) {
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Bundle windowState = savedInstanceState.getBundle(WINDOW_HIERARCHY_TAG);
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (windowState != null) {
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWindow.restoreHierarchyState(windowState);
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Restore the state of any saved managed dialogs.
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param savedInstanceState The bundle to restore from.
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void restoreManagedDialogs(Bundle savedInstanceState) {
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Bundle b = savedInstanceState.getBundle(SAVED_DIALOGS_TAG);
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (b == null) {
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int[] ids = b.getIntArray(SAVED_DIALOG_IDS_KEY);
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int numDialogs = ids.length;
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mManagedDialogs = new SparseArray<Dialog>(numDialogs);
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < numDialogs; i++) {
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final Integer dialogId = ids[i];
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Bundle dialogState = b.getBundle(savedDialogKeyFor(dialogId));
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (dialogState != null) {
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final Dialog dialog = onCreateDialog(dialogId);
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                dialog.onRestoreInstanceState(dialogState);
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mManagedDialogs.put(dialogId, dialog);
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String savedDialogKeyFor(int key) {
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return SAVED_DIALOG_KEY_PREFIX + key;
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when activity start-up is complete (after {@link #onStart}
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and {@link #onRestoreInstanceState} have been called).  Applications will
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * generally not implement this method; it is intended for system
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * classes to do final initialization after application code has run.
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Derived classes must call through to the super class's
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method.  If they do not, an exception will be
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thrown.</em></p>
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param savedInstanceState If the activity is being re-initialized after
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *     previously being shut down then this Bundle contains the data it most
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *     recently supplied in {@link #onSaveInstanceState}.  <b><i>Note: Otherwise it is null.</i></b>
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onCreate
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onPostCreate(Bundle savedInstanceState) {
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!isChild()) {
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTitleReady = true;
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            onTitleChanged(getTitle(), getTitleColor());
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called after {@link #onCreate} &mdash; or after {@link #onRestart} when
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the activity had been stopped, but is now again being displayed to the
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	 * user.  It will be followed by {@link #onResume}.
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Derived classes must call through to the super class's
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method.  If they do not, an exception will be
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thrown.</em></p>
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onCreate
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onStop
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onResume
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onStart() {
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called after {@link #onStop} when the current activity is being
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * re-displayed to the user (the user has navigated back to it).  It will
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be followed by {@link #onStart} and then {@link #onResume}.
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>For activities that are using raw {@link Cursor} objects (instead of
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * creating them through
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #managedQuery(android.net.Uri , String[], String, String[], String)},
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this is usually the place
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * where the cursor should be requeried (because you had deactivated it in
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onStop}.
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Derived classes must call through to the super class's
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method.  If they do not, an exception will be
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thrown.</em></p>
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onStop
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onStart
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onResume
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onRestart() {
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called after {@link #onRestoreInstanceState}, {@link #onRestart}, or
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onPause}, for your activity to start interacting with the user.
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is a good place to begin animations, open exclusive-access devices
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * (such as the camera), etc.
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Keep in mind that onResume is not the best indicator that your activity
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is visible to the user; a system window such as the keyguard may be in
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * front.  Use {@link #onWindowFocusChanged} to know for certain that your
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity is visible to the user (for example, to resume a game).
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Derived classes must call through to the super class's
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method.  If they do not, an exception will be
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thrown.</em></p>
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onRestoreInstanceState
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onRestart
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPostResume
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPause
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onResume() {
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when activity resume is complete (after {@link #onResume} has
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * been called). Applications will generally not implement this method;
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * it is intended for system classes to do final setup after application
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * resume code has run.
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Derived classes must call through to the super class's
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method.  If they do not, an exception will be
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thrown.</em></p>
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onResume
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onPostResume() {
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Window win = getWindow();
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (win != null) win.makeActive();
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is called for activities that set launchMode to "singleTop" in
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * their package, or if a client used the {@link Intent#FLAG_ACTIVITY_SINGLE_TOP}
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * flag when calling {@link #startActivity}.  In either case, when the
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity is re-launched while at the top of the activity stack instead
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of a new instance of the activity being started, onNewIntent() will be
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * called on the existing instance with the Intent that was used to
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * re-launch it.
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>An activity will always be paused before receiving a new intent, so
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * you can count on {@link #onResume} being called after this method.
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note that {@link #getIntent} still returns the original Intent.  You
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * can use {@link #setIntent} to update it to this new Intent.
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param intent The new intent that was started for the activity.
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getIntent
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setIntent
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onResume
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onNewIntent(Intent intent) {
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The hook for {@link ActivityThread} to save the state of this activity.
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Calls {@link #onSaveInstanceState(android.os.Bundle)}
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and {@link #saveManagedDialogs(android.os.Bundle)}.
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param outState The bundle to save the state to.
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performSaveInstanceState(Bundle outState) {
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onSaveInstanceState(outState);
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        saveManagedDialogs(outState);
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Also save the state of a search dialog (if any)
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // TODO more generic than just this manager
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SearchManager searchManager =
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            (SearchManager) getSystemService(Context.SEARCH_SERVICE);
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        searchManager.saveSearchDialog(outState, SAVED_SEARCH_DIALOG_KEY);
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called to retrieve per-instance state from an activity before being killed
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * so that the state can be restored in {@link #onCreate} or
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onRestoreInstanceState} (the {@link Bundle} populated by this method
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will be passed to both).
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This method is called before an activity may be killed so that when it
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * comes back some time in the future it can restore its state.  For example,
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if activity B is launched in front of activity A, and at some point activity
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A is killed to reclaim resources, activity A will have a chance to save the
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * current state of its user interface via this method so that when the user
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returns to activity A, the state of the user interface can be restored
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * via {@link #onCreate} or {@link #onRestoreInstanceState}.
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Do not confuse this method with activity lifecycle callbacks such as
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onPause}, which is always called when an activity is being placed
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in the background or on its way to destruction, or {@link #onStop} which
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is called before destruction.  One example of when {@link #onPause} and
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onStop} is called and not this method is when a user navigates back
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * from activity B to activity A: there is no need to call {@link #onSaveInstanceState}
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * on B because that particular instance will never be restored, so the
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * system avoids calling it.  An example when {@link #onPause} is called and
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not {@link #onSaveInstanceState} is when activity B is launched in front of activity A:
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the system may avoid calling {@link #onSaveInstanceState} on activity A if it isn't
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * killed during the lifetime of B since the state of the user interface of
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A will stay intact.
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The default implementation takes care of most of the UI per-instance
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * state for you by calling {@link android.view.View#onSaveInstanceState()} on each
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * view in the hierarchy that has an id, and by saving the id of the currently
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * focused view (all of which is restored by the default implementation of
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onRestoreInstanceState}).  If you override this method to save additional
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * information not captured by each individual view, you will likely want to
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * call through to the default implementation, otherwise be prepared to save
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * all of the state of each view yourself.
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>If called, this method will occur before {@link #onStop}.  There are
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * no guarantees about whether it will occur before or after {@link #onPause}.
10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param outState Bundle in which to place your saved state.
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onCreate
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onRestoreInstanceState
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPause
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onSaveInstanceState(Bundle outState) {
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outState.putBundle(WINDOW_HIERARCHY_TAG, mWindow.saveHierarchyState());
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Save the state of any managed dialogs.
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param outState place to store the saved state.
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void saveManagedDialogs(Bundle outState) {
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mManagedDialogs == null) {
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int numDialogs = mManagedDialogs.size();
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (numDialogs == 0) {
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Bundle dialogState = new Bundle();
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int[] ids = new int[mManagedDialogs.size()];
10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // save each dialog's bundle, gather the ids
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < numDialogs; i++) {
10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int key = mManagedDialogs.keyAt(i);
10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ids[i] = key;
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final Dialog dialog = mManagedDialogs.valueAt(i);
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dialogState.putBundle(savedDialogKeyFor(key), dialog.onSaveInstanceState());
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dialogState.putIntArray(SAVED_DIALOG_IDS_KEY, ids);
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outState.putBundle(SAVED_DIALOGS_TAG, dialogState);
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called as part of the activity lifecycle when an activity is going into
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the background, but has not (yet) been killed.  The counterpart to
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onResume}.
11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>When activity B is launched in front of activity A, this callback will
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be invoked on A.  B will not be created until A's {@link #onPause} returns,
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * so be sure to not do anything lengthy here.
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This callback is mostly used for saving any persistent state the
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity is editing, to present a "edit in place" model to the user and
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * making sure nothing is lost if there are not enough resources to start
11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the new activity without first killing this one.  This is also a good
11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * place to do things like stop animations and other things that consume a
11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * noticeable mount of CPU in order to make the switch to the next activity
11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * as fast as possible, or to close resources that are exclusive access
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * such as the camera.
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>In situations where the system needs more memory it may kill paused
11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * processes to reclaim resources.  Because of this, you should be sure
11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that all of your state is saved by the time you return from
11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this function.  In general {@link #onSaveInstanceState} is used to save
11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * per-instance state in the activity and this method is used to store
11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * global persistent data (in content providers, files, etc.)
11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>After receiving this call you will usually receive a following call
11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to {@link #onStop} (after the next activity has been resumed and
11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * displayed), however in some cases there will be a direct call back to
11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onResume} without going through the stopped state.
11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Derived classes must call through to the super class's
11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method.  If they do not, an exception will be
11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thrown.</em></p>
11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onResume
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onSaveInstanceState
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onStop
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onPause() {
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called as part of the activity lifecycle when an activity is about to go
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * into the background as the result of user choice.  For example, when the
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * user presses the Home key, {@link #onUserLeaveHint} will be called, but
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * when an incoming phone call causes the in-call Activity to be automatically
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * brought to the foreground, {@link #onUserLeaveHint} will not be called on
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the activity being interrupted.  In cases when it is invoked, this method
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is called right before the activity's {@link #onPause} callback.
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This callback and {@link #onUserInteraction} are intended to help
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activities manage status bar notifications intelligently; specifically,
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for helping activities determine the proper time to cancel a notfication.
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onUserInteraction()
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onUserLeaveHint() {
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Generate a new thumbnail for this activity.  This method is called before
11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * pausing the activity, and should draw into <var>outBitmap</var> the
11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * imagery for the desired thumbnail in the dimensions of that bitmap.  It
11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * can use the given <var>canvas</var>, which is configured to draw into the
11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * bitmap, for rendering if desired.
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The default implementation renders the Screen's current view
11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * hierarchy into the canvas to generate a thumbnail.
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>If you return false, the bitmap will be filled with a default
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thumbnail.
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param outBitmap The bitmap to contain the thumbnail.
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param canvas Can be used to render into the bitmap.
11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Return true if you have drawn into the bitmap; otherwise after
11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         you return it will be filled with a default thumbnail.
11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onCreateDescription
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onSaveInstanceState
11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPause
11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onCreateThumbnail(Bitmap outBitmap, Canvas canvas) {
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final View view = mDecor;
11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (view == null) {
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int vw = view.getWidth();
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int vh = view.getHeight();
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int dw = outBitmap.getWidth();
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int dh = outBitmap.getHeight();
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        canvas.save();
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        canvas.scale(((float)dw)/vw, ((float)dh)/vh);
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        view.draw(canvas);
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        canvas.restore();
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Generate a new description for this activity.  This method is called
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * before pausing the activity and can, if desired, return some textual
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * description of its current state to be displayed to the user.
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The default implementation returns null, which will cause you to
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * inherit the description from the previous activity.  If all activities
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * return null, generally the label of the top activity will be used as the
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * description.
12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return A description of what the user is doing.  It should be short and
12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         sweet (only a few words).
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onCreateThumbnail
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onSaveInstanceState
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPause
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public CharSequence onCreateDescription() {
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when you are no longer visible to the user.  You will next
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * receive either {@link #onRestart}, {@link #onDestroy}, or nothing,
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * depending on later user activity.
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note that this method may never be called, in low memory situations
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * where the system does not have enough memory to keep your activity's
12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * process running after its {@link #onPause} method is called.
12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Derived classes must call through to the super class's
12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method.  If they do not, an exception will be
12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thrown.</em></p>
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onRestart
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onResume
12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onSaveInstanceState
12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onDestroy
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onStop() {
12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Perform any final cleanup before an activity is destroyed.  This can
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * happen either because the activity is finishing (someone called
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #finish} on it, or because the system is temporarily destroying
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this instance of the activity to save space.  You can distinguish
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * between these two scenarios with the {@link #isFinishing} method.
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Note: do not count on this method being called as a place for
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * saving data! For example, if an activity is editing data in a content
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * provider, those edits should be committed in either {@link #onPause} or
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onSaveInstanceState}, not here.</em> This method is usually implemented to
12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * free resources like threads that are associated with an activity, so
12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that a destroyed activity does not leave such things around while the
12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * rest of its application is still running.  There are situations where
12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the system will simply kill the activity's hosting process without
12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * calling this method (or any others) in it, so it should not be used to
12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * do things that are intended to remain around after the process goes
12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * away.
12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Derived classes must call through to the super class's
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation of this method.  If they do not, an exception will be
12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thrown.</em></p>
12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPause
12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onStop
12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #finish
12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isFinishing
12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onDestroy() {
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // dismiss any dialogs we are managing.
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mManagedDialogs != null) {
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int numDialogs = mManagedDialogs.size();
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i = 0; i < numDialogs; i++) {
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final Dialog dialog = mManagedDialogs.valueAt(i);
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (dialog.isShowing()) {
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    dialog.dismiss();
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // also dismiss search dialog if showing
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // TODO more generic than just this manager
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SearchManager searchManager =
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            (SearchManager) getSystemService(Context.SEARCH_SERVICE);
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        searchManager.stopSearch();
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // close any cursors we are managing.
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int numCursors = mManagedCursors.size();
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < numCursors; i++) {
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ManagedCursor c = mManagedCursors.get(i);
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (c != null) {
12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                c.mCursor.close();
12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called by the system when the device configuration changes while your
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity is running.  Note that this will <em>only</em> be called if
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * you have selected configurations you would like to handle with the
13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.R.attr#configChanges} attribute in your manifest.  If
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * any configuration change occurs that is not selected to be reported
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * by that attribute, then instead of reporting it the system will stop
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and restart the activity (to have it launched with the new
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * configuration).
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>At the time that this function has been called, your Resources
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * object will have been updated to return resource values matching the
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * new configuration.
13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param newConfig The new device configuration.
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onConfigurationChanged(Configuration newConfig) {
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // also update search dialog if showing
13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // TODO more generic than just this manager
13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SearchManager searchManager =
13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            (SearchManager) getSystemService(Context.SEARCH_SERVICE);
13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        searchManager.onConfigurationChanged(newConfig);
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mWindow != null) {
13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Pass the configuration changed event to the window
13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindow.onConfigurationChanged(newConfig);
13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If this activity is being destroyed because it can not handle a
13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * configuration parameter being changed (and thus its
13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onConfigurationChanged(Configuration)} method is
13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <em>not</em> being called), then you can use this method to discover
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the set of changes that have occurred while in the process of being
13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * destroyed.  Note that there is no guarantee that these will be
13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * accurate (other changes could have happened at any time), so you should
13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * only use this as an optimization hint.
13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns a bit field of the configuration parameters that are
13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * changing, as defined by the {@link android.content.res.Configuration}
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * class.
13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getChangingConfigurations() {
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mConfigChangeFlags;
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the non-configuration instance data that was previously
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returned by {@link #onRetainNonConfigurationInstance()}.  This will
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be available from the initial {@link #onCreate} and
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onStart} calls to the new instance, allowing you to extract
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * any useful dynamic state from the previous instance.
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note that the data you retrieve here should <em>only</em> be used
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * as an optimization for handling configuration changes.  You should always
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be able to handle getting a null pointer back, and an activity must
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * still be able to restore itself to its previous state (through the
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * normal {@link #onSaveInstanceState(Bundle)} mechanism) even if this
13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * function returns null.
13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the object previously returned by
13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onRetainNonConfigurationInstance()}.
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Object getLastNonConfigurationInstance() {
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mLastNonConfigurationInstance;
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called by the system, as part of destroying an
13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity due to a configuration change, when it is known that a new
13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * instance will immediately be created for the new configuration.  You
13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * can return any object you like here, including the activity instance
13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * itself, which can later be retrieved by calling
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getLastNonConfigurationInstance()} in the new activity
13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * instance.
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This function is called purely as an optimization, and you must
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not rely on it being called.  When it is called, a number of guarantees
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will be made to help optimize configuration switching:
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <ul>
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li> The function will be called between {@link #onStop} and
13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onDestroy}.
13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li> A new instance of the activity will <em>always</em> be immediately
13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * created after this one's {@link #onDestroy()} is called.
13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li> The object you return here will <em>always</em> be available from
13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the {@link #getLastNonConfigurationInstance()} method of the following
13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity instance as described there.
13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </ul>
13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>These guarantees are designed so that an activity can use this API
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to propagate extensive state from the old to new activity instance, from
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * loaded bitmaps, to network connections, to evenly actively running
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * threads.  Note that you should <em>not</em> propagate any data that
13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * may change based on the configuration, including any data loaded from
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * resources such as strings, layouts, or drawables.
14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Return any Object holding the desired state to propagate to the
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * next activity instance.
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Object onRetainNonConfigurationInstance() {
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the non-configuration instance data that was previously
14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returned by {@link #onRetainNonConfigurationChildInstances()}.  This will
14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be available from the initial {@link #onCreate} and
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onStart} calls to the new instance, allowing you to extract
14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * any useful dynamic state from the previous instance.
14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note that the data you retrieve here should <em>only</em> be used
14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * as an optimization for handling configuration changes.  You should always
14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be able to handle getting a null pointer back, and an activity must
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * still be able to restore itself to its previous state (through the
14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * normal {@link #onSaveInstanceState(Bundle)} mechanism) even if this
14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * function returns null.
14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the object previously returned by
14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onRetainNonConfigurationChildInstances()}
14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    HashMap<String,Object> getLastNonConfigurationChildInstances() {
14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mLastNonConfigurationChildInstances;
14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This method is similar to {@link #onRetainNonConfigurationInstance()} except that
14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * it should return either a mapping from  child activity id strings to arbitrary objects,
14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * or null.  This method is intended to be used by Activity framework subclasses that control a
14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * set of child activities, such as ActivityGroup.  The same guarantees and restrictions apply
14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * as for {@link #onRetainNonConfigurationInstance()}.  The default implementation returns null.
14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    HashMap<String,Object> onRetainNonConfigurationChildInstances() {
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onLowMemory() {
14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = true;
14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Wrapper around
14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link ContentResolver#query(android.net.Uri , String[], String, String[], String)}
14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that gives the resulting {@link Cursor} to call
14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #startManagingCursor} so that the activity will manage its
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * lifecycle for you.
14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param uri The URI of the content provider to query.
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param projection List of columns to return.
14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param selection SQL WHERE clause.
14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param sortOrder SQL ORDER BY clause.
14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The Cursor that was returned by query().
14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see ContentResolver#query(android.net.Uri , String[], String, String[], String)
14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startManagingCursor
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final Cursor managedQuery(Uri uri,
14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                     String[] projection,
14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                     String selection,
14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                     String sortOrder)
14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Cursor c = getContentResolver().query(uri, projection, selection, null, sortOrder);
14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (c != null) {
14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            startManagingCursor(c);
14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return c;
14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Wrapper around
14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link ContentResolver#query(android.net.Uri , String[], String, String[], String)}
14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that gives the resulting {@link Cursor} to call
14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #startManagingCursor} so that the activity will manage its
14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * lifecycle for you.
14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param uri The URI of the content provider to query.
14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param projection List of columns to return.
14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param selection SQL WHERE clause.
14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param selectionArgs The arguments to selection, if any ?s are pesent
14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param sortOrder SQL ORDER BY clause.
14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The Cursor that was returned by query().
14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see ContentResolver#query(android.net.Uri , String[], String, String[], String)
14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startManagingCursor
14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final Cursor managedQuery(Uri uri,
14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                     String[] projection,
14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                     String selection,
14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                     String[] selectionArgs,
14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                     String sortOrder)
14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Cursor c = getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder);
15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (c != null) {
15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            startManagingCursor(c);
15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return c;
15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Wrapper around {@link Cursor#commitUpdates()} that takes care of noting
15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that the Cursor needs to be requeried.  You can call this method in
15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onPause} or {@link #onStop} to have the system call
15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link Cursor#requery} for you if the activity is later resumed.  This
15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * allows you to avoid determing when to do the requery yourself (which is
15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * required for the Cursor to see any data changes that were committed with
15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * it).
15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param c The Cursor whose changes are to be committed.
15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #managedQuery(android.net.Uri , String[], String, String[], String)
15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startManagingCursor
15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see Cursor#commitUpdates()
15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see Cursor#requery
15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Deprecated
15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void managedCommitUpdates(Cursor c) {
15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mManagedCursors) {
15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = mManagedCursors.size();
15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=0; i<N; i++) {
15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ManagedCursor mc = mManagedCursors.get(i);
15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mc.mCursor == c) {
15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    c.commitUpdates();
15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mc.mUpdated = true;
15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException(
15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "Cursor " + c + " is not currently managed");
15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This method allows the activity to take care of managing the given
15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link Cursor}'s lifecycle for you based on the activity's lifecycle.
15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * That is, when the activity is stopped it will automatically call
15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link Cursor#deactivate} on the given Cursor, and when it is later restarted
15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * it will call {@link Cursor#requery} for you.  When the activity is
15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * destroyed, all managed Cursors will be closed automatically.
15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param c The Cursor to be managed.
15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #managedQuery(android.net.Uri , String[], String, String[], String)
15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #stopManagingCursor
15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startManagingCursor(Cursor c) {
15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mManagedCursors) {
15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mManagedCursors.add(new ManagedCursor(c));
15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Given a Cursor that was previously given to
15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #startManagingCursor}, stop the activity's management of that
15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * cursor.
15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param c The Cursor that was being managed.
15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startManagingCursor
15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void stopManagingCursor(Cursor c) {
15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mManagedCursors) {
15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = mManagedCursors.size();
15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=0; i<N; i++) {
15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ManagedCursor mc = mManagedCursors.get(i);
15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mc.mCursor == c) {
15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mManagedCursors.remove(i);
15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Control whether this activity is required to be persistent.  By default
15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activities are not persistent; setting this to true will prevent the
15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * system from stopping this activity or its process when running low on
15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * resources.
15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>You should avoid using this method</em>, it has severe negative
15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * consequences on how well the system can manage its resources.  A better
15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * approach is to implement an application service that you control with
15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link Context#startService} and {@link Context#stopService}.
15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param isPersistent Control whether the current activity must be
15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                     persistent, true if so, false for the normal
15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                     behavior.
15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setPersistent(boolean isPersistent) {
15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent == null) {
15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityManagerNative.getDefault()
16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    .setPersistent(mToken, isPersistent);
16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Empty
16039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("setPersistent() not yet supported for embedded activities");
16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Finds a view that was identified by the id attribute from the XML that
16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * was processed in {@link #onCreate}.
16129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The view if found or null otherwise.
16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public View findViewById(int id) {
16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getWindow().findViewById(id);
16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the activity content from a layout resource.  The resource will be
16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * inflated, adding all top-level views to the activity.
16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param layoutResID Resource ID to be inflated.
16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setContentView(int layoutResID) {
16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setContentView(layoutResID);
16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the activity content to an explicit view.  This view is placed
16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * directly into the activity's view hierarchy.  It can itself be a complex
16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * view hierarhcy.
16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param view The desired content to display.
16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setContentView(View view) {
16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setContentView(view);
16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the activity content to an explicit view.  This view is placed
16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * directly into the activity's view hierarchy.  It can itself be a complex
16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * view hierarhcy.
16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param view The desired content to display.
16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param params Layout parameters for the view.
16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setContentView(View view, ViewGroup.LayoutParams params) {
16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setContentView(view, params);
16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Add an additional content view to the activity.  Added after any existing
16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ones in the activity -- existing views are NOT removed.
16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param view The desired content to display.
16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param params Layout parameters for the view.
16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void addContentView(View view, ViewGroup.LayoutParams params) {
16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().addContentView(view, params);
16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setDefaultKeyMode} to turn off default handling of
16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * keys.
16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setDefaultKeyMode
16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public final int DEFAULT_KEYS_DISABLE = 0;
16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setDefaultKeyMode} to launch the dialer during default
16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * key handling.
16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setDefaultKeyMode
16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public final int DEFAULT_KEYS_DIALER = 1;
16779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
16789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setDefaultKeyMode} to execute a menu shortcut in
16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * default key handling.
16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>That is, the user does not need to hold down the menu key to execute menu shortcuts.
16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setDefaultKeyMode
16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public final int DEFAULT_KEYS_SHORTCUT = 2;
16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setDefaultKeyMode} to specify that unhandled keystrokes
16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will start an application-defined search.  (If the application or activity does not
16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * actually define a search, the the keys will be ignored.)
16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>See {@link android.app.SearchManager android.app.SearchManager} for more details.
16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setDefaultKeyMode
16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public final int DEFAULT_KEYS_SEARCH_LOCAL = 3;
16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setDefaultKeyMode} to specify that unhandled keystrokes
16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will start a global search (typically web search, but some platforms may define alternate
17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * methods for global search)
17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>See {@link android.app.SearchManager android.app.SearchManager} for more details.
17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setDefaultKeyMode
17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public final int DEFAULT_KEYS_SEARCH_GLOBAL = 4;
17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Select the default key handling for this activity.  This controls what
17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will happen to key events that are not otherwise handled.  The default
17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * mode ({@link #DEFAULT_KEYS_DISABLE}) will simply drop them on the
17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * floor. Other modes allow you to launch the dialer
17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ({@link #DEFAULT_KEYS_DIALER}), execute a shortcut in your options
17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * menu without requiring the menu key be held down
17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ({@link #DEFAULT_KEYS_SHORTCUT}), or launch a search ({@link #DEFAULT_KEYS_SEARCH_LOCAL}
17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and {@link #DEFAULT_KEYS_SEARCH_GLOBAL}).
17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note that the mode selected here does not impact the default
17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * handling of system keys, such as the "back" and "menu" keys, and your
17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity and its views always get a first chance to receive and handle
17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * all application keys.
17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param mode The desired default key mode constant.
17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #DEFAULT_KEYS_DISABLE
17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #DEFAULT_KEYS_DIALER
17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #DEFAULT_KEYS_SHORTCUT
17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #DEFAULT_KEYS_SEARCH_LOCAL
17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #DEFAULT_KEYS_SEARCH_GLOBAL
17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onKeyDown
17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setDefaultKeyMode(int mode) {
17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDefaultKeyMode = mode;
17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Some modes use a SpannableStringBuilder to track & dispatch input events
17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // This list must remain in sync with the switch in onKeyDown()
17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (mode) {
17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case DEFAULT_KEYS_DISABLE:
17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case DEFAULT_KEYS_SHORTCUT:
17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDefaultKeySsb = null;      // not used in these modes
17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case DEFAULT_KEYS_DIALER:
17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case DEFAULT_KEYS_SEARCH_LOCAL:
17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case DEFAULT_KEYS_SEARCH_GLOBAL:
17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDefaultKeySsb = new SpannableStringBuilder();
17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Selection.setSelection(mDefaultKeySsb,0);
17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        default:
17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException();
17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when a key was pressed down and not handled by any of the views
17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * inside of the activity. So, for example, key presses while the cursor
17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is inside a TextView will not trigger the event (unless it is a navigation
17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to another object) because TextView handles its own key presses.
17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>If the focused view didn't want this event, this method is called.
17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The default implementation handles KEYCODE_BACK to stop the activity
17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and go back, and other default key handling if configured with {@link #setDefaultKeyMode}.
17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Return <code>true</code> to prevent this event from being propagated
17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * further, or <code>false</code> to indicate that you have not handled
17669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this event and it should continue to be propagated.
17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onKeyUp
17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.view.KeyEvent
17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onKeyDown(int keyCode, KeyEvent event)  {
17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            finish();
17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mDefaultKeyMode == DEFAULT_KEYS_DISABLE) {
17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (mDefaultKeyMode == DEFAULT_KEYS_SHORTCUT) {
17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getWindow().performPanelShortcut(Window.FEATURE_OPTIONS_PANEL,
17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                    keyCode, event, Menu.FLAG_ALWAYS_PERFORM_CLOSE);
17819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Common code for DEFAULT_KEYS_DIALER & DEFAULT_KEYS_SEARCH_*
17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean clearSpannable = false;
17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean handled;
17859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((event.getRepeatCount() != 0) || event.isSystem()) {
17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                clearSpannable = true;
17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                handled = false;
17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                handled = TextKeyListener.getInstance().onKeyDown(null, mDefaultKeySsb,
17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                                  keyCode, event);
17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (handled && mDefaultKeySsb.length() > 0) {
17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // something useable has been typed - dispatch it now.
17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final String str = mDefaultKeySsb.toString();
17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    clearSpannable = true;
17969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    switch (mDefaultKeyMode) {
17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    case DEFAULT_KEYS_DIALER:
17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Intent intent = new Intent(Intent.ACTION_DIAL,  Uri.parse("tel:" + str));
18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        startActivity(intent);
18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    case DEFAULT_KEYS_SEARCH_LOCAL:
18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        startSearch(str, false, null, false);
18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    case DEFAULT_KEYS_SEARCH_GLOBAL:
18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        startSearch(str, false, null, true);
18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (clearSpannable) {
18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mDefaultKeySsb.clear();
18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mDefaultKeySsb.clearSpans();
18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Selection.setSelection(mDefaultKeySsb,0);
18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return handled;
18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when a key was released and not handled by any of the views
18239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * inside of the activity. So, for example, key presses while the cursor
18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is inside a TextView will not trigger the event (unless it is a navigation
18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to another object) because TextView handles its own key presses.
18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Return <code>true</code> to prevent this event from being propagated
18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * further, or <code>false</code> to indicate that you have not handled
18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this event and it should continue to be propagated.
18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onKeyDown
18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see KeyEvent
18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onKeyUp(int keyCode, KeyEvent event) {
18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default implementation of {@link KeyEvent.Callback#onKeyMultiple(int, int, KeyEvent)
18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * KeyEvent.Callback.onKeyMultiple()}: always returns false (doesn't handle
18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the event).
18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event) {
18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when a touch screen event was not handled by any of the views
18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * under it.  This is most useful to process touch events that happen
18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * outside of your window bounds, where there is no view to receive it.
18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param event The touch screen event being processed.
18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Return true if you have consumed the event, false if you haven't.
18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The default implementation always returns false.
18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onTouchEvent(MotionEvent event) {
18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when the trackball was moved and not handled by any of the
18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * views inside of the activity.  So, for example, if the trackball moves
18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * while focus is on a button, you will receive a call here because
18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * buttons do not normally do anything with trackball events.  The call
18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * here happens <em>before</em> trackball movements are converted to
18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * DPAD key events, which then get sent back to the view hierarchy, and
18679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will be processed at the point for things like focus navigation.
18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param event The trackball event being processed.
18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Return true if you have consumed the event, false if you haven't.
18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The default implementation always returns false.
18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
18749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onTrackballEvent(MotionEvent event) {
18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
18799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called whenever a key, touch, or trackball event is dispatched to the
18809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity.  Implement this method if you wish to know that the user has
18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * interacted with the device in some way while your activity is running.
18829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This callback and {@link #onUserLeaveHint} are intended to help
18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activities manage status bar notifications intelligently; specifically,
18849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for helping activities determine the proper time to cancel a notfication.
18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>All calls to your activity's {@link #onUserLeaveHint} callback will
18879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be accompanied by calls to {@link #onUserInteraction}.  This
18889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ensures that your activity will be told of relevant user activity such
18899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * as pulling down the notification pane and touching an item there.
18909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note that this callback will be invoked for the touch down action
18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that begins a touch gesture, but may not be invoked for the touch-moved
18939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and touch-up actions that follow.
18949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onUserLeaveHint()
18969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
18979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onUserInteraction() {
18989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onWindowAttributesChanged(WindowManager.LayoutParams params) {
19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Update window manager if: we have a view, that view is
19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // attached to its parent (which will be a RootView), and
19039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this activity is not embedded.
19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent == null) {
19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            View decor = mDecor;
19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (decor != null && decor.getParent() != null) {
19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                getWindowManager().updateViewLayout(decor, params);
19089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onContentChanged() {
19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
19169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when the current {@link Window} of the activity gains or loses
19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * focus.  This is the best indicator of whether this activity is visible
19189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to the user.
19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note that this provides information what global focus state, which
19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is managed independently of activity lifecycles.  As such, while focus
19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * changes will generally have some relation to lifecycle changes (an
19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity that is stopped will not generally get window focus), you
19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * should not rely on any particular order between the callbacks here and
19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * those in the other lifecycle methods such as {@link #onResume}.
19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>As a general rule, however, a resumed activity will have window
19289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * focus...  unless it has displayed other dialogs or popups that take
19299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * input focus, in which case the activity itself will not have focus
19309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * when the other windows have it.  Likewise, the system may display
19319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * system-level windows (such as the status bar notification panel or
19329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a system alert) which will temporarily take window input focus without
19339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * pausing the foreground activity.
19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
19359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param hasFocus Whether the window of this activity has focus.
19369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
19379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #hasWindowFocus()
19389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onResume
19399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onWindowFocusChanged(boolean hasFocus) {
19419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns true if this activity's <em>main</em> window currently has window focus.
19459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Note that this is not the same as the view itself having focus.
19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
19479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if this activity's main window currently has window focus.
19489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onWindowAttributesChanged(android.view.WindowManager.LayoutParams)
19509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
19519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean hasWindowFocus() {
19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Window w = getWindow();
19539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (w != null) {
19549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            View d = w.getDecorView();
19559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (d != null) {
19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return d.hasWindowFocus();
19579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
19609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called to process key events.  You can override this to intercept all
19649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * key events before they are dispatched to the window.  Be sure to call
19659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this implementation for key events that should be handled normally.
19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
19679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param event The key event.
19689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
19699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return boolean Return true if this event was consumed.
19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean dispatchKeyEvent(KeyEvent event) {
19729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onUserInteraction();
19739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (getWindow().superDispatchKeyEvent(event)) {
19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
19759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return event.dispatch(this);
19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called to process touch screen events.  You can override this to
19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * intercept all touch screen events before they are dispatched to the
19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * window.  Be sure to call this implementation for touch screen events
19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that should be handled normally.
19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param ev The touch screen event.
19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return boolean Return true if this event was consumed.
19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
19899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean dispatchTouchEvent(MotionEvent ev) {
19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
19919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            onUserInteraction();
19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (getWindow().superDispatchTouchEvent(ev)) {
19949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
19959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return onTouchEvent(ev);
19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
20009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called to process trackball events.  You can override this to
20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * intercept all trackball events before they are dispatched to the
20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * window.  Be sure to call this implementation for trackball events
20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that should be handled normally.
20049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
20059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param ev The trackball event.
20069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
20079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return boolean Return true if this event was consumed.
20089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean dispatchTrackballEvent(MotionEvent ev) {
20109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onUserInteraction();
20119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (getWindow().superDispatchTrackballEvent(ev)) {
20129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
20139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return onTrackballEvent(ev);
20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default implementation of
20199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window.Callback#onCreatePanelView}
20209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for activities. This
20219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * simply returns null so that all panel sub-windows will have the default
20229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * menu behavior.
20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public View onCreatePanelView(int featureId) {
20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default implementation of
20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window.Callback#onCreatePanelMenu}
20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for activities.  This calls through to the new
20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onCreateOptionsMenu} method for the
20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window#FEATURE_OPTIONS_PANEL} panel,
20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * so that subclasses of Activity don't need to deal with feature codes.
20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onCreatePanelMenu(int featureId, Menu menu) {
20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (featureId == Window.FEATURE_OPTIONS_PANEL) {
20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return onCreateOptionsMenu(menu);
20399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
20449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default implementation of
20459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window.Callback#onPreparePanel}
20469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for activities.  This
20479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * calls through to the new {@link #onPrepareOptionsMenu} method for the
20489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window#FEATURE_OPTIONS_PANEL}
20499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * panel, so that subclasses of
20509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Activity don't need to deal with feature codes.
20519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
20529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onPreparePanel(int featureId, View view, Menu menu) {
20539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (featureId == Window.FEATURE_OPTIONS_PANEL && menu != null) {
20549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean goforit = onPrepareOptionsMenu(menu);
20559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return goforit && menu.hasVisibleItems();
20569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
20589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
20639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The default implementation returns true.
20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
20659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onMenuOpened(int featureId, Menu menu) {
20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
20709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default implementation of
20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window.Callback#onMenuItemSelected}
20729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for activities.  This calls through to the new
20739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onOptionsItemSelected} method for the
20749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window#FEATURE_OPTIONS_PANEL}
20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * panel, so that subclasses of
20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Activity don't need to deal with feature codes.
20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onMenuItemSelected(int featureId, MenuItem item) {
20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (featureId) {
20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case Window.FEATURE_OPTIONS_PANEL:
20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Put event logging here so it gets called even if subclass
20829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // doesn't call through to superclass's implmeentation of each
20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // of these methods below
20849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                EventLog.writeEvent(50000, 0, item.getTitleCondensed());
20859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return onOptionsItemSelected(item);
20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case Window.FEATURE_CONTEXT_MENU:
20889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                EventLog.writeEvent(50000, 1, item.getTitleCondensed());
20899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return onContextItemSelected(item);
20909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default:
20929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
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     * Default implementation of
20989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window.Callback#onPanelClosed(int, Menu)} for
20999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activities. This calls through to {@link #onOptionsMenuClosed(Menu)}
21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * method for the {@link android.view.Window#FEATURE_OPTIONS_PANEL} panel,
21019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * so that subclasses of Activity don't need to deal with feature codes.
21029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * For context menus ({@link Window#FEATURE_CONTEXT_MENU}), the
21039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onContextMenuClosed(Menu)} will be called.
21049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
21059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onPanelClosed(int featureId, Menu menu) {
21069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (featureId) {
21079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case Window.FEATURE_OPTIONS_PANEL:
21089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                onOptionsMenuClosed(menu);
21099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
21109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case Window.FEATURE_CONTEXT_MENU:
21129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                onContextMenuClosed(menu);
21139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
21149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
21189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Initialize the contents of the Activity's standard options menu.  You
21199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * should place your menu items in to <var>menu</var>.
21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
21219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This is only called once, the first time the options menu is
21229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * displayed.  To update the menu every time it is displayed, see
21239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onPrepareOptionsMenu}.
21249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
21259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The default implementation populates the menu with standard system
21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * menu items.  These are placed in the {@link Menu#CATEGORY_SYSTEM} group so that
21279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * they will be correctly ordered with application-defined menu items.
21289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Deriving classes should always call through to the base implementation.
21299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
21309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>You can safely hold on to <var>menu</var> (and any items created
21319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * from it), making modifications to it as desired, until the next
21329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * time onCreateOptionsMenu() is called.
21339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
21349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>When you add items to the menu, you can implement the Activity's
21359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onOptionsItemSelected} method to handle them there.
21369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
21379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param menu The options menu in which you place your items.
21389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
21399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return You must return true for the menu to be displayed;
21409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         if you return false it will not be shown.
21419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
21429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPrepareOptionsMenu
21439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onOptionsItemSelected
21449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
21459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onCreateOptionsMenu(Menu menu) {
21469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent != null) {
21479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mParent.onCreateOptionsMenu(menu);
21489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
21509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
21539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Prepare the Screen's standard options menu to be displayed.  This is
21549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * called right before the menu is shown, every time it is shown.  You can
21559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * use this method to efficiently enable/disable items or otherwise
21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * dynamically modify the contents.
21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
21589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The default implementation updates the system menu items based on the
21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity's state.  Deriving classes should always call through to the
21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * base class implementation.
21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
21629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param menu The options menu as last shown or first initialized by
21639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             onCreateOptionsMenu().
21649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
21659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return You must return true for the menu to be displayed;
21669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         if you return false it will not be shown.
21679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onCreateOptionsMenu
21699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
21709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onPrepareOptionsMenu(Menu menu) {
21719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent != null) {
21729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mParent.onPrepareOptionsMenu(menu);
21739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This hook is called whenever an item in your options menu is selected.
21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The default implementation simply returns false to have the normal
21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * processing happen (calling the item's Runnable or sending a message to
21819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * its Handler as appropriate).  You can use this method for any items
21829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for which you would like to do processing without those other
21839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * facilities.
21849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
21859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Derived classes should call through to the base class for it to
21869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * perform the default menu handling.
21879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param item The menu item that was selected.
21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
21909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return boolean Return false to allow normal menu processing to
21919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         proceed, true to consume it here.
21929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
21939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onCreateOptionsMenu
21949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
21959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onOptionsItemSelected(MenuItem item) {
21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent != null) {
21979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mParent.onOptionsItemSelected(item);
21989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
22009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
22039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This hook is called whenever the options menu is being closed (either by the user canceling
22049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the menu with the back/menu button, or when an item is selected).
22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
22069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param menu The options menu as last shown or first initialized by
22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             onCreateOptionsMenu().
22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
22099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onOptionsMenuClosed(Menu menu) {
22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent != null) {
22119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParent.onOptionsMenuClosed(menu);
22129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
22169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Programmatically opens the options menu. If the options menu is already
22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * open, this method does nothing.
22189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
22199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void openOptionsMenu() {
22209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindow.openPanel(Window.FEATURE_OPTIONS_PANEL, null);
22219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
22249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Progammatically closes the options menu. If the options menu is already
22259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * closed, this method does nothing.
22269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
22279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void closeOptionsMenu() {
22289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindow.closePanel(Window.FEATURE_OPTIONS_PANEL);
22299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
22329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when a context menu for the {@code view} is about to be shown.
22339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Unlike {@link #onCreateOptionsMenu(Menu)}, this will be called every
22349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * time the context menu is about to be shown and should be populated for
22359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the view (or item inside the view for {@link AdapterView} subclasses,
22369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this can be found in the {@code menuInfo})).
22379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
22389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use {@link #onContextItemSelected(android.view.MenuItem)} to know when an
22399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * item has been selected.
22409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
22419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * It is not safe to hold onto the context menu after this method returns.
22429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
22439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
22449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
22459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
22489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Registers a context menu to be shown for the given view (multiple views
22499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * can show the context menu). This method will set the
22509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link OnCreateContextMenuListener} on the view to this activity, so
22519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onCreateContextMenu(ContextMenu, View, ContextMenuInfo)} will be
22529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * called when it is time to show the context menu.
22539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
22549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #unregisterForContextMenu(View)
22559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param view The view that should show a context menu.
22569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
22579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void registerForContextMenu(View view) {
22589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        view.setOnCreateContextMenuListener(this);
22599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
22629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Prevents a context menu to be shown for the given view. This method will remove the
22639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link OnCreateContextMenuListener} on the view.
22649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
22659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #registerForContextMenu(View)
22669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param view The view that should stop showing a context menu.
22679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
22689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void unregisterForContextMenu(View view) {
22699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        view.setOnCreateContextMenuListener(null);
22709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
22739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Programmatically opens the context menu for a particular {@code view}.
22749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The {@code view} should have been added via
22759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #registerForContextMenu(View)}.
22769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
22779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param view The view to show the context menu for.
22789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
22799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void openContextMenu(View view) {
22809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        view.showContextMenu();
22819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
22849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Programmatically closes the most recently opened context menu, if showing.
22859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
22869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void closeContextMenu() {
22879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindow.closePanel(Window.FEATURE_CONTEXT_MENU);
22889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
22919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This hook is called whenever an item in a context menu is selected. The
22929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * default implementation simply returns false to have the normal processing
22939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * happen (calling the item's Runnable or sending a message to its Handler
22949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * as appropriate). You can use this method for any items for which you
22959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * would like to do processing without those other facilities.
22969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
22979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use {@link MenuItem#getMenuInfo()} to get extra information set by the
22989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * View that added this menu item.
22999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
23009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Derived classes should call through to the base class for it to perform
23019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the default menu handling.
23029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param item The context menu item that was selected.
23049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return boolean Return false to allow normal context menu processing to
23059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         proceed, true to consume it here.
23069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
23079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onContextItemSelected(MenuItem item) {
23089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent != null) {
23099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mParent.onContextItemSelected(item);
23109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
23129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
23159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This hook is called whenever the context menu is being closed (either by
23169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the user canceling the menu with the back/menu button, or when an item is
23179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * selected).
23189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param menu The context menu that is being closed.
23209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
23219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onContextMenuClosed(Menu menu) {
23229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent != null) {
23239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParent.onContextMenuClosed(menu);
23249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
23289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Callback for creating dialogs that are managed (saved and restored) for you
23299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * by the activity.
23309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If you use {@link #showDialog(int)}, the activity will call through to
23329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this method the first time, and hang onto it thereafter.  Any dialog
23339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that is created by this method will automatically be saved and restored
23349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for you, including whether it is showing.
23359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If you would like the activity to manage the saving and restoring dialogs
23379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for you, you should override this method and handle any ids that are
23389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * passed to {@link #showDialog}.
23399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If you would like an opportunity to prepare your dialog before it is shown,
23419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * override {@link #onPrepareDialog(int, Dialog)}.
23429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param id The id of the dialog.
23449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The dialog
23459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPrepareDialog(int, Dialog)
23479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #showDialog(int)
23489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #dismissDialog(int)
23499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #removeDialog(int)
23509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
23519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected Dialog onCreateDialog(int id) {
23529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
23539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
23569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Provides an opportunity to prepare a managed dialog before it is being
23579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * shown.
23589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
23599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Override this if you need to update a managed dialog based on the state
23609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of the application each time it is shown. For example, a time picker
23619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * dialog might want to be updated with the current time. You should call
23629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * through to the superclass's implementation. The default implementation
23639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will set this Activity as the owner activity on the Dialog.
23649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param id The id of the managed dialog.
23669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param dialog The dialog.
23679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onCreateDialog(int)
23689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #showDialog(int)
23699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #dismissDialog(int)
23709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #removeDialog(int)
23719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
23729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onPrepareDialog(int id, Dialog dialog) {
23739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dialog.setOwnerActivity(this);
23749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
23779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Show a dialog managed by this activity.  A call to {@link #onCreateDialog(int)}
23789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will be made with the same id the first time this is called for a given
23799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * id.  From thereafter, the dialog will be automatically saved and restored.
23809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Each time a dialog is shown, {@link #onPrepareDialog(int, Dialog)} will
23829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be made to provide an opportunity to do any timely preparation.
23839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param id The id of the managed dialog.
23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onCreateDialog(int)
23879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPrepareDialog(int, Dialog)
23889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #dismissDialog(int)
23899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #removeDialog(int)
23909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
23919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void showDialog(int id) {
23929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mManagedDialogs == null) {
23939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mManagedDialogs = new SparseArray<Dialog>();
23949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Dialog dialog = mManagedDialogs.get(id);
23969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (dialog == null) {
23979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dialog = onCreateDialog(id);
23989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (dialog == null) {
23999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new IllegalArgumentException("Activity#onCreateDialog did "
24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + "not create a dialog for id " + id);
24019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dialog.dispatchOnCreate(null);
24039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mManagedDialogs.put(id, dialog);
24049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onPrepareDialog(id, dialog);
24079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dialog.show();
24089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
24119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Dismiss a dialog that was previously shown via {@link #showDialog(int)}.
24129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
24139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param id The id of the managed dialog.
24149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
24159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalArgumentException if the id was not previously shown via
24169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *   {@link #showDialog(int)}.
24179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
24189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onCreateDialog(int)
24199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPrepareDialog(int, Dialog)
24209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #showDialog(int)
24219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #removeDialog(int)
24229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
24239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void dismissDialog(int id) {
24249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mManagedDialogs == null) {
24259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw missingDialog(id);
24269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Dialog dialog = mManagedDialogs.get(id);
24299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (dialog == null) {
24309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw missingDialog(id);
24319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dialog.dismiss();
24339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
24369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Creates an exception to throw if a user passed in a dialog id that is
24379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * unexpected.
24389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
24399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IllegalArgumentException missingDialog(int id) {
24409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new IllegalArgumentException("no dialog with id " + id + " was ever "
24419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + "shown via Activity#showDialog");
24429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
24459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Removes any internal references to a dialog managed by this Activity.
24469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If the dialog is showing, it will dismiss it as part of the clean up.
24479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
24489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This can be useful if you know that you will never show a dialog again and
24499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * want to avoid the overhead of saving and restoring it in the future.
24509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
24519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param id The id of the managed dialog.
24529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
24539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onCreateDialog(int)
24549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onPrepareDialog(int, Dialog)
24559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #showDialog(int)
24569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #dismissDialog(int)
24579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
24589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void removeDialog(int id) {
24599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mManagedDialogs == null) {
24619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
24629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Dialog dialog = mManagedDialogs.get(id);
24659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (dialog == null) {
24669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
24679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dialog.dismiss();
24709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mManagedDialogs.remove(id);
24719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
24749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This hook is called when the user signals the desire to start a search.
24759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
24769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>You can use this function as a simple way to launch the search UI, in response to a
24779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * menu item, search button, or other widgets within your activity.  Unless overidden,
24789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * calling this function is the same as calling:
24799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The default implementation simply calls
24809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #startSearch startSearch(null, false, null, false)}, launching a local search.
24819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
24829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>You can override this function to force global search, e.g. in response to a dedicated
24839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * search key, or to block search entirely (by simply returning false).
24849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
24859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns true if search launched, false if activity blocks it
24869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
24879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.app.SearchManager
24889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
24899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onSearchRequested() {
24909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        startSearch(null, false, null, false);
24919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
24929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
24959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This hook is called to launch the search UI.
24969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
24979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>It is typically called from onSearchRequested(), either directly from
24989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Activity.onSearchRequested() or from an overridden version in any given
24999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Activity.  If your goal is simply to activate search, it is preferred to call
25009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * onSearchRequested(), which may have been overriden elsewhere in your Activity.  If your goal
25019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is to inject specific data such as context data, it is preferred to <i>override</i>
25029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * onSearchRequested(), so that any callers to it will benefit from the override.
25039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
25049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param initialQuery Any non-null non-empty string will be inserted as
25059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * pre-entered text in the search query box.
25069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param selectInitialQuery If true, the intial query will be preselected, which means that
25079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * any further typing will replace it.  This is useful for cases where an entire pre-formed
25089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * query is being inserted.  If false, the selection point will be placed at the end of the
25099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * inserted query.  This is useful when the inserted query is text that the user entered,
25109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and the user would expect to be able to keep typing.  <i>This parameter is only meaningful
25119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if initialQuery is a non-empty string.</i>
25129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param appSearchData An application can insert application-specific
25139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * context here, in order to improve quality or specificity of its own
25149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * searches.  This data will be returned with SEARCH intent(s).  Null if
25159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * no extra data is required.
25169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param globalSearch If false, this will only launch the search that has been specifically
25179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * defined by the application (which is usually defined as a local search).  If no default
25189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * search is defined in the current application or activity, no search will be launched.
25199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If true, this will always launch a platform-global (e.g. web-based) search instead.
25209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
25219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.app.SearchManager
25229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onSearchRequested
25239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
25249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startSearch(String initialQuery, boolean selectInitialQuery,
25259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Bundle appSearchData, boolean globalSearch) {
25269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // activate the search manager and start it up!
25279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SearchManager searchManager = (SearchManager)
25289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        getSystemService(Context.SEARCH_SERVICE);
25299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        searchManager.startSearch(initialQuery, selectInitialQuery, getComponentName(),
25309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        appSearchData, globalSearch);
25319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
25349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Request that key events come to this activity. Use this if your
25359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity has no views with focus, but the activity still wants
25369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a chance to process key events.
25379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
25389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.view.Window#takeKeyEvents
25399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
25409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void takeKeyEvents(boolean get) {
25419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().takeKeyEvents(get);
25429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
25459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Enable extended window features.  This is a convenience for calling
25469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window#requestFeature getWindow().requestFeature()}.
25479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
25489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param featureId The desired feature as defined in
25499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                  {@link android.view.Window}.
25509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns true if the requested feature is supported and now
25519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         enabled.
25529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
25539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.view.Window#requestFeature
25549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
25559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean requestWindowFeature(int featureId) {
25569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getWindow().requestFeature(featureId);
25579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
25609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Convenience for calling
25619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window#setFeatureDrawableResource}.
25629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
25639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setFeatureDrawableResource(int featureId, int resId) {
25649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setFeatureDrawableResource(featureId, resId);
25659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
25689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Convenience for calling
25699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window#setFeatureDrawableUri}.
25709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
25719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setFeatureDrawableUri(int featureId, Uri uri) {
25729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setFeatureDrawableUri(featureId, uri);
25739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
25769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Convenience for calling
25779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window#setFeatureDrawable(int, Drawable)}.
25789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
25799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setFeatureDrawable(int featureId, Drawable drawable) {
25809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setFeatureDrawable(featureId, drawable);
25819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
25849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Convenience for calling
25859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window#setFeatureDrawableAlpha}.
25869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
25879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setFeatureDrawableAlpha(int featureId, int alpha) {
25889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setFeatureDrawableAlpha(featureId, alpha);
25899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
25929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Convenience for calling
25939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.Window#getLayoutInflater}.
25949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
25959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public LayoutInflater getLayoutInflater() {
25969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getWindow().getLayoutInflater();
25979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
26009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns a {@link MenuInflater} with this context.
26019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
26029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public MenuInflater getMenuInflater() {
26039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new MenuInflater(this);
26049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
26079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onApplyThemeResource(Resources.Theme theme,
26089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                      int resid,
26099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                      boolean first)
26109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
26119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent == null) {
26129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super.onApplyThemeResource(theme, resid, first);
26139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
26149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
26159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                theme.setTo(mParent.getTheme());
26169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (Exception e) {
26179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Empty
26189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            theme.applyStyle(resid, false);
26209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
26249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Launch an activity for which you would like a result when it finished.
26259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * When this activity exits, your
26269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * onActivityResult() method will be called with the given requestCode.
26279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Using a negative requestCode is the same as calling
26289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #startActivity} (the activity is not launched as a sub-activity).
26299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note that this method should only be used with Intent protocols
26319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that are defined to return a result.  In other protocols (such as
26329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link Intent#ACTION_MAIN} or {@link Intent#ACTION_VIEW}), you may
26339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not get the result when you expect.  For example, if the activity you
26349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * are launching uses the singleTask launch mode, it will not run in your
26359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * task and thus you will immediately receive a cancel result.
26369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>As a special case, if you call startActivityForResult() with a requestCode
26389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * >= 0 during the initial onCreate(Bundle savedInstanceState)/onResume() of your
26399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity, then your window will not be displayed until a result is
26409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returned back from the started activity.  This is to avoid visible
26419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * flickering when redirecting to another activity.
26429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This method throws {@link android.content.ActivityNotFoundException}
26449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if there was no Activity found to run the given Intent.
26459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param intent The intent to start.
26479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param requestCode If >= 0, this code will be returned in
26489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                    onActivityResult() when the activity exits.
26499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws android.content.ActivityNotFoundException
26519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startActivity
26539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
26549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startActivityForResult(Intent intent, int requestCode) {
26559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent == null) {
26569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Instrumentation.ActivityResult ar =
26579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mInstrumentation.execStartActivity(
26589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    this, mMainThread.getApplicationThread(), mToken, this,
26599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    intent, requestCode);
26609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ar != null) {
26619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.sendActivityResult(
26629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mToken, mEmbeddedID, requestCode, ar.getResultCode(),
26639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ar.getResultData());
26649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (requestCode >= 0) {
26669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If this start is requesting a result, we can avoid making
26679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // the activity visible until the result is received.  Setting
26689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // this code during onCreate(Bundle savedInstanceState) or onResume() will keep the
26699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // activity hidden during this time, to avoid flickering.
26709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // This can only be done when a result is requested because
26719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // that guarantees we will get information back when the
26729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // activity is finished, no matter what happens to it.
26739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mStartedActivity = true;
26749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
26769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParent.startActivityFromChild(this, intent, requestCode);
26779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
26819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Launch a new activity.  You will not receive any information about when
26829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the activity exits.  This implementation overrides the base version,
26839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * providing information about
26849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the activity performing the launch.  Because of this additional
26859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * information, the {@link Intent#FLAG_ACTIVITY_NEW_TASK} launch flag is not
26869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * required; if not specified, the new activity will be added to the
26879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * task of the caller.
26889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This method throws {@link android.content.ActivityNotFoundException}
26909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if there was no Activity found to run the given Intent.
26919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param intent The intent to start.
26939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws android.content.ActivityNotFoundException
26959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startActivityForResult
26979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
26989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
26999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startActivity(Intent intent) {
27009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        startActivityForResult(intent, -1);
27019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
27049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A special variation to launch an activity only if a new activity
27059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * instance is needed to handle the given Intent.  In other words, this is
27069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * just like {@link #startActivityForResult(Intent, int)} except: if you are
27079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * using the {@link Intent#FLAG_ACTIVITY_SINGLE_TOP} flag, or
27089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * singleTask or singleTop
27099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.R.styleable#AndroidManifestActivity_launchMode launchMode},
27109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and the activity
27119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that handles <var>intent</var> is the same as your currently running
27129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity, then a new instance is not needed.  In this case, instead of
27139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the normal behavior of calling {@link #onNewIntent} this function will
27149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * return and you can handle the Intent yourself.
27159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
27169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This function can only be called from a top-level activity; if it is
27179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * called from a child activity, a runtime exception will be thrown.
27189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
27199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param intent The intent to start.
27209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param requestCode If >= 0, this code will be returned in
27219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         onActivityResult() when the activity exits, as described in
27229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         {@link #startActivityForResult}.
27239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
27249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return If a new activity was launched then true is returned; otherwise
27259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         false is returned and you must handle the Intent yourself.
27269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
27279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startActivity
27289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startActivityForResult
27299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
27309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean startActivityIfNeeded(Intent intent, int requestCode) {
27319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent == null) {
27329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int result = IActivityManager.START_RETURN_INTENT_TO_CALLER;
27339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
27349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                result = ActivityManagerNative.getDefault()
27359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    .startActivity(mMainThread.getApplicationThread(),
27369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            intent, intent.resolveTypeIfNeeded(
27379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    getContentResolver()),
27389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            null, 0,
27399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mToken, mEmbeddedID, requestCode, true, false);
27409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
27419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Empty
27429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Instrumentation.checkStartActivityResult(result, intent);
27459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (requestCode >= 0) {
27479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If this start is requesting a result, we can avoid making
27489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // the activity visible until the result is received.  Setting
27499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // this code during onCreate(Bundle savedInstanceState) or onResume() will keep the
27509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // activity hidden during this time, to avoid flickering.
27519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // This can only be done when a result is requested because
27529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // that guarantees we will get information back when the
27539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // activity is finished, no matter what happens to it.
27549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mStartedActivity = true;
27559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return result != IActivityManager.START_RETURN_INTENT_TO_CALLER;
27579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new UnsupportedOperationException(
27609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "startActivityIfNeeded can only be called from a top-level activity");
27619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
27649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Special version of starting an activity, for use when you are replacing
27659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * other activity components.  You can use this to hand the Intent off
27669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to the next Activity that can handle it.  You typically call this in
27679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onCreate} with the Intent returned by {@link #getIntent}.
27689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
27699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param intent The intent to dispatch to the next activity.  For
27709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * correct behavior, this must be the same as the Intent that started
27719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * your own activity; the only changes you can make are to the extras
27729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * inside of it.
27739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
27749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns a boolean indicating whether there was another Activity
27759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to start: true if there was a next activity to start, false if there
27769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * wasn't.  In general, if true is returned you will then want to call
27779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * finish() on yourself.
27789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
27799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean startNextMatchingActivity(Intent intent) {
27809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent == null) {
27819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
27829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return ActivityManagerNative.getDefault()
27839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    .startNextMatchingActivity(mToken, intent);
27849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
27859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Empty
27869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
27889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new UnsupportedOperationException(
27919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "startNextMatchingActivity can only be called from a top-level activity");
27929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
27959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is called when a child activity of this one calls its
27969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #startActivity} or {@link #startActivityForResult} method.
27979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
27989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This method throws {@link android.content.ActivityNotFoundException}
27999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if there was no Activity found to run the given Intent.
28009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param child The activity making the call.
28029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param intent The intent to start.
28039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param requestCode Reply request code.  < 0 if reply is not requested.
28049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws android.content.ActivityNotFoundException
28069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startActivity
28089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startActivityForResult
28099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
28109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startActivityFromChild(Activity child, Intent intent,
28119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int requestCode) {
28129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Instrumentation.ActivityResult ar =
28139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mInstrumentation.execStartActivity(
28149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                this, mMainThread.getApplicationThread(), mToken, child,
28159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                intent, requestCode);
28169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ar != null) {
28179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mMainThread.sendActivityResult(
28189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mToken, child.mEmbeddedID, requestCode,
28199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ar.getResultCode(), ar.getResultData());
28209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
28249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Call this to set the result that your activity will return to its
28259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * caller.
28269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param resultCode The result code to propagate back to the originating
28289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                   activity, often RESULT_CANCELED or RESULT_OK
28299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #RESULT_CANCELED
28319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #RESULT_OK
28329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #RESULT_FIRST_USER
28339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setResult(int, Intent)
28349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
28359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setResult(int resultCode) {
28369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (this) {
28379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mResultCode = resultCode;
28389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mResultData = null;
28399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
28439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Call this to set the result that your activity will return to its
28449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * caller.
28459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param resultCode The result code to propagate back to the originating
28479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                   activity, often RESULT_CANCELED or RESULT_OK
28489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param data The data to propagate back to the originating activity.
28499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #RESULT_CANCELED
28519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #RESULT_OK
28529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #RESULT_FIRST_USER
28539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setResult(int)
28549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
28559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setResult(int resultCode, Intent data) {
28569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (this) {
28579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mResultCode = resultCode;
28589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mResultData = data;
28599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
28639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the name of the package that invoked this activity.  This is who
28649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the data in {@link #setResult setResult()} will be sent to.  You can
28659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * use this information to validate that the recipient is allowed to
28669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * receive the data.
28679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note: if the calling activity is not expecting a result (that is it
28699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * did not use the {@link #startActivityForResult}
28709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * form that includes a request code), then the calling package will be
28719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * null.
28729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The package of the activity that will receive your
28749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         reply, or null if none.
28759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
28769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getCallingPackage() {
28779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
28789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().getCallingPackage(mToken);
28799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
28809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
28819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
28859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the name of the activity that invoked this activity.  This is
28869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * who the data in {@link #setResult setResult()} will be sent to.  You
28879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * can use this information to validate that the recipient is allowed to
28889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * receive the data.
28899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note: if the calling activity is not expecting a result (that is it
28919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * did not use the {@link #startActivityForResult}
28929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * form that includes a request code), then the calling package will be
28939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * null.
28949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return String The full name of the activity that will receive your
28969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         reply, or null if none.
28979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
28989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ComponentName getCallingActivity() {
28999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
29009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().getCallingActivity(mToken);
29019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
29029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
29039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
29079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Control whether this activity's main window is visible.  This is intended
29089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * only for the special case of an activity that is not going to show a
29099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * UI itself, but can't just finish prior to onResume() because it needs
29109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to wait for a service binding or such.  Setting this to false allows
29119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * you to prevent your UI from being shown during that time.
29129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
29139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The default value for this is taken from the
29149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.R.attr#windowNoDisplay} attribute of the activity's theme.
29159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
29169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setVisible(boolean visible) {
29179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mVisibleFromClient != visible) {
29189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mVisibleFromClient = visible;
29199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mVisibleFromServer) {
29209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (visible) makeVisible();
29219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                else mDecor.setVisibility(View.INVISIBLE);
29229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void makeVisible() {
29279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mWindowAdded) {
29289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ViewManager wm = getWindowManager();
29299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wm.addView(mDecor, getWindow().getAttributes());
29309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindowAdded = true;
29319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDecor.setVisibility(View.VISIBLE);
29339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
29369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Check to see whether this activity is in the process of finishing,
29379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * either because you called {@link #finish} on it or someone else
29389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * has requested that it finished.  This is often used in
29399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onPause} to determine whether the activity is simply pausing or
29409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * completely finishing.
29419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
29429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return If the activity is finishing, returns true; else returns false.
29439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
29449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #finish
29459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
29469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isFinishing() {
29479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mFinished;
29489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
29519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Call this when your activity is done and should be closed.  The
29529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ActivityResult is propagated back to whoever launched you via
29539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * onActivityResult().
29549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
29559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void finish() {
29569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent == null) {
29579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int resultCode;
29589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Intent resultData;
29599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (this) {
29609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                resultCode = mResultCode;
29619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                resultData = mResultData;
29629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (Config.LOGV) Log.v(TAG, "Finishing self: token=" + mToken);
29649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
29659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ActivityManagerNative.getDefault()
29669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    .finishActivity(mToken, resultCode, resultData)) {
29679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mFinished = true;
29689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
29699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
29709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Empty
29719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
29739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParent.finishFromChild(this);
29749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
29789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is called when a child activity of this one calls its
29799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #finish} method.  The default implementation simply calls
29809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * finish() on this activity (the parent), finishing the entire group.
29819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
29829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param child The activity making the call.
29839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
29849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #finish
29859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
29869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void finishFromChild(Activity child) {
29879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        finish();
29889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
29919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Force finish another activity that you had previously started with
29929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #startActivityForResult}.
29939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
29949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param requestCode The request code of the activity that you had
29959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                    given to startActivityForResult().  If there are multiple
29969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                    activities started with this request code, they
29979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                    will all be finished.
29989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
29999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void finishActivity(int requestCode) {
30009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent == null) {
30019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
30029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityManagerNative.getDefault()
30039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    .finishSubActivity(mToken, mEmbeddedID, requestCode);
30049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
30059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Empty
30069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
30079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
30089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParent.finishActivityFromChild(this, requestCode);
30099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
30139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is called when a child activity of this one calls its
30149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * finishActivity().
30159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
30169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param child The activity making the call.
30179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param requestCode Request code that had been used to start the
30189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                    activity.
30199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
30209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void finishActivityFromChild(Activity child, int requestCode) {
30219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
30229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault()
30239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                .finishSubActivity(mToken, child.mEmbeddedID, requestCode);
30249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
30259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Empty
30269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
30309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when an activity you launched exits, giving you the requestCode
30319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * you started it with, the resultCode it returned, and any additional
30329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * data from it.  The <var>resultCode</var> will be
30339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #RESULT_CANCELED} if the activity explicitly returned that,
30349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * didn't return any result, or crashed during its operation.
30359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
30369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>You will receive this call immediately before onResume() when your
30379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity is re-starting.
30389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
30399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param requestCode The integer request code originally supplied to
30409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                    startActivityForResult(), allowing you to identify who this
30419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                    result came from.
30429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param resultCode The integer result code returned by the child activity
30439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                   through its setResult().
30449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param data An Intent, which can return result data to the caller
30459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *               (various data can be attached to Intent "extras").
30469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
30479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startActivityForResult
30489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #createPendingResult
30499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setResult(int)
30509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
30519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onActivityResult(int requestCode, int resultCode,
30529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Intent data) {
30539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
30569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new PendingIntent object which you can hand to others
30579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for them to use to send result data back to your
30589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onActivityResult} callback.  The created object will be either
30599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * one-shot (becoming invalid after a result is sent back) or multiple
30609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * (allowing any number of results to be sent through it).
30619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
30629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param requestCode Private request code for the sender that will be
30639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * associated with the result data when it is returned.  The sender can not
30649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * modify this value, allowing you to identify incoming results.
30659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param data Default data to supply in the result, which may be modified
30669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * by the sender.
30679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param flags May be {@link PendingIntent#FLAG_ONE_SHOT PendingIntent.FLAG_ONE_SHOT},
30689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link PendingIntent#FLAG_NO_CREATE PendingIntent.FLAG_NO_CREATE},
30699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link PendingIntent#FLAG_CANCEL_CURRENT PendingIntent.FLAG_CANCEL_CURRENT},
30709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link PendingIntent#FLAG_UPDATE_CURRENT PendingIntent.FLAG_UPDATE_CURRENT},
30719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * or any of the flags as supported by
30729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link Intent#fillIn Intent.fillIn()} to control which unspecified parts
30739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of the intent that can be supplied when the actual send happens.
30749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
30759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns an existing or new PendingIntent matching the given
30769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * parameters.  May return null only if
30779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link PendingIntent#FLAG_NO_CREATE PendingIntent.FLAG_NO_CREATE} has been
30789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * supplied.
30799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
30809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see PendingIntent
30819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
30829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public PendingIntent createPendingResult(int requestCode, Intent data,
30839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int flags) {
30849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String packageName = getPackageName();
30859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
30869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IIntentSender target =
30879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityManagerNative.getDefault().getIntentSender(
30889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        IActivityManager.INTENT_SENDER_ACTIVITY_RESULT, packageName,
30899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mParent == null ? mToken : mParent.mToken,
30909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mEmbeddedID, requestCode, data, null, flags);
30919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return target != null ? new PendingIntent(target) : null;
30929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
30939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Empty
30949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
30969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
30999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Change the desired orientation of this activity.  If the activity
31009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is currently in the foreground or otherwise impacting the screen
31019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * orientation, the screen will immediately be changed (possibly causing
31029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the activity to be restarted). Otherwise, this will be used the next
31039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * time the activity is visible.
31049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
31059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param requestedOrientation An orientation constant as used in
31069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link ActivityInfo#screenOrientation ActivityInfo.screenOrientation}.
31079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
31089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setRequestedOrientation(int requestedOrientation) {
31099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent == null) {
31109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
31119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityManagerNative.getDefault().setRequestedOrientation(
31129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mToken, requestedOrientation);
31139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
31149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Empty
31159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
31179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParent.setRequestedOrientation(requestedOrientation);
31189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
31229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the current requested orientation of the activity.  This will
31239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * either be the orientation requested in its component's manifest, or
31249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the last requested orientation given to
31259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setRequestedOrientation(int)}.
31269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
31279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns an orientation constant as used in
31289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link ActivityInfo#screenOrientation ActivityInfo.screenOrientation}.
31299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
31309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getRequestedOrientation() {
31319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent == null) {
31329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
31339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return ActivityManagerNative.getDefault()
31349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        .getRequestedOrientation(mToken);
31359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
31369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Empty
31379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
31399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mParent.getRequestedOrientation();
31409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
31429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
31459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the identifier of the task this activity is in.  This identifier
31469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will remain the same for the lifetime of the activity.
31479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
31489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Task identifier, an opaque integer.
31499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
31509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getTaskId() {
31519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
31529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault()
31539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                .getTaskForActivity(mToken, false);
31549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
31559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return -1;
31569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
31609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return whether this activity is the root of a task.  The root is the
31619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * first activity in a task.
31629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
31639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if this is the root activity, else false.
31649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
31659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isTaskRoot() {
31669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
31679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault()
31689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                .getTaskForActivity(mToken, true) >= 0;
31699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
31709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
31719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
31759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Move the task containing this activity to the back of the activity
31769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * stack.  The activity's order within the task is unchanged.
31779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
31789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param nonRoot If false then this only works if the activity is the root
31799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                of a task; if true it will work for any activity in
31809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                a task.
31819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
31829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return If the task was moved (or it was already at the
31839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         back) true is returned, else false.
31849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
31859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean moveTaskToBack(boolean nonRoot) {
31869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
31879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().moveActivityTaskToBack(
31889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mToken, nonRoot);
31899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
31909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Empty
31919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
31939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
31969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns class name for this activity with the package prefix removed.
31979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is the default name used to read and write settings.
31989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
31999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The local class name.
32009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
32019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getLocalClassName() {
32029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String pkg = getPackageName();
32039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String cls = mComponent.getClassName();
32049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int packageLen = pkg.length();
32059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!cls.startsWith(pkg) || cls.length() <= packageLen
32069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                || cls.charAt(packageLen) != '.') {
32079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return cls;
32089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return cls.substring(packageLen+1);
32109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
32139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns complete component name of this activity.
32149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
32159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the complete component name for this activity
32169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
32179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ComponentName getComponentName()
32189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
32199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mComponent;
32209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
32239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve a {@link SharedPreferences} object for accessing preferences
32249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that are private to this activity.  This simply calls the underlying
32259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getSharedPreferences(String, int)} method by passing in this activity's
32269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * class name as the preferences name.
32279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
32289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param mode Operating mode.  Use {@link #MODE_PRIVATE} for the default
32299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             operation, {@link #MODE_WORLD_READABLE} and
32309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             {@link #MODE_WORLD_WRITEABLE} to control permissions.
32319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
32329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the single SharedPreferences instance that can be used
32339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         to retrieve and modify the preference values.
32349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
32359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public SharedPreferences getPreferences(int mode) {
32369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getSharedPreferences(getLocalClassName(), mode);
32379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
32409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Object getSystemService(String name) {
32419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (getBaseContext() == null) {
32429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalStateException(
32439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "System services not available to Activities before onCreate()");
32449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (WINDOW_SERVICE.equals(name)) {
32479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mWindowManager;
32489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return super.getSystemService(name);
32509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
32539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Change the title associated with this activity.  If this is a
32549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * top-level activity, the title for its window will change.  If it
32559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is an embedded activity, the parent can do whatever it wants
32569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * with it.
32579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
32589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setTitle(CharSequence title) {
32599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTitle = title;
32609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onTitleChanged(title, mTitleColor);
32619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent != null) {
32639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParent.onChildTitleChanged(this, title);
32649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
32689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Change the title associated with this activity.  If this is a
32699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * top-level activity, the title for its window will change.  If it
32709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is an embedded activity, the parent can do whatever it wants
32719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * with it.
32729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
32739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setTitle(int titleId) {
32749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setTitle(getText(titleId));
32759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setTitleColor(int textColor) {
32789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTitleColor = textColor;
32799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onTitleChanged(mTitle, textColor);
32809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final CharSequence getTitle() {
32839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mTitle;
32849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getTitleColor() {
32879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mTitleColor;
32889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onTitleChanged(CharSequence title, int color) {
32919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mTitleReady) {
32929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final Window win = getWindow();
32939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win != null) {
32949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.setTitle(title);
32959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (color != 0) {
32969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.setTitleColor(color);
32979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
32989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
32999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
33009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
33019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onChildTitleChanged(Activity childActivity, CharSequence title) {
33039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
33049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
33069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the visibility of the progress bar in the title.
33079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
33089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * In order for the progress bar to be shown, the feature must be requested
33099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * via {@link #requestWindowFeature(int)}.
33109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
33119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param visible Whether to show the progress bars in the title.
33129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
33139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setProgressBarVisibility(boolean visible) {
33149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setFeatureInt(Window.FEATURE_PROGRESS, visible ? Window.PROGRESS_VISIBILITY_ON :
33159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Window.PROGRESS_VISIBILITY_OFF);
33169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
33179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
33199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the visibility of the indeterminate progress bar in the title.
33209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
33219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * In order for the progress bar to be shown, the feature must be requested
33229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * via {@link #requestWindowFeature(int)}.
33239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
33249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param visible Whether to show the progress bars in the title.
33259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
33269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setProgressBarIndeterminateVisibility(boolean visible) {
33279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setFeatureInt(Window.FEATURE_INDETERMINATE_PROGRESS,
33289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                visible ? Window.PROGRESS_VISIBILITY_ON : Window.PROGRESS_VISIBILITY_OFF);
33299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
33309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
33329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets whether the horizontal progress bar in the title should be indeterminate (the circular
33339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is always indeterminate).
33349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
33359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * In order for the progress bar to be shown, the feature must be requested
33369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * via {@link #requestWindowFeature(int)}.
33379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
33389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param indeterminate Whether the horizontal progress bar should be indeterminate.
33399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
33409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setProgressBarIndeterminate(boolean indeterminate) {
33419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setFeatureInt(Window.FEATURE_PROGRESS,
33429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                indeterminate ? Window.PROGRESS_INDETERMINATE_ON : Window.PROGRESS_INDETERMINATE_OFF);
33439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
33449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
33469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the progress for the progress bars in the title.
33479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
33489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * In order for the progress bar to be shown, the feature must be requested
33499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * via {@link #requestWindowFeature(int)}.
33509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
33519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param progress The progress for the progress bar. Valid ranges are from
33529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            0 to 10000 (both inclusive). If 10000 is given, the progress
33539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            bar will be completely filled and will fade out.
33549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
33559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setProgress(int progress) {
33569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setFeatureInt(Window.FEATURE_PROGRESS, progress + Window.PROGRESS_START);
33579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
33589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
33609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the secondary progress for the progress bar in the title. This
33619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * progress is drawn between the primary progress (set via
33629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setProgress(int)} and the background. It can be ideal for media
33639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * scenarios such as showing the buffering progress while the default
33649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * progress shows the play progress.
33659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
33669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * In order for the progress bar to be shown, the feature must be requested
33679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * via {@link #requestWindowFeature(int)}.
33689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
33699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param secondaryProgress The secondary progress for the progress bar. Valid ranges are from
33709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            0 to 10000 (both inclusive).
33719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
33729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setSecondaryProgress(int secondaryProgress) {
33739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setFeatureInt(Window.FEATURE_PROGRESS,
33749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                secondaryProgress + Window.PROGRESS_SECONDARY_START);
33759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
33769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
33789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Suggests an audio stream whose volume should be changed by the hardware
33799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * volume controls.
33809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
33819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The suggested audio stream will be tied to the window of this Activity.
33829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If the Activity is switched, the stream set here is no longer the
33839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * suggested stream. The client does not need to save and restore the old
33849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * suggested stream value in onPause and onResume.
33859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
33869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param streamType The type of the audio stream whose volume should be
33879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        changed by the hardware volume controls. It is not guaranteed that
33889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        the hardware volume controls will always change this stream's
33899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        volume (for example, if a call is in progress, its stream's volume
33909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        may be changed instead). To reset back to the default, use
33919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        {@link AudioManager#USE_DEFAULT_STREAM_TYPE}.
33929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
33939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setVolumeControlStream(int streamType) {
33949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setVolumeControlStream(streamType);
33959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
33969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
33989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the suggested audio stream whose volume should be changed by the
33999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * harwdare volume controls.
34009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
34019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The suggested audio stream type whose volume should be changed by
34029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         the hardware volume controls.
34039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setVolumeControlStream(int)
34049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
34059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getVolumeControlStream() {
34069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getWindow().getVolumeControlStream();
34079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
34089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
34109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Runs the specified action on the UI thread. If the current thread is the UI
34119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thread, then the action is executed immediately. If the current thread is
34129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not the UI thread, the action is posted to the event queue of the UI thread.
34139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
34149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param action the action to run on the UI thread
34159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
34169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void runOnUiThread(Runnable action) {
34179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (Thread.currentThread() != mUiThread) {
34189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mHandler.post(action);
34199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
34209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            action.run();
34219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
34239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
34259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Stub implementation of {@link android.view.LayoutInflater.Factory#onCreateView} used when
34269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * inflating with the LayoutInflater returned by {@link #getSystemService}.  This
34279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation simply returns null for all view names.
34289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
34299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.view.LayoutInflater#createView
34309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.view.Window#getLayoutInflater
34319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
34329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public View onCreateView(String name, Context context, AttributeSet attrs) {
34339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
34349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
34359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ------------------ Internal API ------------------
34379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void setParent(Activity parent) {
34399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mParent = parent;
34409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
34419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void attach(Context context, ActivityThread aThread, Instrumentation instr, IBinder token,
34439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Application application, Intent intent, ActivityInfo info, CharSequence title,
34449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Activity parent, String id, Object lastNonConfigurationInstance,
34459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Configuration config) {
34469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        attach(context, aThread, instr, token, application, intent, info, title, parent, id,
34479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            lastNonConfigurationInstance, null, config);
34489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
34499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void attach(Context context, ActivityThread aThread, Instrumentation instr, IBinder token,
34519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Application application, Intent intent, ActivityInfo info, CharSequence title,
34529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Activity parent, String id, Object lastNonConfigurationInstance,
34539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        HashMap<String,Object> lastNonConfigurationChildInstances, Configuration config) {
34549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        attachBaseContext(context);
34559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindow = PolicyManager.makeNewWindow(this);
34579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindow.setCallback(this);
34589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (info.softInputMode != WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED) {
34599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindow.setSoftInputMode(info.softInputMode);
34609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUiThread = Thread.currentThread();
34629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread = aThread;
34649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mInstrumentation = instr;
34659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mToken = token;
34669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mApplication = application;
34679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mIntent = intent;
34689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mComponent = intent.getComponent();
34699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mActivityInfo = info;
34709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTitle = title;
34719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mParent = parent;
34729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEmbeddedID = id;
34739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLastNonConfigurationInstance = lastNonConfigurationInstance;
34749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLastNonConfigurationChildInstances = lastNonConfigurationChildInstances;
34759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindow.setWindowManager(null, mToken, mComponent.flattenToString());
34779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent != null) {
34789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindow.setContainer(mParent.getWindow());
34799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindowManager = mWindow.getWindowManager();
34819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCurrentConfig = config;
34829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
34839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final IBinder getActivityToken() {
34859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mParent != null ? mParent.getActivityToken() : mToken;
34869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
34879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performStart() {
34899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = false;
34909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mInstrumentation.callActivityOnStart(this);
34919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mCalled) {
34929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SuperNotCalledException(
34939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "Activity " + mComponent.toShortString() +
34949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                " did not call through to super.onStart()");
34959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
34979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performRestart() {
34999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int N = mManagedCursors.size();
35009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<N; i++) {
35019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ManagedCursor mc = mManagedCursors.get(i);
35029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mc.mReleased || mc.mUpdated) {
35039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mc.mCursor.requery();
35049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mc.mReleased = false;
35059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mc.mUpdated = false;
35069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
35089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mStopped) {
35109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStopped = false;
35119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCalled = false;
35129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mInstrumentation.callActivityOnRestart(this);
35139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mCalled) {
35149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new SuperNotCalledException(
35159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "Activity " + mComponent.toShortString() +
35169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    " did not call through to super.onRestart()");
35179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            performStart();
35199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
35209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
35219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performResume() {
35239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        performRestart();
35249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLastNonConfigurationInstance = null;
35269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // First call onResume() -before- setting mResumed, so we don't
35289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // send out any status bar / menu notifications the client makes.
35299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = false;
35309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mInstrumentation.callActivityOnResume(this);
35319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mCalled) {
35329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SuperNotCalledException(
35339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "Activity " + mComponent.toShortString() +
35349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                " did not call through to super.onResume()");
35359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
35369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Now really resume, and install the current status bar and menu.
35389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mResumed = true;
35399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalled = false;
35409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onPostResume();
35419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mCalled) {
35429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SuperNotCalledException(
35439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "Activity " + mComponent.toShortString() +
35449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                " did not call through to super.onPostResume()");
35459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
35469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
35479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performPause() {
35499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onPause();
35509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
35519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performUserLeaving() {
35539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onUserInteraction();
35549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onUserLeaveHint();
35559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
35569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performStop() {
35589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mStopped) {
35599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mWindow != null) {
35609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWindow.closeAllPanels();
35619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCalled = false;
35649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mInstrumentation.callActivityOnStop(this);
35659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mCalled) {
35669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new SuperNotCalledException(
35679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "Activity " + mComponent.toShortString() +
35689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    " did not call through to super.onStop()");
35699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = mManagedCursors.size();
35729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=0; i<N; i++) {
35739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ManagedCursor mc = mManagedCursors.get(i);
35749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!mc.mReleased) {
35759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mc.mCursor.deactivate();
35769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mc.mReleased = true;
35779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
35789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStopped = true;
35819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
35829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mResumed = false;
35839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
35849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final boolean isResumed() {
35869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mResumed;
35879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
35889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void dispatchActivityResult(String who, int requestCode,
35909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int resultCode, Intent data) {
35919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (Config.LOGV) Log.v(
35929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            TAG, "Dispatching result: who=" + who + ", reqCode=" + requestCode
35939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            + ", resCode=" + resultCode + ", data=" + data);
35949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (who == null) {
35959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            onActivityResult(requestCode, resultCode, data);
35969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
35979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
35989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3599