ActivityManager.java revision fb1c86439c7991237594760a957e7eba1d86df52
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 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.Manifest;
209b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Liimport android.annotation.IntDef;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.annotation.NonNull;
229b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Liimport android.annotation.Nullable;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.annotation.RequiresPermission;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.annotation.SystemApi;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Canvas;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Matrix;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Point;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.BatteryStats;
29a696f5d667227365da732481770767dcb330dd23Mathias Agopianimport android.os.IBinder;
30fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennisimport android.os.ParcelFileDescriptor;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.app.ProcessStats;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.os.TransferPipe;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.util.FastPrintWriter;
36bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
37bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnorimport android.content.ComponentName;
38bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnorimport android.content.Context;
39df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Mainimport android.content.Intent;
40bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnorimport android.content.UriPermission;
417478ea6848c0059e65a4089b4ec2ff4158520870Wu-cheng Liimport android.content.pm.ApplicationInfo;
42df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Mainimport android.content.pm.ConfigurationInfo;
43df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Mainimport android.content.pm.IPackageDataObserver;
44bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnorimport android.content.pm.PackageManager;
457478ea6848c0059e65a4089b4ec2ff4158520870Wu-cheng Liimport android.content.pm.ParceledListSlice;
46df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Mainimport android.content.pm.UserInfo;
47df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Mainimport android.content.res.Resources;
48df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Mainimport android.graphics.Bitmap;
49df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Mainimport android.graphics.Color;
50df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Mainimport android.graphics.Rect;
51bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnorimport android.os.Bundle;
52bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnorimport android.os.Debug;
53bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnorimport android.os.Handler;
54341ff13689dfe822b598e626272ac2e80041b482Dan Egnorimport android.os.Parcel;
55bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnorimport android.os.Parcelable;
56bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnorimport android.os.Process;
57bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnorimport android.os.RemoteException;
58bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnorimport android.os.ServiceManager;
59bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnorimport android.os.SystemProperties;
60bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnorimport android.os.UserHandle;
61bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnorimport android.text.TextUtils;
62bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnorimport android.util.DisplayMetrics;
63bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnorimport android.util.Size;
64bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnorimport android.util.Slog;
65bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
66bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnorimport org.xmlpull.v1.XmlSerializer;
67bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
68bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnorimport java.io.FileDescriptor;
69bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnorimport java.io.FileOutputStream;
70bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnorimport java.io.IOException;
71bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnorimport java.io.PrintWriter;
72bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnorimport java.lang.annotation.Retention;
73bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnorimport java.lang.annotation.RetentionPolicy;
74bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnorimport java.util.ArrayList;
75bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnorimport java.util.List;
76bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
77bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor/**
78bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * Interact with the overall activities running in the system.
79bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor */
80bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnorpublic class ActivityManager {
81bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    private static String TAG = "ActivityManager";
82bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
83bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    private static int gMaxRecentTasks = -1;
84bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
85bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    private final Context mContext;
86bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    private final Handler mHandler;
87bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
88bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /**
89bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     * Defines acceptable types of bugreports.
90bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     * @hide
91bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     */
92bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    @Retention(RetentionPolicy.SOURCE)
93bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    @IntDef({
94bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor            BUGREPORT_OPTION_FULL,
95bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor            BUGREPORT_OPTION_INTERACTIVE,
96bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor            BUGREPORT_OPTION_REMOTE
97bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    })
98bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    public @interface BugreportMode {}
99bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /**
100bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     * Takes a bugreport without user interference (and hence causing less
101bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     * interference to the system), but includes all sections.
102bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     * @hide
103bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     */
104bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    public static final int BUGREPORT_OPTION_FULL = 0;
105bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /**
106341ff13689dfe822b598e626272ac2e80041b482Dan Egnor     * Allows user to monitor progress and enter additional data; might not include all
107bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     * sections.
108bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     * @hide
109df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main     */
110df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main    public static final int BUGREPORT_OPTION_INTERACTIVE = 1;
111df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main    /**
1127478ea6848c0059e65a4089b4ec2ff4158520870Wu-cheng Li     * Takes a bugreport requested remotely by administrator of the Device Owner app,
113df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main     * not the device's user.
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int BUGREPORT_OPTION_REMOTE = 2;
1179b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
118d2c2929c94bec68741b85f4174e11307fb65157fWu-cheng Li    /**
119da83f4674a564007baac03db062a289c8158d940Benny Wong     * <a href="{@docRoot}guide/topics/manifest/meta-data-element.html">{@code
120da83f4674a564007baac03db062a289c8158d940Benny Wong     * <meta-data>}</a> name for a 'home' Activity that declares a package that is to be
121da83f4674a564007baac03db062a289c8158d940Benny Wong     * uninstalled in lieu of the declaring one.  The package named here must be
122da83f4674a564007baac03db062a289c8158d940Benny Wong     * signed with the same certificate as the one declaring the {@code <meta-data>}.
123da83f4674a564007baac03db062a289c8158d940Benny Wong     */
124da83f4674a564007baac03db062a289c8158d940Benny Wong    public static final String META_HOME_ALTERNATE = "android.app.home.alternate";
125da83f4674a564007baac03db062a289c8158d940Benny Wong
126da83f4674a564007baac03db062a289c8158d940Benny Wong    /**
127da83f4674a564007baac03db062a289c8158d940Benny Wong     * Result for IActivityManager.startActivity: trying to start a background user
128da83f4674a564007baac03db062a289c8158d940Benny Wong     * activity that shouldn't be displayed for all users.
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int START_NOT_CURRENT_USER_ACTIVITY = -8;
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Result for IActivityManager.startActivity: trying to start an activity under voice
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * control when that activity does not support the VOICE category.
136e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks     * @hide
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1383f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li    public static final int START_NOT_VOICE_COMPATIBLE = -7;
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14194927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp     * Result for IActivityManager.startActivity: an error where the
1429b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * start had to be canceled.
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
144341ff13689dfe822b598e626272ac2e80041b482Dan Egnor     */
145e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang    public static final int START_CANCELED = -6;
146e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang
147e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang    /**
148e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang     * Result for IActivityManager.startActivity: an error where the
149341ff13689dfe822b598e626272ac2e80041b482Dan Egnor     * thing being started is not an activity.
150b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang     * @hide
151b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang     */
152b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang    public static final int START_NOT_ACTIVITY = -5;
153b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang
154b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang    /**
155b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang     * Result for IActivityManager.startActivity: an error where the
156b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang     * caller does not have permission to start the activity.
157b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang     * @hide
1587836660f5eb45b7b7e1f5119face65c80e2ade17Wu-cheng Li     */
1597836660f5eb45b7b7e1f5119face65c80e2ade17Wu-cheng Li    public static final int START_PERMISSION_DENIED = -4;
1607836660f5eb45b7b7e1f5119face65c80e2ade17Wu-cheng Li
161b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang    /**
1627836660f5eb45b7b7e1f5119face65c80e2ade17Wu-cheng Li     * Result for IActivityManager.startActivity: an error where the
1637836660f5eb45b7b7e1f5119face65c80e2ade17Wu-cheng Li     * caller has requested both to forward a result and to receive
1647836660f5eb45b7b7e1f5119face65c80e2ade17Wu-cheng Li     * a result.
1657836660f5eb45b7b7e1f5119face65c80e2ade17Wu-cheng Li     * @hide
166b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang     */
167b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang    public static final int START_FORWARD_AND_REQUEST_CONFLICT = -3;
168b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang
169b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang    /**
170b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang     * Result for IActivityManager.startActivity: an error where the
171b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang     * requested class is not found.
1727836660f5eb45b7b7e1f5119face65c80e2ade17Wu-cheng Li     * @hide
173b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang     */
174b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang    public static final int START_CLASS_NOT_FOUND = -2;
175b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang
176b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang    /**
177b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang     * Result for IActivityManager.startActivity: an error where the
178b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang     * given Intent could not be resolved to an activity.
1792fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li     * @hide
1802fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li     */
1812fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li    public static final int START_INTENT_NOT_RESOLVED = -1;
1822fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li
1832fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li    /**
1842fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li     * Result for IActivityManaqer.startActivity: the activity was started
185b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang     * successfully as normal.
186b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang     * @hide
18769ea4e15e52c456537575d21443ac1efdb03a902Brad Fitzpatrick     */
18869ea4e15e52c456537575d21443ac1efdb03a902Brad Fitzpatrick    public static final int START_SUCCESS = 0;
18969ea4e15e52c456537575d21443ac1efdb03a902Brad Fitzpatrick
19069ea4e15e52c456537575d21443ac1efdb03a902Brad Fitzpatrick    /**
191b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang     * Result for IActivityManaqer.startActivity: the caller asked that the Intent not
1927836660f5eb45b7b7e1f5119face65c80e2ade17Wu-cheng Li     * be executed if it is the recipient, and that is indeed the case.
193b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang     * @hide
194b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang     */
195b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang    public static final int START_RETURN_INTENT_TO_CALLER = 1;
196341ff13689dfe822b598e626272ac2e80041b482Dan Egnor
197bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /**
198bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     * Result for IActivityManaqer.startActivity: activity wasn't really started, but
199bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     * a task was simply brought to the foreground.
200bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     * @hide
201341ff13689dfe822b598e626272ac2e80041b482Dan Egnor     */
202341ff13689dfe822b598e626272ac2e80041b482Dan Egnor    public static final int START_TASK_TO_FRONT = 2;
203bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
204bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /**
205bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     * Result for IActivityManaqer.startActivity: activity wasn't really started, but
206bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     * the given Intent was given to the existing top activity.
207bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     * @hide
208bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     */
209bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    public static final int START_DELIVERED_TO_TOP = 3;
210bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
211bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /**
212bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     * Result for IActivityManaqer.startActivity: request was canceled because
213bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     * app switches are temporarily canceled to ensure the user's last request
214341ff13689dfe822b598e626272ac2e80041b482Dan Egnor     * (such as pressing home) is performed.
215a48b70fa8ff6363d1e5282be70f6be12bc0688dcWu-cheng Li     * @hide
216bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     */
217bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    public static final int START_SWITCHES_CANCELED = 4;
218bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
219e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang    /**
220e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang     * Result for IActivityManaqer.startActivity: a new activity was attempted to be started
221e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang     * while in Lock Task Mode.
222e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang     * @hide
223e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang     */
224e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang    public static final int START_RETURN_LOCK_TASK_MODE_VIOLATION = 5;
225a48b70fa8ff6363d1e5282be70f6be12bc0688dcWu-cheng Li
226a48b70fa8ff6363d1e5282be70f6be12bc0688dcWu-cheng Li    /**
227a48b70fa8ff6363d1e5282be70f6be12bc0688dcWu-cheng Li     * Flag for IActivityManaqer.startActivity: do special start mode where
2287836660f5eb45b7b7e1f5119face65c80e2ade17Wu-cheng Li     * a new activity is launched only if it is needed.
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
2309b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     */
231a48b70fa8ff6363d1e5282be70f6be12bc0688dcWu-cheng Li    public static final int START_FLAG_ONLY_IF_NEEDED = 1<<0;
232a48b70fa8ff6363d1e5282be70f6be12bc0688dcWu-cheng Li
233a48b70fa8ff6363d1e5282be70f6be12bc0688dcWu-cheng Li    /**
234a48b70fa8ff6363d1e5282be70f6be12bc0688dcWu-cheng Li     * Flag for IActivityManaqer.startActivity: launch the app for
235a48b70fa8ff6363d1e5282be70f6be12bc0688dcWu-cheng Li     * debugging.
236a48b70fa8ff6363d1e5282be70f6be12bc0688dcWu-cheng Li     * @hide
237a48b70fa8ff6363d1e5282be70f6be12bc0688dcWu-cheng Li     */
238a48b70fa8ff6363d1e5282be70f6be12bc0688dcWu-cheng Li    public static final int START_FLAG_DEBUG = 1<<1;
239a48b70fa8ff6363d1e5282be70f6be12bc0688dcWu-cheng Li
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Flag for IActivityManaqer.startActivity: launch the app for
242e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang     * allocation tracking.
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int START_FLAG_TRACK_ALLOCATION = 1<<2;
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
247e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks    /**
2483f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li     * Flag for IActivityManaqer.startActivity: launch the app with
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * native debugging support.
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int START_FLAG_NATIVE_DEBUGGING = 1<<3;
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Result for IActivityManaqer.broadcastIntent: success!
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int BROADCAST_SUCCESS = 0;
259e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2619b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * Result for IActivityManaqer.broadcastIntent: attempt to broadcast
2629b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * a sticky intent without appropriate permission.
2639b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * @hide
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2659b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    public static final int BROADCAST_STICKY_CANT_HAVE_PERMISSION = -1;
266e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2689b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * Result for IActivityManager.broadcastIntent: trying to send a broadcast
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to a stopped user. Fail.
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
272bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    public static final int BROADCAST_FAILED_USER_STOPPED = -2;
273bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2759b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * Type for IActivityManaqer.getIntentSender: this PendingIntent is
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for a sendBroadcast operation.
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int INTENT_SENDER_BROADCAST = 1;
280bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
281bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /**
282bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     * Type for IActivityManaqer.getIntentSender: this PendingIntent is
283bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     * for a startActivity operation.
284bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     * @hide
285bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     */
286bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    public static final int INTENT_SENDER_ACTIVITY = 2;
287bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
288bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /**
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Type for IActivityManaqer.getIntentSender: this PendingIntent is
290bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     * for an activity result operation.
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
292bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     */
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int INTENT_SENDER_ACTIVITY_RESULT = 3;
294bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
2959b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    /**
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Type for IActivityManaqer.getIntentSender: this PendingIntent is
297bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     * for a startService operation.
298bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     * @hide
299bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     */
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int INTENT_SENDER_SERVICE = 4;
301bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
302bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /** @hide User operation call: success! */
303bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    public static final int USER_OP_SUCCESS = 0;
304bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide User operation call: given user id is not known. */
306ffe1cf251a4f8469695b8acfa37270684dc1b70cWu-cheng Li    public static final int USER_OP_UNKNOWN_USER = -1;
3079b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide User operation call: given user id is the current user, can't be stopped. */
309bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    public static final int USER_OP_IS_CURRENT = -2;
310bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
311bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /** @hide User operation call: system user can't be stopped. */
312bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    public static final int USER_OP_ERROR_IS_SYSTEM = -3;
313bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide User operation call: one of related users cannot be stopped. */
315bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    public static final int USER_OP_ERROR_RELATED_USERS_CANNOT_STOP = -4;
316bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
317bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /** @hide Process does not exist. */
318bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    public static final int PROCESS_STATE_NONEXISTENT = -1;
319bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
320bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /** @hide Process is a persistent system process. */
321bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    public static final int PROCESS_STATE_PERSISTENT = 0;
322bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide Process is a persistent system process and is doing UI. */
324bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    public static final int PROCESS_STATE_PERSISTENT_UI = 1;
3259b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide Process is hosting the current top activities.  Note that this covers
327bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     * all activities that are visible to the user. */
328fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis    public static final int PROCESS_STATE_TOP = 2;
329fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis
330fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis    /** @hide Process is hosting a foreground service due to a system binding. */
331fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis    public static final int PROCESS_STATE_BOUND_FOREGROUND_SERVICE = 3;
3329b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
333bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /** @hide Process is hosting a foreground service. */
334bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    public static final int PROCESS_STATE_FOREGROUND_SERVICE = 4;
335bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
336bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /** @hide Same as {@link #PROCESS_STATE_TOP} but while device is sleeping. */
337bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    public static final int PROCESS_STATE_TOP_SLEEPING = 5;
338bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
339bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /** @hide Process is important to the user, and something they are aware of. */
340bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    public static final int PROCESS_STATE_IMPORTANT_FOREGROUND = 6;
341bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
342bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /** @hide Process is important to the user, but not something they are aware of. */
343bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    public static final int PROCESS_STATE_IMPORTANT_BACKGROUND = 7;
344bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
345bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /** @hide Process is in the background running a backup/restore operation. */
3469b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    public static final int PROCESS_STATE_BACKUP = 8;
347bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
348bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /** @hide Process is in the background, but it can't restore its state so we want
349bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     * to try to avoid killing it. */
350bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    public static final int PROCESS_STATE_HEAVY_WEIGHT = 9;
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide Process is in the background running a service.  Unlike oom_adj, this level
353b8a10fe45657f2dcc50cae8a06805f8438a6937eWu-cheng Li     * is used for both the normal running in background state and the executing
354b8a10fe45657f2dcc50cae8a06805f8438a6937eWu-cheng Li     * operations state. */
355b8a10fe45657f2dcc50cae8a06805f8438a6937eWu-cheng Li    public static final int PROCESS_STATE_SERVICE = 10;
356b8a10fe45657f2dcc50cae8a06805f8438a6937eWu-cheng Li
357b8a10fe45657f2dcc50cae8a06805f8438a6937eWu-cheng Li    /** @hide Process is in the background running a receiver.   Note that from the
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * perspective of oom_adj receivers run at a higher foreground level, but for our
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * prioritization here that is not necessary and putting them below services means
360dbc289d6c27968bd05cc547ca73579347c3adc99Glenn Kasten     * many fewer changes in some process states as they receive broadcasts. */
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PROCESS_STATE_RECEIVER = 11;
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
363fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis    /** @hide Process is in the background but hosts the home activity. */
364fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis    public static final int PROCESS_STATE_HOME = 12;
365fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis
366fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis    /** @hide Process is in the background but hosts the last shown activity. */
367fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis    public static final int PROCESS_STATE_LAST_ACTIVITY = 13;
368fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis
369fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis    /** @hide Process is being cached for later use and contains activities. */
370fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis    public static final int PROCESS_STATE_CACHED_ACTIVITY = 14;
371fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis
372fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis    /** @hide Process is being cached for later use and is a client of another cached
373fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis     * process that contains activities. */
374fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis    public static final int PROCESS_STATE_CACHED_ACTIVITY_CLIENT = 15;
375fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis
376fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis    /** @hide Process is being cached for later use and is empty. */
377fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis    public static final int PROCESS_STATE_CACHED_EMPTY = 16;
378fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis
379fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis    /** @hide Should this process state be considered a background state? */
380fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis    public static final boolean isProcStateBackground(int procState) {
381fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis        return procState >= PROCESS_STATE_BACKUP;
382fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis    }
383dbc289d6c27968bd05cc547ca73579347c3adc99Glenn Kasten
384fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis    /** @hide requestType for assist context: only basic information. */
385fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis    public static final int ASSIST_CONTEXT_BASIC = 0;
386bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
387bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /** @hide requestType for assist context: generate full AssistStructure. */
388bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    public static final int ASSIST_CONTEXT_FULL = 1;
389bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
390bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /** @hide Flag for registerUidObserver: report changes in process state. */
391bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    public static final int UID_OBSERVER_PROCSTATE = 1<<0;
392bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide Flag for registerUidObserver: report uid gone. */
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int UID_OBSERVER_GONE = 1<<1;
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide Flag for registerUidObserver: report uid has become idle. */
397bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    public static final int UID_OBSERVER_IDLE = 1<<2;
398341ff13689dfe822b598e626272ac2e80041b482Dan Egnor
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide Flag for registerUidObserver: report uid has become active. */
400bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    public static final int UID_OBSERVER_ACTIVE = 1<<3;
401a696f5d667227365da732481770767dcb330dd23Mathias Agopian
402df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main    /** @hide Mode for {@link IActivityManager#getAppStartMode}: normal free-to-run operation. */
403da0a56df963353a1f1bd1914fa31f870d982dd5aScott Main    public static final int APP_START_MODE_NORMAL = 0;
4049b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
4059b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    /** @hide Mode for {@link IActivityManager#getAppStartMode}: delay running until later. */
406bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    public static final int APP_START_MODE_DELAYED = 1;
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide Mode for {@link IActivityManager#getAppStartMode}: disable/cancel pending
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * launches. */
4109b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    public static final int APP_START_MODE_DISABLED = 2;
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
412bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /**
413bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     * Lock task mode is not active.
414bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     */
415bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    public static final int LOCK_TASK_MODE_NONE = 0;
416bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
417bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /**
418bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     * Full lock task mode is active.
419bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     */
420bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    public static final int LOCK_TASK_MODE_LOCKED = 1;
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4239b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * App pinning mode is active.
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
425bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    public static final int LOCK_TASK_MODE_PINNED = 2;
426bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Point mAppTaskThumbnailSize;
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4299b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    /*package*/ ActivityManager(Context context, Handler handler) {
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext = context;
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mHandler = handler;
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Screen compatibility mode: the application most always run in
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * compatibility mode.
4379b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * @hide
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
439bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    public static final int COMPAT_MODE_ALWAYS = -1;
440bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
441bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /**
442bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     * Screen compatibility mode: the application can never run in
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * compatibility mode.
444bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     * @hide
445bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     */
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int COMPAT_MODE_NEVER = -2;
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Screen compatibility mode: unknown.
45094927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp     * @hide
451a6118c6383c6f5703a576d08586a340fd71d28a4Dave Sparks     */
452a6118c6383c6f5703a576d08586a340fd71d28a4Dave Sparks    public static final int COMPAT_MODE_UNKNOWN = -3;
45394927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Screen compatibility mode: the application currently has compatibility
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * mode disabled.
457bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     * @hide
458bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     */
459bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    public static final int COMPAT_MODE_DISABLED = 0;
460bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
462bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     * Screen compatibility mode: the application currently has compatibility
463bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     * mode enabled.
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
46694927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp    public static final int COMPAT_MODE_ENABLED = 1;
46794927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp
46894927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp    /**
46994927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp     * Screen compatibility mode: request to toggle the application's
47094927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp     * compatibility mode.
47194927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp     * @hide
47294927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp     */
47394927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp    public static final int COMPAT_MODE_TOGGLE = 2;
47494927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp
475bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /** @hide */
476bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    public static class StackId {
477bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        /** Invalid stack ID. */
478bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        public static final int INVALID_STACK_ID = -1;
479bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
48094927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp        /** First static stack ID. */
481bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        public static final int FIRST_STATIC_STACK_ID = 0;
482bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
483bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        /** Home activity stack ID. */
484bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        public static final int HOME_STACK_ID = FIRST_STATIC_STACK_ID;
48594927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp
486bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        /** ID of stack where fullscreen activities are normally launched into. */
487bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        public static final int FULLSCREEN_WORKSPACE_STACK_ID = 1;
488bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
48994927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp        /** ID of stack where freeform/resized activities are normally launched into. */
490bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        public static final int FREEFORM_WORKSPACE_STACK_ID = FULLSCREEN_WORKSPACE_STACK_ID + 1;
491bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
492bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        /** ID of stack that occupies a dedicated region of the screen. */
49394927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp        public static final int DOCKED_STACK_ID = FREEFORM_WORKSPACE_STACK_ID + 1;
49494927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp
49594927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp        /** ID of stack that always on top (always visible) when it exist. */
49694927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp        public static final int PINNED_STACK_ID = DOCKED_STACK_ID + 1;
49794927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp
49894927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp        /** Last static stack stack ID. */
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int LAST_STATIC_STACK_ID = PINNED_STACK_ID;
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
50194927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp        /** Start of ID range used by stacks that are created dynamically. */
5023f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li        public static final int FIRST_DYNAMIC_STACK_ID = LAST_STATIC_STACK_ID + 1;
5033f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li
504bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        public static boolean isStaticStack(int stackId) {
505bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor            return stackId >= FIRST_STATIC_STACK_ID && stackId <= LAST_STATIC_STACK_ID;
506bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        }
507bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
508bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        /**
509c10275abd6a494c93a025f683dde104a5d4f2793Wu-cheng Li         * Returns true if the activities contained in the input stack display a shadow around
510bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor         * their border.
511e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong         */
512e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong        public static boolean hasWindowShadow(int stackId) {
513bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor            return stackId == FREEFORM_WORKSPACE_STACK_ID || stackId == PINNED_STACK_ID;
514bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        }
515bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
51694927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp        /**
517bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor         * Returns true if the activities contained in the input stack display a decor view.
518e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong         */
519bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        public static boolean hasWindowDecor(int stackId) {
520bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor            return stackId == FREEFORM_WORKSPACE_STACK_ID;
521e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong        }
522e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong
523e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong        /**
52494927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp         * Returns true if the tasks contained in the stack can be resized independently of the
525bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor         * stack.
526bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor         */
5275b9bcda3a26e9b1f9b1eff28a2be8853d69614f0Wu-cheng Li        public static boolean isTaskResizeAllowed(int stackId) {
52894927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp            return stackId == FREEFORM_WORKSPACE_STACK_ID;
529e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong        }
530e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong
531e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong        /** Returns true if the task bounds should persist across power cycles. */
532e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong        public static boolean persistTaskBounds(int stackId) {
533e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong            return stackId == FREEFORM_WORKSPACE_STACK_ID;
534e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong        }
535e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong
536e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong        /**
537e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong         * Returns true if dynamic stacks are allowed to be visible behind the input stack.
538e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong         */
539e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong        public static boolean isDynamicStacksVisibleBehindAllowed(int stackId) {
540e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong            return stackId == PINNED_STACK_ID;
541e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong        }
542e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong
543e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong        /**
544e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong         * Returns true if we try to maintain focus in the current stack when the top activity
545e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong         * finishes.
546e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong         */
547e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong        public static boolean keepFocusInStackIfPossible(int stackId) {
548e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong            return stackId == FREEFORM_WORKSPACE_STACK_ID
549e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong                    || stackId == DOCKED_STACK_ID || stackId == PINNED_STACK_ID;
550e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong        }
551e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong
552e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong        /**
553e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong         * Returns true if Stack size is affected by the docked stack changing size.
554e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong         */
555e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong        public static boolean isResizeableByDockedStack(int stackId) {
556e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong            return isStaticStack(stackId) &&
557e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong                    stackId != DOCKED_STACK_ID && stackId != PINNED_STACK_ID;
558e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong        }
559e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong
560e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong        /**
561e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong         * Returns true if the size of tasks in the input stack are affected by the docked stack
562e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong         * changing size.
563e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong         */
564e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong        public static boolean isTaskResizeableByDockedStack(int stackId) {
565e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong            return isStaticStack(stackId) && stackId != FREEFORM_WORKSPACE_STACK_ID
566e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong                    && stackId != DOCKED_STACK_ID && stackId != PINNED_STACK_ID;
567e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong        }
568e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong
569e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong        /**
570e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong         * Returns true if the windows of tasks being moved to the target stack from the source
571e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong         * stack should be replaced, meaning that window manager will keep the old window around
572e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong         * until the new is ready.
573e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong         */
574e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong        public static boolean replaceWindowsOnTaskMove(int sourceStackId, int targetStackId) {
575e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong            return sourceStackId == FREEFORM_WORKSPACE_STACK_ID
576e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong                    || targetStackId == FREEFORM_WORKSPACE_STACK_ID;
577e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong        }
578e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong
579e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong        /**
580e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong         * Returns true if animation specs should be constructed for app transition that moves
581e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong         * the task to the specified stack.
582e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong         */
583e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong        public static boolean useAnimationSpecForAppTransition(int stackId) {
584e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong
585e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong            // TODO: INVALID_STACK_ID is also animated because we don't persist stack id's across
586e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong            // reboots.
587e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong            return stackId == FREEFORM_WORKSPACE_STACK_ID
588e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong                    || stackId == FULLSCREEN_WORKSPACE_STACK_ID || stackId == DOCKED_STACK_ID
589e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong                    || stackId == INVALID_STACK_ID;
590e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong        }
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** Returns true if the windows in the stack can receive input keys. */
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static boolean canReceiveKeys(int stackId) {
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return stackId != PINNED_STACK_ID;
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returns true if the stack can be visible above lockscreen.
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static boolean isAllowedOverLockscreen(int stackId) {
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return stackId == HOME_STACK_ID || stackId == FULLSCREEN_WORKSPACE_STACK_ID;
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
604c62f9bd13327937aa2d2f20b44215397120634c1Dave Sparks        public static boolean isAlwaysOnTop(int stackId) {
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return stackId == PINNED_STACK_ID;
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
609c62f9bd13327937aa2d2f20b44215397120634c1Dave Sparks         * Returns true if the top task in the task is allowed to return home when finished and
610c62f9bd13327937aa2d2f20b44215397120634c1Dave Sparks         * there are other tasks in the stack.
611e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks         */
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static boolean allowTopTaskToReturnHome(int stackId) {
613e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks            return stackId != PINNED_STACK_ID;
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
616c62f9bd13327937aa2d2f20b44215397120634c1Dave Sparks        /**
617e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks         * Returns true if the stack should be resized to match the bounds specified by
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * {@link ActivityOptions#setLaunchBounds} when launching an activity into the stack.
619e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks         */
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static boolean resizeStackWithLaunchBounds(int stackId) {
6219b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            return stackId == PINNED_STACK_ID;
622c62f9bd13327937aa2d2f20b44215397120634c1Dave Sparks        }
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
624a6118c6383c6f5703a576d08586a340fd71d28a4Dave Sparks        /**
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returns true if any visible windows belonging to apps in this stack should be kept on
626a6118c6383c6f5703a576d08586a340fd71d28a4Dave Sparks         * screen when the app is killed due to something like the low memory killer.
627a6118c6383c6f5703a576d08586a340fd71d28a4Dave Sparks         */
628a6118c6383c6f5703a576d08586a340fd71d28a4Dave Sparks        public static boolean keepVisibleDeadAppWindowOnScreen(int stackId) {
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return stackId != PINNED_STACK_ID;
63094927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp        }
631a6118c6383c6f5703a576d08586a340fd71d28a4Dave Sparks
632a6118c6383c6f5703a576d08586a340fd71d28a4Dave Sparks        /**
633a6118c6383c6f5703a576d08586a340fd71d28a4Dave Sparks         * Returns true if the backdrop on the client side should match the frame of the window.
63494927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp         * Returns false, if the backdrop should be fullscreen.
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
636a6118c6383c6f5703a576d08586a340fd71d28a4Dave Sparks        public static boolean useWindowFrameForBackdrop(int stackId) {
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return stackId == FREEFORM_WORKSPACE_STACK_ID || stackId == PINNED_STACK_ID;
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
640e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks        /**
641e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks         * Returns true if a window from the specified stack with {@param stackId} are normally
642e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks         * fullscreen, i. e. they can become the top opaque fullscreen window, meaning that it
643e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks         * controls system bars, lockscreen occluded/dismissing state, screen rotation animation,
644e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks         * etc.
645e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks         */
646c62f9bd13327937aa2d2f20b44215397120634c1Dave Sparks        public static boolean normallyFullscreenWindows(int stackId) {
647e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks            return stackId != PINNED_STACK_ID && stackId != FREEFORM_WORKSPACE_STACK_ID
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    && stackId != DOCKED_STACK_ID;
649e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks        }
650e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks
651e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks        /**
652e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks         * Returns true if the input stack id should only be present on a device that supports
6533f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li         * multi-window mode.
6543f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li         * @see android.app.ActivityManager#supportsMultiWindow
655e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks         */
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static boolean isMultiWindowStack(int stackId) {
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return isStaticStack(stackId) || stackId == PINNED_STACK_ID
658c62f9bd13327937aa2d2f20b44215397120634c1Dave Sparks                    || stackId == FREEFORM_WORKSPACE_STACK_ID || stackId == DOCKED_STACK_ID;
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
660e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks    }
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
662e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks    /**
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Input parameter to {@link android.app.IActivityManager#moveTaskToDockedStack} which
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * specifies the position of the created docked stack at the top half of the screen if
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in portrait mode or at the left half of the screen if in landscape mode.
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int DOCKED_STACK_CREATE_MODE_TOP_OR_LEFT = 0;
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Input parameter to {@link android.app.IActivityManager#moveTaskToDockedStack} which
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * specifies the position of the created docked stack at the bottom half of the screen if
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in portrait mode or at the right half of the screen if in landscape mode.
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int DOCKED_STACK_CREATE_MODE_BOTTOM_OR_RIGHT = 1;
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Input parameter to {@link android.app.IActivityManager#resizeTask} which indicates
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that the resize doesn't need to preserve the window, and can be skipped if bounds
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is unchanged. This mode is used by window manager in most cases.
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int RESIZE_MODE_SYSTEM = 0;
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
686bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /**
687bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     * Input parameter to {@link android.app.IActivityManager#resizeTask} which indicates
6887478ea6848c0059e65a4089b4ec2ff4158520870Wu-cheng Li     * that the resize should preserve the window if possible.
6897478ea6848c0059e65a4089b4ec2ff4158520870Wu-cheng Li     * @hide
690df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main     */
691df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main    public static final int RESIZE_MODE_PRESERVE_WINDOW   = (0x1 << 0);
6927478ea6848c0059e65a4089b4ec2ff4158520870Wu-cheng Li
693df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main    /**
694df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main     * Input parameter to {@link android.app.IActivityManager#resizeTask} which indicates
695bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     * that the resize should be performed even if the bounds appears unchanged.
696bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     * @hide
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int RESIZE_MODE_FORCED = (0x1 << 1);
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
70169ea4e15e52c456537575d21443ac1efdb03a902Brad Fitzpatrick     * Input parameter to {@link android.app.IActivityManager#resizeTask} used by window
70269ea4e15e52c456537575d21443ac1efdb03a902Brad Fitzpatrick     * manager during a screen rotation.
70369ea4e15e52c456537575d21443ac1efdb03a902Brad Fitzpatrick     * @hide
70469ea4e15e52c456537575d21443ac1efdb03a902Brad Fitzpatrick     */
7059b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    public static final int RESIZE_MODE_SYSTEM_SCREEN_ROTATION = RESIZE_MODE_PRESERVE_WINDOW;
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Input parameter to {@link android.app.IActivityManager#resizeTask} used when the
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * resize is due to a drag action.
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int RESIZE_MODE_USER = RESIZE_MODE_PRESERVE_WINDOW;
713bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
714bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /**
715bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     * Input parameter to {@link android.app.IActivityManager#resizeTask} which indicates
716bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     * that the resize should preserve the window if possible, and should not be skipped
717bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     * even if the bounds is unchanged. Usually used to force a resizing when a drag action
718bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     * is ending.
719bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     * @hide
720bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     */
72136322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li    public static final int RESIZE_MODE_USER_FORCED =
722bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor            RESIZE_MODE_PRESERVE_WINDOW | RESIZE_MODE_FORCED;
723da0a56df963353a1f1bd1914fa31f870d982dd5aScott Main
7247478ea6848c0059e65a4089b4ec2ff4158520870Wu-cheng Li    /** @hide */
7257478ea6848c0059e65a4089b4ec2ff4158520870Wu-cheng Li    public int getFrontActivityScreenCompatMode() {
726df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main        try {
727df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main            return ActivityManagerNative.getDefault().getFrontActivityScreenCompatMode();
728bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        } catch (RemoteException e) {
729068ef42c3ffe1eccec10f97f08541304f679fe67Wu-cheng Li            throw e.rethrowFromSystemServer();
730068ef42c3ffe1eccec10f97f08541304f679fe67Wu-cheng Li        }
731bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    }
7327478ea6848c0059e65a4089b4ec2ff4158520870Wu-cheng Li
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
734bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    public void setFrontActivityScreenCompatMode(int mode) {
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().setFrontActivityScreenCompatMode(mode);
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw e.rethrowFromSystemServer();
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getPackageScreenCompatMode(String packageName) {
744bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        try {
745bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor            return ActivityManagerNative.getDefault().getPackageScreenCompatMode(packageName);
746bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        } catch (RemoteException e) {
747244f8c26365a303d9dd861bd48a29a4b48578da1Chih-Chung Chang            throw e.rethrowFromSystemServer();
748bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        }
749bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    }
750244f8c26365a303d9dd861bd48a29a4b48578da1Chih-Chung Chang
751244f8c26365a303d9dd861bd48a29a4b48578da1Chih-Chung Chang    /** @hide */
752244f8c26365a303d9dd861bd48a29a4b48578da1Chih-Chung Chang    public void setPackageScreenCompatMode(String packageName, int mode) {
753244f8c26365a303d9dd861bd48a29a4b48578da1Chih-Chung Chang        try {
754244f8c26365a303d9dd861bd48a29a4b48578da1Chih-Chung Chang            ActivityManagerNative.getDefault().setPackageScreenCompatMode(packageName, mode);
755244f8c26365a303d9dd861bd48a29a4b48578da1Chih-Chung Chang        } catch (RemoteException e) {
756244f8c26365a303d9dd861bd48a29a4b48578da1Chih-Chung Chang            throw e.rethrowFromSystemServer();
757244f8c26365a303d9dd861bd48a29a4b48578da1Chih-Chung Chang        }
758244f8c26365a303d9dd861bd48a29a4b48578da1Chih-Chung Chang    }
759bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
760bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /** @hide */
761bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    public boolean getPackageAskScreenCompat(String packageName) {
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().getPackageAskScreenCompat(packageName);
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw e.rethrowFromSystemServer();
766bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        }
767bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    }
768bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
769bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /** @hide */
770bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    public void setPackageAskScreenCompat(String packageName, boolean ask) {
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().setPackageAskScreenCompat(packageName, ask);
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw e.rethrowFromSystemServer();
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
776bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    }
777bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
778bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /**
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the approximate per-application memory class of the current
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * device.  This gives you an idea of how hard a memory limit you should
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * impose on your application to let the overall system work best.  The
782bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     * returned value is in megabytes; the baseline Android memory class is
783bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     * 16 (which happens to be the Java heap limit of those devices); some
784bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     * device with more memory may return 24 or even higher numbers.
7859b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     */
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getMemoryClass() {
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return staticGetMemoryClass();
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public int staticGetMemoryClass() {
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Really brain dead right now -- just take this from the configured
793bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        // vm heap size, and assume it is in megabytes and thus ends with "m".
7949b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        String vmHeapSize = SystemProperties.get("dalvik.vm.heapgrowthlimit", "");
795bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        if (vmHeapSize != null && !"".equals(vmHeapSize)) {
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return Integer.parseInt(vmHeapSize.substring(0, vmHeapSize.length()-1));
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return staticGetLargeMemoryClass();
799e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks    }
800e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks
801e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    /**
802e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks     * Return the approximate per-application memory class of the current
803e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks     * device when an application is running with a large heap.  This is the
8049b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * space available for memory-intensive applications; most applications
8059b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * should not need this amount of memory, and should instead stay with the
8069b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * {@link #getMemoryClass()} limit.  The returned value is in megabytes.
8079b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * This may be the same size as {@link #getMemoryClass()} on memory
8089b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * constrained devices, or it may be significantly larger on devices with
809e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong     * a large amount of available RAM.
810e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong     *
8119b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * <p>The is the size of the application's Dalvik heap if it has
8129b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * specified <code>android:largeHeap="true"</code> in its manifest.
8139b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     */
8149b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    public int getLargeMemoryClass() {
8159b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        return staticGetLargeMemoryClass();
816e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks    }
817bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
818bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /** @hide */
819bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    static public int staticGetLargeMemoryClass() {
820bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        // Really brain dead right now -- just take this from the configured
82140057ce749c8c4d274db0352a2af4344bda92dbaWu-cheng Li        // vm heap size, and assume it is in megabytes and thus ends with "m".
822bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        String vmHeapSize = SystemProperties.get("dalvik.vm.heapsize", "16m");
823bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        return Integer.parseInt(vmHeapSize.substring(0, vmHeapSize.length() - 1));
82440057ce749c8c4d274db0352a2af4344bda92dbaWu-cheng Li    }
825bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
826bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /**
827e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks     * Returns true if this is a low-RAM device.  Exactly whether a device is low-RAM
828bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     * is ultimately up to the device configuration, but currently it generally means
829e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong     * something in the class of a 512MB device with about a 800x480 or less screen.
830e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong     * This is mostly intended to be used by apps to determine whether they should turn
831e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks     * off certain features that require more RAM.
832e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks     */
833e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks    public boolean isLowRamDevice() {
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return isLowRamDeviceStatic();
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
836e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
838e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    public static boolean isLowRamDeviceStatic() {
839e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong        return "true".equals(SystemProperties.get("ro.config.low_ram", "false"));
840e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    }
841e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong
842e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    /**
843e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong     * Used by persistent processes to determine if they are running on a
844e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong     * higher-end device so should be okay using hardware drawing acceleration
845e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong     * (which tends to consume a lot more RAM).
846e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong     * @hide
847e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong     */
848e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    static public boolean isHighEndGfx() {
849e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong        return !isLowRamDeviceStatic() &&
850e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong                !Resources.getSystem().getBoolean(com.android.internal.R.bool.config_avoidGfxAccel);
851e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    }
852e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong
853e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    /**
854e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong     * Return the maximum number of recents entries that we will maintain and show.
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
857e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks    static public int getMaxRecentTasksStatic() {
858bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        if (gMaxRecentTasks < 0) {
8593f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li            return gMaxRecentTasks = isLowRamDeviceStatic() ? 50 : 100;
8603f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li        }
861bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        return gMaxRecentTasks;
862bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    }
863bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
864bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /**
865bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     * Return the default limit on the number of recents that an app can make.
866bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     * @hide
867bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     */
868bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    static public int getDefaultAppRecentsLimitStatic() {
869bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        return getMaxRecentTasksStatic() / 6;
87036f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li    }
87136f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li
87236f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li    /**
8730ca25191c663ef229f1f475b17899f2017ed6980Wu-cheng Li     * Return the maximum limit on the number of recents that an app can make.
8740ca25191c663ef229f1f475b17899f2017ed6980Wu-cheng Li     * @hide
875bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor     */
87636f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li    static public int getMaxAppRecentsLimitStatic() {
87736f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li        return getMaxRecentTasksStatic() / 2;
87836f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li    }
87936f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li
880bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /**
8813f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li     * Returns true if the system supports at least one form of multi-window.
8823f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li     * E.g. freeform, split-screen, picture-in-picture.
8838cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li     * @hide
8840ca25191c663ef229f1f475b17899f2017ed6980Wu-cheng Li     */
8850ca25191c663ef229f1f475b17899f2017ed6980Wu-cheng Li    static public boolean supportsMultiWindow() {
88636f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li        return !isLowRamDeviceStatic()
88736f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li                && Resources.getSystem().getBoolean(
88836f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li                    com.android.internal.R.bool.config_supportsMultiWindow);
88936f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li    }
8902fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li
8912fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li    /**
8922fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li     * Information you can set and retrieve about the current activity within the recent task list.
893b982fb4fd36a3cd24a0bb17c964139fe4c9cbb47Wu-cheng Li     */
894b982fb4fd36a3cd24a0bb17c964139fe4c9cbb47Wu-cheng Li    public static class TaskDescription implements Parcelable {
895b982fb4fd36a3cd24a0bb17c964139fe4c9cbb47Wu-cheng Li        /** @hide */
896d1d7706fce19a9a0cf71ff9b65f3aba9b89eeb3bChih-Chung Chang        public static final String ATTR_TASKDESCRIPTION_PREFIX = "task_description_";
89769ea4e15e52c456537575d21443ac1efdb03a902Brad Fitzpatrick        private static final String ATTR_TASKDESCRIPTIONLABEL =
8982fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li                ATTR_TASKDESCRIPTION_PREFIX + "label";
8992fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li        private static final String ATTR_TASKDESCRIPTIONCOLOR_PRIMARY =
900d1d7706fce19a9a0cf71ff9b65f3aba9b89eeb3bChih-Chung Chang                ATTR_TASKDESCRIPTION_PREFIX + "color";
90169ea4e15e52c456537575d21443ac1efdb03a902Brad Fitzpatrick        private static final String ATTR_TASKDESCRIPTIONCOLOR_BACKGROUND =
90269ea4e15e52c456537575d21443ac1efdb03a902Brad Fitzpatrick                ATTR_TASKDESCRIPTION_PREFIX + "colorBackground";
903b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang        private static final String ATTR_TASKDESCRIPTIONICONFILENAME =
904724c52244423feced2677fbd1f905e0b8b0639f2Chih-Chung Chang                ATTR_TASKDESCRIPTION_PREFIX + "icon_filename";
905724c52244423feced2677fbd1f905e0b8b0639f2Chih-Chung Chang
906724c52244423feced2677fbd1f905e0b8b0639f2Chih-Chung Chang        private String mLabel;
907724c52244423feced2677fbd1f905e0b8b0639f2Chih-Chung Chang        private Bitmap mIcon;
908724c52244423feced2677fbd1f905e0b8b0639f2Chih-Chung Chang        private String mIconFilename;
909724c52244423feced2677fbd1f905e0b8b0639f2Chih-Chung Chang        private int mColorPrimary;
910724c52244423feced2677fbd1f905e0b8b0639f2Chih-Chung Chang        private int mColorBackground;
911724c52244423feced2677fbd1f905e0b8b0639f2Chih-Chung Chang
912724c52244423feced2677fbd1f905e0b8b0639f2Chih-Chung Chang        /**
913724c52244423feced2677fbd1f905e0b8b0639f2Chih-Chung Chang         * Creates the TaskDescription to the specified values.
914724c52244423feced2677fbd1f905e0b8b0639f2Chih-Chung Chang         *
915724c52244423feced2677fbd1f905e0b8b0639f2Chih-Chung Chang         * @param label A label and description of the current state of this task.
916724c52244423feced2677fbd1f905e0b8b0639f2Chih-Chung Chang         * @param icon An icon that represents the current state of this task.
917724c52244423feced2677fbd1f905e0b8b0639f2Chih-Chung Chang         * @param colorPrimary A color to override the theme's primary color.  This color must be
918b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang         *                     opaque.
9192fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li         */
9202fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li        public TaskDescription(String label, Bitmap icon, int colorPrimary) {
9212fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li            this(label, icon, null, colorPrimary, 0);
9222fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li            if ((colorPrimary != 0) && (Color.alpha(colorPrimary) != 255)) {
9232fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li                throw new RuntimeException("A TaskDescription's primary color should be opaque");
9242fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li            }
9252fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li        }
926724c52244423feced2677fbd1f905e0b8b0639f2Chih-Chung Chang
927724c52244423feced2677fbd1f905e0b8b0639f2Chih-Chung Chang        /**
928b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang         * Creates the TaskDescription to the specified values.
929d1d7706fce19a9a0cf71ff9b65f3aba9b89eeb3bChih-Chung Chang         *
930e7bd22a9d9441916aa9c67d80ee9f02a2d3e10e5Chih-Chung Chang         * @param label A label and description of the current state of this activity.
931e7bd22a9d9441916aa9c67d80ee9f02a2d3e10e5Chih-Chung Chang         * @param icon An icon that represents the current state of this activity.
9322fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li         */
933d1d7706fce19a9a0cf71ff9b65f3aba9b89eeb3bChih-Chung Chang        public TaskDescription(String label, Bitmap icon) {
934d1d7706fce19a9a0cf71ff9b65f3aba9b89eeb3bChih-Chung Chang            this(label, icon, null, 0, 0);
935d1d7706fce19a9a0cf71ff9b65f3aba9b89eeb3bChih-Chung Chang        }
936d1d7706fce19a9a0cf71ff9b65f3aba9b89eeb3bChih-Chung Chang
937bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        /**
938bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor         * Creates the TaskDescription to the specified values.
939bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor         *
940bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor         * @param label A label and description of the current state of this activity.
941e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks         */
9423f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li        public TaskDescription(String label) {
943e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks            this(label, null, null, 0, 0);
944e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks        }
945bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
94636f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li        /**
94736f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li         * Creates an empty TaskDescription.
9483f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li         */
94936f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li        public TaskDescription() {
95036f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li            this(null, null, null, 0, 0);
951e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks        }
952e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks
9533f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li        /** @hide */
954e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks        public TaskDescription(String label, Bitmap icon, String iconFilename, int colorPrimary,
955e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks                int colorBackground) {
956e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks            mLabel = label;
9573f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li            mIcon = icon;
95836f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li            mIconFilename = iconFilename;
9598cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li            mColorPrimary = colorPrimary;
9603f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li            mColorBackground = colorBackground;
9618cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li        }
962e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks
9633f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li        /**
964e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks         * Creates a copy of another TaskDescription.
9653f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li         */
966e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks        public TaskDescription(TaskDescription td) {
9679b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            copyFrom(td);
968bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        }
969bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
970bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        /**
971bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor         * Copies this the values from another TaskDescription.
972bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor         * @hide
973bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor         */
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void copyFrom(TaskDescription other) {
975bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor            mLabel = other.mLabel;
976bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor            mIcon = other.mIcon;
977bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor            mIconFilename = other.mIconFilename;
978bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor            mColorPrimary = other.mColorPrimary;
979bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor            mColorBackground = other.mColorBackground;
980bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        }
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9829b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        private TaskDescription(Parcel source) {
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            readFromParcel(source);
984bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        }
985bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
986bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        /**
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Sets the label for this task description.
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @hide
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setLabel(String label) {
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLabel = label;
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Sets the primary color for this task description.
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @hide
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setPrimaryColor(int primaryColor) {
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Ensure that the given color is valid
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((primaryColor != 0) && (Color.alpha(primaryColor) != 255)) {
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("A TaskDescription's primary color should be opaque");
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mColorPrimary = primaryColor;
1004bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        }
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Sets the background color for this task description.
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @hide
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
10109b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public void setBackgroundColor(int backgroundColor) {
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Ensure that the given color is valid
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((backgroundColor != 0) && (Color.alpha(backgroundColor) != 255)) {
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("A TaskDescription's background color should be opaque");
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1015bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor            mColorBackground = backgroundColor;
10169b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        }
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
101899a3f3e4e06b4370101ca97cc11dbe81d772fefaWu-cheng Li        /**
1019bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor         * Sets the icon for this task description.
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @hide
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setIcon(Bitmap icon) {
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIcon = icon;
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1026bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        /**
1027bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor         * Moves the icon bitmap reference from an actual Bitmap to a file containing the
1028bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor         * bitmap.
1029bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor         * @hide
1030bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor         */
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setIconFilename(String iconFilename) {
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIconFilename = iconFilename;
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIcon = null;
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return The label and description of the current state of this task.
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String getLabel() {
1040bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor            return mLabel;
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return The icon that represents the current state of this task.
10459b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         */
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Bitmap getIcon() {
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mIcon != null) {
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mIcon;
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return loadTaskDescriptionIcon(mIconFilename, UserHandle.myUserId());
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10534c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li        /** @hide */
10544c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li        public String getIconFilename() {
10554c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li            return mIconFilename;
10564c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li        }
10574c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li
10584c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li        /** @hide */
10594c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li        public Bitmap getInMemoryIcon() {
10604c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li            return mIcon;
10614c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li        }
10624c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li
10634c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li        /** @hide */
10644c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li        public static Bitmap loadTaskDescriptionIcon(String iconFilename, int userId) {
10654c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li            if (iconFilename != null) {
10664c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li                try {
10674c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li                    return ActivityManagerNative.getDefault().getTaskDescriptionIcon(iconFilename,
10684c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li                            userId);
10694c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li                } catch (RemoteException e) {
10704c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li                    throw e.rethrowFromSystemServer();
10714c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li                }
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return The color override on the theme's primary color.
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1079bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        public int getPrimaryColor() {
10809b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            return mColorPrimary;
10819b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        }
1082bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
1083bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        /**
1084bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor         * @return The background color.
1085bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor         * @hide
10869b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         */
10879b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public int getBackgroundColor() {
10889b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            return mColorBackground;
10899b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        }
1090bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
1091bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        /** @hide */
1092bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        public void saveToXml(XmlSerializer out) throws IOException {
1093bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor            if (mLabel != null) {
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.attribute(null, ATTR_TASKDESCRIPTIONLABEL, mLabel);
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10969b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            if (mColorPrimary != 0) {
10979b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li                out.attribute(null, ATTR_TASKDESCRIPTIONCOLOR_PRIMARY,
10989b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li                        Integer.toHexString(mColorPrimary));
10999b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            }
1100454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li            if (mColorBackground != 0) {
11019b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li                out.attribute(null, ATTR_TASKDESCRIPTIONCOLOR_BACKGROUND,
11029b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li                        Integer.toHexString(mColorBackground));
11034c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li            }
11049b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            if (mIconFilename != null) {
11059b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li                out.attribute(null, ATTR_TASKDESCRIPTIONICONFILENAME, mIconFilename);
11069b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            }
11079b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        }
11089b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
11099b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        /** @hide */
11109b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public void restoreFromXml(String attrName, String attrValue) {
11119b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            if (ATTR_TASKDESCRIPTIONLABEL.equals(attrName)) {
11129b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li                setLabel(attrValue);
1113055c986ab841f8f758398841730f1e90313b132aRay Chen            } else if (ATTR_TASKDESCRIPTIONCOLOR_PRIMARY.equals(attrName)) {
11149b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li                setPrimaryColor((int) Long.parseLong(attrValue, 16));
11159b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            } else if (ATTR_TASKDESCRIPTIONCOLOR_BACKGROUND.equals(attrName)) {
11169b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li                setBackgroundColor((int) Long.parseLong(attrValue, 16));
11179b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            } else if (ATTR_TASKDESCRIPTIONICONFILENAME.equals(attrName)) {
11189b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li                setIconFilename(attrValue);
111936322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li            }
11206c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li        }
11216c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li
11226c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li        @Override
1123ff723b6c43d5a8fd0ae0e0732f5d47012d74e01dWu-cheng Li        public int describeContents() {
112424b326a8978bf78e3e560723dde221792784325bWu-cheng Li            return 0;
112524b326a8978bf78e3e560723dde221792784325bWu-cheng Li        }
112624b326a8978bf78e3e560723dde221792784325bWu-cheng Li
11278cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li        @Override
11288cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li        public void writeToParcel(Parcel dest, int flags) {
11298cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li            if (mLabel == null) {
11308cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li                dest.writeInt(0);
11318cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li            } else {
1132e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li                dest.writeInt(1);
1133dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong                dest.writeString(mLabel);
1134dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong            }
1135dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong            if (mIcon == null) {
1136e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li                dest.writeInt(0);
11379b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            } else {
11389b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li                dest.writeInt(1);
11399b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li                mIcon.writeToParcel(dest, 0);
11408cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li            }
11418cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li            dest.writeInt(mColorPrimary);
11429b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            dest.writeInt(mColorBackground);
11439b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            if (mIconFilename == null) {
11449b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li                dest.writeInt(0);
11459b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            } else {
11469b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li                dest.writeInt(1);
11479b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li                dest.writeString(mIconFilename);
11489b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            }
11499b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        }
11509b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
11519b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public void readFromParcel(Parcel source) {
11529b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            mLabel = source.readInt() > 0 ? source.readString() : null;
11539b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            mIcon = source.readInt() > 0 ? Bitmap.CREATOR.createFromParcel(source) : null;
11549b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            mColorPrimary = source.readInt();
11559b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            mColorBackground = source.readInt();
11569b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            mIconFilename = source.readInt() > 0 ? source.readString() : null;
11579b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        }
11589b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
11599b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public static final Creator<TaskDescription> CREATOR
11609b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li                = new Creator<TaskDescription>() {
11619b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            public TaskDescription createFromParcel(Parcel source) {
11629b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li                return new TaskDescription(source);
11639b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            }
11649b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            public TaskDescription[] newArray(int size) {
11659b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li                return new TaskDescription[size];
11669b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            }
11679b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        };
11689b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
11699b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        @Override
11709b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public String toString() {
11719b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            return "TaskDescription Label: " + mLabel + " Icon: " + mIcon +
11729b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li                    " IconFilename: " + mIconFilename + " colorPrimary: " + mColorPrimary +
11739b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li                    " colorBackground: " + mColorBackground;
117436f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li        }
11759b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    }
1176068ef42c3ffe1eccec10f97f08541304f679fe67Wu-cheng Li
1177068ef42c3ffe1eccec10f97f08541304f679fe67Wu-cheng Li    /**
11789b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * Information you can retrieve about tasks that the user has most recently
11799b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * started or visited.
118036f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li     */
11819b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    public static class RecentTaskInfo implements Parcelable {
1182068ef42c3ffe1eccec10f97f08541304f679fe67Wu-cheng Li        /**
1183068ef42c3ffe1eccec10f97f08541304f679fe67Wu-cheng Li         * If this task is currently running, this is the identifier for it.
11849b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         * If it is not running, this will be -1.
11859b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         */
118636f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li        public int id;
11879b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
11889b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        /**
11899b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         * The true identifier of this task, valid even if it is not running.
11909b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         */
119136f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li        public int persistentId;
119236322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li
1193068ef42c3ffe1eccec10f97f08541304f679fe67Wu-cheng Li        /**
1194068ef42c3ffe1eccec10f97f08541304f679fe67Wu-cheng Li         * The original Intent used to launch the task.  You can use this
119536322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li         * Intent to re-launch the task (if it is no longer running) or bring
1196068ef42c3ffe1eccec10f97f08541304f679fe67Wu-cheng Li         * the current task to the front.
11979b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         */
119800e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li        public Intent baseIntent;
119900e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li
120000e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li        /**
12019b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         * If this task was started from an alias, this is the actual
120200e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li         * activity component that was initially started; the component of
120300e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li         * the baseIntent in this case is the name of the actual activity
120400e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li         * implementation that the alias referred to.  Otherwise, this is null.
120500e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li         */
120600e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li        public ComponentName origActivity;
12079b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
120800e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li        /**
120900e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li         * The actual activity component that started the task.
121000e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li         * @hide
121100e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li         */
12129b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        @Nullable
121300e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li        public ComponentName realActivity;
121400e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li
121500e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li        /**
121600e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li         * Description of the task's last state.
12179b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         */
121800e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li        public CharSequence description;
121900e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li
122000e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li        /**
122100e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li         * The id of the ActivityStack this Task was on most recently.
12229b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         * @hide
122300e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li         */
122400e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li        public int stackId;
122500e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li
122600e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li        /**
12279b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         * The id of the user the task was running as.
122800e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li         * @hide
122900e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li         */
123000e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li        public int userId;
123100e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li
12329b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        /**
123300e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li         * The first time this task was active.
123400e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li         * @hide
123500e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li         */
123600e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li        public long firstActiveTime;
12379b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
123800e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li        /**
123900e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li         * The last time this task was active.
124000e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li         * @hide
124100e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li         */
12429b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public long lastActiveTime;
124300e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li
124400e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li        /**
124500e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li         * The recent activity values for the highest activity in the stack to have set the values.
124600e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li         * {@link Activity#setTaskDescription(android.app.ActivityManager.TaskDescription)}.
12479b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         */
124800e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li        public TaskDescription taskDescription;
124900e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li
125000e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li        /**
125100e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li         * Task affiliation for grouping with other tasks.
12529b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         */
125300e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li        public int affiliatedTaskId;
125400e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li
125500e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li        /**
125600e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li         * Task affiliation color of the source task with the affiliated task id.
12579b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         *
125800e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li         * @hide
125900e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li         */
126000e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li        public int affiliatedTaskColor;
126100e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li
126200e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li        /**
12639b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         * The component launched as the first activity in the task.
126400e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li         * This can be considered the "application" of this task.
126500e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li         */
126600e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li        public ComponentName baseActivity;
126700e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li
12689b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        /**
126900e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li         * The activity component at the top of the history stack of the task.
127000e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li         * This is what the user is currently doing.
127100e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li         */
127200e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li        public ComponentName topActivity;
12739b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
12749b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        /**
1275c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li         * Number of activities in this task.
1276c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li         */
1277c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li        public int numActivities;
1278c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li
1279c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li        /**
1280c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li         * The bounds of the task.
128136322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li         * @hide
1282f008f3ea82a0518375ee4ea41b32451badffbd95Wu-cheng Li         */
1283f008f3ea82a0518375ee4ea41b32451badffbd95Wu-cheng Li        public Rect bounds;
128436322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li
128536322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li        /**
128636f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li         * True if the task can go in the docked stack.
128736322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li         * @hide
128836322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li         */
128936322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li        public boolean isDockable;
129036322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li
129136322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li        public RecentTaskInfo() {
1292f008f3ea82a0518375ee4ea41b32451badffbd95Wu-cheng Li        }
1293f008f3ea82a0518375ee4ea41b32451badffbd95Wu-cheng Li
1294f008f3ea82a0518375ee4ea41b32451badffbd95Wu-cheng Li        @Override
1295f008f3ea82a0518375ee4ea41b32451badffbd95Wu-cheng Li        public int describeContents() {
1296f008f3ea82a0518375ee4ea41b32451badffbd95Wu-cheng Li            return 0;
1297f008f3ea82a0518375ee4ea41b32451badffbd95Wu-cheng Li        }
129836322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li
129936f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li        @Override
130036322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li        public void writeToParcel(Parcel dest, int flags) {
130136322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li            dest.writeInt(id);
130236322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li            dest.writeInt(persistentId);
130336322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li            if (baseIntent != null) {
130436322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li                dest.writeInt(1);
130536322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li                baseIntent.writeToParcel(dest, 0);
130636322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li            } else {
130736322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li                dest.writeInt(0);
1308c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li            }
1309c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li            ComponentName.writeToParcel(origActivity, dest);
1310c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li            ComponentName.writeToParcel(realActivity, dest);
1311c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li            TextUtils.writeToParcel(description, dest,
1312c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li                    Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
1313c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li            if (taskDescription != null) {
1314c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li                dest.writeInt(1);
1315699fe9397974685e6b2c73f9a3a0eb9e5a5a2ccfWu-cheng Li                taskDescription.writeToParcel(dest, 0);
1316d45cb72ac0d7d57829ffc9223decb89a5fc42ce2Wu-cheng Li            } else {
1317d45cb72ac0d7d57829ffc9223decb89a5fc42ce2Wu-cheng Li                dest.writeInt(0);
1318d45cb72ac0d7d57829ffc9223decb89a5fc42ce2Wu-cheng Li            }
1319d45cb72ac0d7d57829ffc9223decb89a5fc42ce2Wu-cheng Li            dest.writeInt(stackId);
1320d45cb72ac0d7d57829ffc9223decb89a5fc42ce2Wu-cheng Li            dest.writeInt(userId);
1321d45cb72ac0d7d57829ffc9223decb89a5fc42ce2Wu-cheng Li            dest.writeLong(firstActiveTime);
1322d45cb72ac0d7d57829ffc9223decb89a5fc42ce2Wu-cheng Li            dest.writeLong(lastActiveTime);
1323d45cb72ac0d7d57829ffc9223decb89a5fc42ce2Wu-cheng Li            dest.writeInt(affiliatedTaskId);
1324d45cb72ac0d7d57829ffc9223decb89a5fc42ce2Wu-cheng Li            dest.writeInt(affiliatedTaskColor);
1325d45cb72ac0d7d57829ffc9223decb89a5fc42ce2Wu-cheng Li            ComponentName.writeToParcel(baseActivity, dest);
1326d45cb72ac0d7d57829ffc9223decb89a5fc42ce2Wu-cheng Li            ComponentName.writeToParcel(topActivity, dest);
1327699fe9397974685e6b2c73f9a3a0eb9e5a5a2ccfWu-cheng Li            dest.writeInt(numActivities);
1328e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li            if (bounds != null) {
1329e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li                dest.writeInt(1);
1330e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li                bounds.writeToParcel(dest, 0);
1331e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li            } else {
1332e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li                dest.writeInt(0);
1333e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li            }
1334e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li            dest.writeInt(isDockable ? 1 : 0);
1335e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li        }
1336e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li
1337e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li        public void readFromParcel(Parcel source) {
1338e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li            id = source.readInt();
1339e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li            persistentId = source.readInt();
1340e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li            baseIntent = source.readInt() > 0 ? Intent.CREATOR.createFromParcel(source) : null;
1341e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li            origActivity = ComponentName.readFromParcel(source);
1342e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li            realActivity = ComponentName.readFromParcel(source);
1343e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li            description = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source);
1344e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li            taskDescription = source.readInt() > 0 ?
1345e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li                    TaskDescription.CREATOR.createFromParcel(source) : null;
1346e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li            stackId = source.readInt();
1347ca099614841bc619f217dfa088da630a7eb1ab65Wu-cheng Li            userId = source.readInt();
1348454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li            firstActiveTime = source.readLong();
1349454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li            lastActiveTime = source.readLong();
1350454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li            affiliatedTaskId = source.readInt();
1351454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li            affiliatedTaskColor = source.readInt();
1352454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li            baseActivity = ComponentName.readFromParcel(source);
1353454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li            topActivity = ComponentName.readFromParcel(source);
1354454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li            numActivities = source.readInt();
1355454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li            bounds = source.readInt() > 0 ?
1356454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li                    Rect.CREATOR.createFromParcel(source) : null;
1357454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li            isDockable = source.readInt() == 1;
1358454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li        }
1359454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li
1360454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li        public static final Creator<RecentTaskInfo> CREATOR
13619b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li                = new Creator<RecentTaskInfo>() {
13629b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            public RecentTaskInfo createFromParcel(Parcel source) {
13639b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li                return new RecentTaskInfo(source);
1364eb68c46a40c773eb56ef7bcf8e7ece5c6a5a8d23Chih-Chung Chang            }
13659b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            public RecentTaskInfo[] newArray(int size) {
13669b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li                return new RecentTaskInfo[size];
13679b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            }
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private RecentTaskInfo(Parcel source) {
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            readFromParcel(source);
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Flag for use with {@link #getRecentTasks}: return all tasks, even those
13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that have set their
13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.content.Intent#FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS} flag.
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int RECENT_WITH_EXCLUDED = 0x0001;
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Provides a list that does not contain any
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * recent tasks that currently are not available to the user.
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int RECENT_IGNORE_UNAVAILABLE = 0x0002;
13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Provides a list that contains recent tasks for all
13909b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * profiles of a user.
13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int RECENT_INCLUDE_PROFILES = 0x0004;
13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Ignores all tasks that are on the home stack.
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int RECENT_IGNORE_HOME_STACK_TASKS = 0x0008;
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Ignores all tasks that are on the docked stack.
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int RECENT_INGORE_DOCKED_STACK_TASKS = 0x0010;
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14089b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * Ignores all tasks that are on the pinned stack.
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14119b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    public static final int RECENT_INGORE_PINNED_STACK_TASKS = 0x0020;
14129b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p></p>Return a list of the tasks that the user has recently launched, with
14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the most recent being first and older ones after in order.
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14179b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * <p><b>Note: this method is only intended for debugging and presenting
14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * task management user interfaces</b>.  This should never be used for
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * core logic in an application, such as deciding between different
14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * behaviors based on the information found here.  Such uses are
14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <em>not</em> supported, and will likely break in the future.  For
14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * example, if multiple applications can be actively running at the
14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * same time, assumptions made about the meaning of the data here for
14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * purposes of control flow will be incorrect.</p>
14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @deprecated As of {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this method is
14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * no longer available to third party applications: the introduction of
14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * document-centric recents means
14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * it can leak personal information to the caller.  For backwards compatibility,
14309b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * it will still return a small subset of its data: at least the caller's
14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * own tasks (though see {@link #getAppTasks()} for the correct supported
14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * way to retrieve that information), and possibly some other tasks
14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * such as home that are known to not be sensitive.
14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param maxNum The maximum number of entries to return in the list.  The
14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * actual number returned may be smaller, depending on how many tasks the
14379b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * user has started and the maximum number the system can remember.
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param flags Information about what to return.  May be any combination
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of {@link #RECENT_WITH_EXCLUDED} and {@link #RECENT_IGNORE_UNAVAILABLE}.
14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns a list of RecentTaskInfo records describing each of
14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the recent tasks.
14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Deprecated
14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public List<RecentTaskInfo> getRecentTasks(int maxNum, int flags)
14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws SecurityException {
14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().getRecentTasks(maxNum,
14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    flags, UserHandle.myUserId());
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw e.rethrowFromSystemServer();
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14569b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * Same as {@link #getRecentTasks(int, int)} but returns the recent tasks for a
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * specific user. It requires holding
14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the {@link android.Manifest.permission#INTERACT_ACROSS_USERS_FULL} permission.
14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param maxNum The maximum number of entries to return in the list.  The
14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * actual number returned may be smaller, depending on how many tasks the
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * user has started and the maximum number the system can remember.
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param flags Information about what to return.  May be any combination
14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of {@link #RECENT_WITH_EXCLUDED} and {@link #RECENT_IGNORE_UNAVAILABLE}.
14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns a list of RecentTaskInfo records describing each of
14669b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * the recent tasks. Most recently activated tasks go first.
14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public List<RecentTaskInfo> getRecentTasksForUser(int maxNum, int flags, int userId)
14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws SecurityException {
14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().getRecentTasks(maxNum,
14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    flags, userId);
14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
14769b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            throw e.rethrowFromSystemServer();
14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Information you can retrieve about a particular task that is currently
14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * "running" in the system.  Note that a running task does not mean the
14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * given task actually has a process it is actively running in; it simply
14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * means that the user has gone to it and never closed it, but currently
14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the system may have killed its process and is only holding on to its
14869b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * last state in order to restart it when the user returns.
1487c157e0cd161e5b3b28b72bafebb3360ed856a608Wu-cheng Li     */
1488c157e0cd161e5b3b28b72bafebb3360ed856a608Wu-cheng Li    public static class RunningTaskInfo implements Parcelable {
1489c157e0cd161e5b3b28b72bafebb3360ed856a608Wu-cheng Li        /**
1490c157e0cd161e5b3b28b72bafebb3360ed856a608Wu-cheng Li         * A unique identifier for this task.
1491c157e0cd161e5b3b28b72bafebb3360ed856a608Wu-cheng Li         */
1492c157e0cd161e5b3b28b72bafebb3360ed856a608Wu-cheng Li        public int id;
1493c157e0cd161e5b3b28b72bafebb3360ed856a608Wu-cheng Li
1494c157e0cd161e5b3b28b72bafebb3360ed856a608Wu-cheng Li        /**
1495c157e0cd161e5b3b28b72bafebb3360ed856a608Wu-cheng Li         * The stack that currently contains this task.
1496c157e0cd161e5b3b28b72bafebb3360ed856a608Wu-cheng Li         * @hide
1497c157e0cd161e5b3b28b72bafebb3360ed856a608Wu-cheng Li         */
14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int stackId;
14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1500c157e0cd161e5b3b28b72bafebb3360ed856a608Wu-cheng Li        /**
1501c157e0cd161e5b3b28b72bafebb3360ed856a608Wu-cheng Li         * The component launched as the first activity in the task.  This can
1502c157e0cd161e5b3b28b72bafebb3360ed856a608Wu-cheng Li         * be considered the "application" of this task.
1503c157e0cd161e5b3b28b72bafebb3360ed856a608Wu-cheng Li         */
15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ComponentName baseActivity;
15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
15079b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         * The activity component at the top of the history stack of the task.
15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * This is what the user is currently doing.
15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ComponentName topActivity;
15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15129b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        /**
1513dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong         * Thumbnail representation of the task's current state.  Currently
15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * always null.
15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Bitmap thumbnail;
15179b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
15189b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        /**
15199b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         * Description of the task's current state.
15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
15219b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public CharSequence description;
15229b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
15239b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        /**
15243f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li         * Number of activities in this task.
15259c79938d47a3caa06e5fb956955374f30c55992bWu-cheng Li         */
15269b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public int numActivities;
15279b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
15289b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        /**
15299b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         * Number of activities that are currently running (not stopped
15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * and persisted) in this task.
15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int numRunning;
1533dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong
1534dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong        /**
1535dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong         * Last time task was run. For sorting.
1536dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong         * @hide
1537dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong         */
1538dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong        public long lastActiveTime;
1539dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong
1540dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong        /**
1541dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong         * True if the task can go in the docked stack.
1542dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong         * @hide
1543dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong         */
1544dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong        public boolean isDockable;
1545dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong
1546dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong        public RunningTaskInfo() {
1547dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong        }
1548dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong
1549dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong        public int describeContents() {
1550dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong            return 0;
1551dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong        }
1552dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong
1553dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong        public void writeToParcel(Parcel dest, int flags) {
1554dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong            dest.writeInt(id);
1555dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong            dest.writeInt(stackId);
1556dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong            ComponentName.writeToParcel(baseActivity, dest);
1557dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong            ComponentName.writeToParcel(topActivity, dest);
1558dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong            if (thumbnail != null) {
1559dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong                dest.writeInt(1);
1560dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong                thumbnail.writeToParcel(dest, 0);
1561dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong            } else {
1562dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong                dest.writeInt(0);
1563dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong            }
1564dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong            TextUtils.writeToParcel(description, dest,
1565dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong                    Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
1566dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong            dest.writeInt(numActivities);
1567dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong            dest.writeInt(numRunning);
1568dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong        }
1569dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong
1570dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong        public void readFromParcel(Parcel source) {
1571dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong            id = source.readInt();
1572dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong            stackId = source.readInt();
15734c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li            baseActivity = ComponentName.readFromParcel(source);
15744c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li            topActivity = ComponentName.readFromParcel(source);
15754c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li            if (source.readInt() != 0) {
15769b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li                thumbnail = Bitmap.CREATOR.createFromParcel(source);
1577c157e0cd161e5b3b28b72bafebb3360ed856a608Wu-cheng Li            } else {
1578c157e0cd161e5b3b28b72bafebb3360ed856a608Wu-cheng Li                thumbnail = null;
1579c157e0cd161e5b3b28b72bafebb3360ed856a608Wu-cheng Li            }
15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            description = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source);
15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            numActivities = source.readInt();
1582c157e0cd161e5b3b28b72bafebb3360ed856a608Wu-cheng Li            numRunning = source.readInt();
15839b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        }
15849b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
15859b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public static final Creator<RunningTaskInfo> CREATOR = new Creator<RunningTaskInfo>() {
15869b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            public RunningTaskInfo createFromParcel(Parcel source) {
15879b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li                return new RunningTaskInfo(source);
15889b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            }
15899b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            public RunningTaskInfo[] newArray(int size) {
15909b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li                return new RunningTaskInfo[size];
15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15929b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        };
15939b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private RunningTaskInfo(Parcel source) {
15959b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            readFromParcel(source);
15969b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        }
15979b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    }
15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Get the list of tasks associated with the calling application.
16014c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li     *
16024c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li     * @return The list of tasks associated with the application making this call.
16033f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li     * @throws SecurityException
16044c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li     */
16054c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li    public List<ActivityManager.AppTask> getAppTasks() {
16064c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li        ArrayList<AppTask> tasks = new ArrayList<AppTask>();
16074c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li        List<IAppTask> appTasks;
16084c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li        try {
16094c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li            appTasks = ActivityManagerNative.getDefault().getAppTasks(mContext.getPackageName());
16104c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li        } catch (RemoteException e) {
16114c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li            throw e.rethrowFromSystemServer();
16124c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li        }
16139b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        int numAppTasks = appTasks.size();
16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < numAppTasks; i++) {
16159b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            tasks.add(new AppTask(appTasks.get(i)));
16169b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        }
16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return tasks;
16189b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    }
16199b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the current design dimensions for {@link AppTask} thumbnails, for use
16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * with {@link #addAppTask}.
16239b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     */
16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Size getAppTaskThumbnailSize() {
16259b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        synchronized (this) {
16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ensureAppTaskThumbnailSizeLocked();
16279b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            return new Size(mAppTaskThumbnailSize.x, mAppTaskThumbnailSize.y);
16289b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        }
16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void ensureAppTaskThumbnailSizeLocked() {
16329b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        if (mAppTaskThumbnailSize == null) {
16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
16349b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li                mAppTaskThumbnailSize = ActivityManagerNative.getDefault().getAppTaskThumbnailSize();
16359b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            } catch (RemoteException e) {
16369b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li                throw e.rethrowFromSystemServer();
16379b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            }
16389b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        }
16399b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    }
16409b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
16419b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    /**
16429b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * Add a new {@link AppTask} for the calling application.  This will create a new
16439b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * recents entry that is added to the <b>end</b> of all existing recents.
16449b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     *
16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param activity The activity that is adding the entry.   This is used to help determine
16469b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * the context that the new recents entry will be in.
16479b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * @param intent The Intent that describes the recents entry.  This is the same Intent that
16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * you would have used to launch the activity for it.  In generally you will want to set
16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * both {@link Intent#FLAG_ACTIVITY_NEW_DOCUMENT} and
16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link Intent#FLAG_ACTIVITY_RETAIN_IN_RECENTS}; the latter is required since this recents
1651a18e90176a8e2442837d0503fbfd4adb9df0818fWu-cheng Li     * entry will exist without an activity, so it doesn't make sense to not retain it when
1652a18e90176a8e2442837d0503fbfd4adb9df0818fWu-cheng Li     * its activity disappears.  The given Intent here also must have an explicit ComponentName
16539b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * set on it.
16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param description Optional additional description information.
16555f1e69c76ef5886ed65e303490c5f660da4756efWu-cheng Li     * @param thumbnail Thumbnail to use for the recents entry.  Should be the size given by
16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getAppTaskThumbnailSize()}.  If the bitmap is not that exact size, it will be
16575f1e69c76ef5886ed65e303490c5f660da4756efWu-cheng Li     * recreated in your process, probably in a way you don't like, before the recents entry
16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is added.
16599b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     *
16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the task id of the newly added app task, or -1 if the add failed.  The
16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * most likely cause of failure is that there is no more room for more tasks for your app.
16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1663a18e90176a8e2442837d0503fbfd4adb9df0818fWu-cheng Li    public int addAppTask(@NonNull Activity activity, @NonNull Intent intent,
1664a18e90176a8e2442837d0503fbfd4adb9df0818fWu-cheng Li            @Nullable TaskDescription description, @NonNull Bitmap thumbnail) {
1665a18e90176a8e2442837d0503fbfd4adb9df0818fWu-cheng Li        Point size;
16669b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        synchronized (this) {
16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ensureAppTaskThumbnailSizeLocked();
16685f1e69c76ef5886ed65e303490c5f660da4756efWu-cheng Li            size = mAppTaskThumbnailSize;
16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16705f1e69c76ef5886ed65e303490c5f660da4756efWu-cheng Li        final int tw = thumbnail.getWidth();
16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int th = thumbnail.getHeight();
16729b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        if (tw != size.x || th != size.y) {
16739b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            Bitmap bm = Bitmap.createBitmap(size.x, size.y, thumbnail.getConfig());
16749b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
16759b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            // Use ScaleType.CENTER_CROP, except we leave the top edge at the top.
16769b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            float scale;
16779b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            float dx = 0, dy = 0;
16783f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li            if (tw * size.x > size.y * th) {
16793f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li                scale = (float) size.x / (float) th;
16805f1e69c76ef5886ed65e303490c5f660da4756efWu-cheng Li                dx = (size.y - tw * scale) * 0.5f;
16819b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            } else {
16825f1e69c76ef5886ed65e303490c5f660da4756efWu-cheng Li                scale = (float) size.y / (float) tw;
16839b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li                dy = (size.x - th * scale) * 0.5f;
16849b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            }
16859b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            Matrix matrix = new Matrix();
16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            matrix.setScale(scale, scale);
16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            matrix.postTranslate((int) (dx + 0.5f), 0);
16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1689454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li            Canvas canvas = new Canvas(bm);
16901620d118a49dc6df7b0e83d7343f8a8bb6e23b12Wu-cheng Li            canvas.drawBitmap(thumbnail, matrix, null);
1691454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li            canvas.setBitmap(null);
1692454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li
1693454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li            thumbnail = bm;
1694454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li        }
1695454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li        if (description == null) {
1696454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li            description = new TaskDescription();
1697454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li        }
1698454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li        try {
1699454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li            return ActivityManagerNative.getDefault().addAppTask(activity.getActivityToken(),
1700454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li                    intent, description, thumbnail);
1701454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li        } catch (RemoteException e) {
1702454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li            throw e.rethrowFromSystemServer();
1703454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li        }
1704454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    }
1705454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li
1706454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    /**
1707454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li     * Return a list of the tasks that are currently running, with
1708454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li     * the most recent being first and older ones after in order.  Note that
1709454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li     * "running" does not mean any of the task's code is currently loaded or
1710454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li     * activity -- the task may have been frozen by the system, so that it
1711454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li     * can be restarted in its previous state when next brought to the
1712454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li     * foreground.
1713454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li     *
1714454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li     * <p><b>Note: this method is only intended for debugging and presenting
1715454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li     * task management user interfaces</b>.  This should never be used for
17165f1e69c76ef5886ed65e303490c5f660da4756efWu-cheng Li     * core logic in an application, such as deciding between different
1717454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li     * behaviors based on the information found here.  Such uses are
1718454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li     * <em>not</em> supported, and will likely break in the future.  For
1719454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li     * example, if multiple applications can be actively running at the
1720454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li     * same time, assumptions made about the meaning of the data here for
1721454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li     * purposes of control flow will be incorrect.</p>
1722454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li     *
1723454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li     * @deprecated As of {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this method
1724454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li     * is no longer available to third party
1725454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li     * applications: the introduction of document-centric recents means
1726454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li     * it can leak person information to the caller.  For backwards compatibility,
1727454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li     * it will still retu rn a small subset of its data: at least the caller's
1728454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li     * own tasks, and possibly some other tasks
1729454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li     * such as home that are known to not be sensitive.
1730454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li     *
1731454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li     * @param maxNum The maximum number of entries to return in the list.  The
1732454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li     * actual number returned may be smaller, depending on how many tasks the
1733454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li     * user has started.
1734454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li     *
1735454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li     * @return Returns a list of RunningTaskInfo records describing each of
1736454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li     * the running tasks.
1737454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li     */
1738454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    @Deprecated
1739454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    public List<RunningTaskInfo> getRunningTasks(int maxNum)
1740454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li            throws SecurityException {
1741454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li        try {
1742454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li            return ActivityManagerNative.getDefault().getTasks(maxNum, 0);
1743454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li        } catch (RemoteException e) {
17447478ea6848c0059e65a4089b4ec2ff4158520870Wu-cheng Li            throw e.rethrowFromSystemServer();
1745da0a56df963353a1f1bd1914fa31f870d982dd5aScott Main        }
1746a696f5d667227365da732481770767dcb330dd23Mathias Agopian    }
1747df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main
17487478ea6848c0059e65a4089b4ec2ff4158520870Wu-cheng Li    /**
1749df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main     * Completely remove the given task.
1750a696f5d667227365da732481770767dcb330dd23Mathias Agopian     *
1751a696f5d667227365da732481770767dcb330dd23Mathias Agopian     * @param taskId Identifier of the task to be removed.
1752a696f5d667227365da732481770767dcb330dd23Mathias Agopian     * @return Returns true if the given task was found and removed.
1753a696f5d667227365da732481770767dcb330dd23Mathias Agopian     *
1754a696f5d667227365da732481770767dcb330dd23Mathias Agopian     * @hide
17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean removeTask(int taskId) throws SecurityException {
17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().removeTask(taskId);
17599b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        } catch (RemoteException e) {
17609b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            throw e.rethrowFromSystemServer();
17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17639b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Metadata related to the {@link TaskThumbnail}.
17669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
17673f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li     * @hide
17689b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     */
17697478ea6848c0059e65a4089b4ec2ff4158520870Wu-cheng Li    public static class TaskThumbnailInfo implements Parcelable {
17703f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li        /** @hide */
17713f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li        public static final String ATTR_TASK_THUMBNAILINFO_PREFIX = "task_thumbnailinfo_";
17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private static final String ATTR_TASK_WIDTH =
17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ATTR_TASK_THUMBNAILINFO_PREFIX + "task_width";
17749b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        private static final String ATTR_TASK_HEIGHT =
17759b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li                ATTR_TASK_THUMBNAILINFO_PREFIX + "task_height";
17769b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        private static final String ATTR_SCREEN_ORIENTATION =
17779b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li                ATTR_TASK_THUMBNAILINFO_PREFIX + "screen_orientation";
17789b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
17799b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public int taskWidth;
17803f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li        public int taskHeight;
17813f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li        public int screenOrientation;
17823f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li
17839b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public TaskThumbnailInfo() {
17849b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            // Do nothing
17859b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        }
1786eb68c46a40c773eb56ef7bcf8e7ece5c6a5a8d23Chih-Chung Chang
1787eb68c46a40c773eb56ef7bcf8e7ece5c6a5a8d23Chih-Chung Chang        private TaskThumbnailInfo(Parcel source) {
1788eb68c46a40c773eb56ef7bcf8e7ece5c6a5a8d23Chih-Chung Chang            readFromParcel(source);
1789a696f5d667227365da732481770767dcb330dd23Mathias Agopian        }
1790eb68c46a40c773eb56ef7bcf8e7ece5c6a5a8d23Chih-Chung Chang
1791eb68c46a40c773eb56ef7bcf8e7ece5c6a5a8d23Chih-Chung Chang        /**
1792eb68c46a40c773eb56ef7bcf8e7ece5c6a5a8d23Chih-Chung Chang         * Resets this info state to the initial state.
17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @hide
17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void reset() {
17969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            taskWidth = 0;
17979b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            taskHeight = 0;
1798c157e0cd161e5b3b28b72bafebb3360ed856a608Wu-cheng Li            screenOrientation = 0;
1799c157e0cd161e5b3b28b72bafebb3360ed856a608Wu-cheng Li        }
1800c157e0cd161e5b3b28b72bafebb3360ed856a608Wu-cheng Li
18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** @hide */
18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void saveToXml(XmlSerializer out) throws IOException {
1803c157e0cd161e5b3b28b72bafebb3360ed856a608Wu-cheng Li            out.attribute(null, ATTR_TASK_WIDTH, Integer.toString(taskWidth));
1804c157e0cd161e5b3b28b72bafebb3360ed856a608Wu-cheng Li            out.attribute(null, ATTR_TASK_HEIGHT, Integer.toString(taskHeight));
18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.attribute(null, ATTR_SCREEN_ORIENTATION, Integer.toString(screenOrientation));
18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18089b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        /** @hide */
18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void restoreFromXml(String attrName, String attrValue) {
18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ATTR_TASK_WIDTH.equals(attrName)) {
18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                taskWidth = Integer.parseInt(attrValue);
18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (ATTR_TASK_HEIGHT.equals(attrName)) {
18139b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li                taskHeight = Integer.parseInt(attrValue);
18149b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            } else if (ATTR_SCREEN_ORIENTATION.equals(attrName)) {
18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                screenOrientation = Integer.parseInt(attrValue);
18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18189b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
18199b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public int describeContents() {
18209b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            return 0;
18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18229b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
18239b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public void writeToParcel(Parcel dest, int flags) {
18249b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            dest.writeInt(taskWidth);
18253f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li            dest.writeInt(taskHeight);
18263f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li            dest.writeInt(screenOrientation);
18279b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        }
18289b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
18299b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public void readFromParcel(Parcel source) {
18309b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            taskWidth = source.readInt();
18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            taskHeight = source.readInt();
18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            screenOrientation = source.readInt();
18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18359b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public static final Creator<TaskThumbnailInfo> CREATOR = new Creator<TaskThumbnailInfo>() {
18369b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            public TaskThumbnailInfo createFromParcel(Parcel source) {
1837a696f5d667227365da732481770767dcb330dd23Mathias Agopian                return new TaskThumbnailInfo(source);
1838a696f5d667227365da732481770767dcb330dd23Mathias Agopian            }
1839a696f5d667227365da732481770767dcb330dd23Mathias Agopian            public TaskThumbnailInfo[] newArray(int size) {
1840a696f5d667227365da732481770767dcb330dd23Mathias Agopian                return new TaskThumbnailInfo[size];
18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18459b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    /** @hide */
18469b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    public static class TaskThumbnail implements Parcelable {
18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Bitmap mainThumbnail;
18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ParcelFileDescriptor thumbnailFileDescriptor;
18499b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public TaskThumbnailInfo thumbnailInfo;
18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public TaskThumbnail() {
18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18549b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        private TaskThumbnail(Parcel source) {
18553f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li            readFromParcel(source);
18563f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li        }
18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int describeContents() {
18599b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            if (thumbnailFileDescriptor != null) {
18609b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li                return thumbnailFileDescriptor.describeContents();
18619b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            }
18629b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            return 0;
18639b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        }
18649b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
18653f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li        public void writeToParcel(Parcel dest, int flags) {
18663f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li            if (mainThumbnail != null) {
18673f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li                dest.writeInt(1);
18689b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li                mainThumbnail.writeToParcel(dest, flags);
18699b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            } else {
18709c79938d47a3caa06e5fb956955374f30c55992bWu-cheng Li                dest.writeInt(0);
18719c79938d47a3caa06e5fb956955374f30c55992bWu-cheng Li            }
18729c79938d47a3caa06e5fb956955374f30c55992bWu-cheng Li            if (thumbnailFileDescriptor != null) {
18739c79938d47a3caa06e5fb956955374f30c55992bWu-cheng Li                dest.writeInt(1);
1874a696f5d667227365da732481770767dcb330dd23Mathias Agopian                thumbnailFileDescriptor.writeToParcel(dest, flags);
18759c79938d47a3caa06e5fb956955374f30c55992bWu-cheng Li            } else {
18769c79938d47a3caa06e5fb956955374f30c55992bWu-cheng Li                dest.writeInt(0);
18779c79938d47a3caa06e5fb956955374f30c55992bWu-cheng Li            }
18789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (thumbnailInfo != null) {
18799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                dest.writeInt(1);
18809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                thumbnailInfo.writeToParcel(dest, flags);
18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
1882a696f5d667227365da732481770767dcb330dd23Mathias Agopian                dest.writeInt(0);
1883a696f5d667227365da732481770767dcb330dd23Mathias Agopian            }
1884a696f5d667227365da732481770767dcb330dd23Mathias Agopian        }
1885a696f5d667227365da732481770767dcb330dd23Mathias Agopian
1886a696f5d667227365da732481770767dcb330dd23Mathias Agopian        public void readFromParcel(Parcel source) {
1887a696f5d667227365da732481770767dcb330dd23Mathias Agopian            if (source.readInt() != 0) {
18889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mainThumbnail = Bitmap.CREATOR.createFromParcel(source);
18899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
18909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mainThumbnail = null;
18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (source.readInt() != 0) {
1893a696f5d667227365da732481770767dcb330dd23Mathias Agopian                thumbnailFileDescriptor = ParcelFileDescriptor.CREATOR.createFromParcel(source);
18949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
18959b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li                thumbnailFileDescriptor = null;
1896a696f5d667227365da732481770767dcb330dd23Mathias Agopian            }
18979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (source.readInt() != 0) {
18989b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li                thumbnailInfo = TaskThumbnailInfo.CREATOR.createFromParcel(source);
1899a696f5d667227365da732481770767dcb330dd23Mathias Agopian            } else {
19009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                thumbnailInfo = null;
1901eb68c46a40c773eb56ef7bcf8e7ece5c6a5a8d23Chih-Chung Chang            }
1902a696f5d667227365da732481770767dcb330dd23Mathias Agopian        }
1903eb68c46a40c773eb56ef7bcf8e7ece5c6a5a8d23Chih-Chung Chang
19049b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public static final Creator<TaskThumbnail> CREATOR = new Creator<TaskThumbnail>() {
1905a696f5d667227365da732481770767dcb330dd23Mathias Agopian            public TaskThumbnail createFromParcel(Parcel source) {
19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new TaskThumbnail(source);
19079b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            }
1908a696f5d667227365da732481770767dcb330dd23Mathias Agopian            public TaskThumbnail[] newArray(int size) {
19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new TaskThumbnail[size];
1910a696f5d667227365da732481770767dcb330dd23Mathias Agopian            }
19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19139b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
19142fb818ca7dd53d00646854a2473f1a69be43067cWu-cheng Li    /** @hide */
19152fb818ca7dd53d00646854a2473f1a69be43067cWu-cheng Li    public TaskThumbnail getTaskThumbnail(int id) throws SecurityException {
19162fb818ca7dd53d00646854a2473f1a69be43067cWu-cheng Li        try {
19172fb818ca7dd53d00646854a2473f1a69be43067cWu-cheng Li            return ActivityManagerNative.getDefault().getTaskThumbnail(id);
19182fb818ca7dd53d00646854a2473f1a69be43067cWu-cheng Li        } catch (RemoteException e) {
19192fb818ca7dd53d00646854a2473f1a69be43067cWu-cheng Li            throw e.rethrowFromSystemServer();
19202fb818ca7dd53d00646854a2473f1a69be43067cWu-cheng Li        }
19219b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    }
192269ea4e15e52c456537575d21443ac1efdb03a902Brad Fitzpatrick
19232fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li    /** @hide */
19242fb818ca7dd53d00646854a2473f1a69be43067cWu-cheng Li    public boolean isInHomeStack(int taskId) {
19252fb818ca7dd53d00646854a2473f1a69be43067cWu-cheng Li        try {
19262fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li            return ActivityManagerNative.getDefault().isInHomeStack(taskId);
192769ea4e15e52c456537575d21443ac1efdb03a902Brad Fitzpatrick        } catch (RemoteException e) {
19282fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li            throw e.rethrowFromSystemServer();
19292fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li        }
19302fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li    }
19312fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li
19329b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    /**
193369ea4e15e52c456537575d21443ac1efdb03a902Brad Fitzpatrick     * Flag for {@link #moveTaskToFront(int, int)}: also move the "home"
19342fb818ca7dd53d00646854a2473f1a69be43067cWu-cheng Li     * activity along with the task, so it is positioned immediately behind
19352fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li     * the task.
19362fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li     */
19372fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li    public static final int MOVE_TASK_WITH_HOME = 0x00000001;
19382fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li
19392fb818ca7dd53d00646854a2473f1a69be43067cWu-cheng Li    /**
194069ea4e15e52c456537575d21443ac1efdb03a902Brad Fitzpatrick     * Flag for {@link #moveTaskToFront(int, int)}: don't count this as a
19412fb818ca7dd53d00646854a2473f1a69be43067cWu-cheng Li     * user-instigated action, so the current activity will not receive a
194269ea4e15e52c456537575d21443ac1efdb03a902Brad Fitzpatrick     * hint that the user is leaving.
19432fb818ca7dd53d00646854a2473f1a69be43067cWu-cheng Li     */
19442fb818ca7dd53d00646854a2473f1a69be43067cWu-cheng Li    public static final int MOVE_TASK_NO_USER_ACTION = 0x00000002;
19452fb818ca7dd53d00646854a2473f1a69be43067cWu-cheng Li
19462fb818ca7dd53d00646854a2473f1a69be43067cWu-cheng Li    /**
19472fb818ca7dd53d00646854a2473f1a69be43067cWu-cheng Li     * Equivalent to calling {@link #moveTaskToFront(int, int, Bundle)}
19482fb818ca7dd53d00646854a2473f1a69be43067cWu-cheng Li     * with a null options argument.
19492fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li     *
19502fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li     * @param taskId The identifier of the task to be moved, as found in
19512fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li     * {@link RunningTaskInfo} or {@link RecentTaskInfo}.
19522fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li     * @param flags Additional operational flags, 0 or more of
19532fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li     * {@link #MOVE_TASK_WITH_HOME}, {@link #MOVE_TASK_NO_USER_ACTION}.
19542fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li     */
19552fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li    public void moveTaskToFront(int taskId, int flags) {
19562fb818ca7dd53d00646854a2473f1a69be43067cWu-cheng Li        moveTaskToFront(taskId, flags, null);
195769ea4e15e52c456537575d21443ac1efdb03a902Brad Fitzpatrick    }
19582fb818ca7dd53d00646854a2473f1a69be43067cWu-cheng Li
19592fb818ca7dd53d00646854a2473f1a69be43067cWu-cheng Li    /**
19602fb818ca7dd53d00646854a2473f1a69be43067cWu-cheng Li     * Ask that the task associated with a given task ID be moved to the
19612fb818ca7dd53d00646854a2473f1a69be43067cWu-cheng Li     * front of the stack, so it is now visible to the user.  Requires that
19629b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * the caller hold permission {@link android.Manifest.permission#REORDER_TASKS}
19639b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * or a SecurityException will be thrown.
19642fb818ca7dd53d00646854a2473f1a69be43067cWu-cheng Li     *
19659b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * @param taskId The identifier of the task to be moved, as found in
19669b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * {@link RunningTaskInfo} or {@link RecentTaskInfo}.
19679b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * @param flags Additional operational flags, 0 or more of
19689b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * {@link #MOVE_TASK_WITH_HOME}, {@link #MOVE_TASK_NO_USER_ACTION}.
19699b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * @param options Additional options for the operation, either null or
19709b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * as per {@link Context#startActivity(Intent, android.os.Bundle)
19719b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * Context.startActivity(Intent, Bundle)}.
19729b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     */
19739b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    public void moveTaskToFront(int taskId, int flags, Bundle options) {
19749b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        try {
19759b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            ActivityManagerNative.getDefault().moveTaskToFront(taskId, flags, options);
19769b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        } catch (RemoteException e) {
19779b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            throw e.rethrowFromSystemServer();
19789b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        }
19799b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    }
19809b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
19819b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    /**
19829b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * Information you can retrieve about a particular Service that is
19839b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * currently running in the system.
19849b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     */
19859b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    public static class RunningServiceInfo implements Parcelable {
19869b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        /**
19879b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         * The service component.
19889b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         */
19899b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public ComponentName service;
19909b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
19919b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        /**
19929b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         * If non-zero, this is the process the service is running in.
19939b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         */
19949b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public int pid;
19959b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
19969b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        /**
19979b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         * The UID that owns this service.
19989b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         */
19999b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public int uid;
20009b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
20019b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        /**
20029b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         * The name of the process this service runs in.
20039b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         */
20049b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public String process;
20059b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
20069b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        /**
20079b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         * Set to true if the service has asked to run as a foreground process.
20089b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         */
20099b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public boolean foreground;
20109b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
20119b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        /**
20129b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         * The time when the service was first made active, either by someone
20139b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         * starting or binding to it.  This
20149b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         * is in units of {@link android.os.SystemClock#elapsedRealtime()}.
20159b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         */
2016e208377fbab6b90f41e68699700942a81f4caaebRay Chen        public long activeSince;
2017055c986ab841f8f758398841730f1e90313b132aRay Chen
2018055c986ab841f8f758398841730f1e90313b132aRay Chen        /**
2019055c986ab841f8f758398841730f1e90313b132aRay Chen         * Set to true if this service has been explicitly started.
2020055c986ab841f8f758398841730f1e90313b132aRay Chen         */
2021055c986ab841f8f758398841730f1e90313b132aRay Chen        public boolean started;
2022055c986ab841f8f758398841730f1e90313b132aRay Chen
2023055c986ab841f8f758398841730f1e90313b132aRay Chen        /**
2024055c986ab841f8f758398841730f1e90313b132aRay Chen         * Number of clients connected to the service.
2025055c986ab841f8f758398841730f1e90313b132aRay Chen         */
20269b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public int clientCount;
20279b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
20289b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        /**
20299b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         * Number of times the service's process has crashed while the service
20309b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         * is running.
20319b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         */
20329b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public int crashCount;
20339b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
2034055c986ab841f8f758398841730f1e90313b132aRay Chen        /**
20359b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         * The time when there was last activity in the service (either
20369b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         * explicit requests to start it or clients binding to it).  This
20379b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         * is in units of {@link android.os.SystemClock#uptimeMillis()}.
20389b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         */
20399b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public long lastActivityTime;
20403f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li
20413f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li        /**
20423f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li         * If non-zero, this service is not currently running, but scheduled to
20433f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li         * restart at the given time.
20443f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li         */
20453f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li        public long restarting;
20463f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li
20473f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li        /**
20483f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li         * Bit for {@link #flags}: set if this service has been
20493f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li         * explicitly started.
20503f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li         */
20519b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public static final int FLAG_STARTED = 1<<0;
20529b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
20539b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        /**
20549b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         * Bit for {@link #flags}: set if the service has asked to
20559b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         * run as a foreground process.
20569b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         */
20579b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public static final int FLAG_FOREGROUND = 1<<1;
20589b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
20593f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li        /**
20603f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li         * Bit for {@link #flags): set if the service is running in a
20619b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         * core system process.
20629b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         */
20639b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public static final int FLAG_SYSTEM_PROCESS = 1<<2;
20649b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
20659b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        /**
20669b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         * Bit for {@link #flags): set if the service is running in a
20679b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         * persistent process.
20689b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         */
20693f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li        public static final int FLAG_PERSISTENT_PROCESS = 1<<3;
20703f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li
20713f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li        /**
20729b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         * Running flags.
20739b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         */
20749b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public int flags;
20759b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
20769b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        /**
20779b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         * For special services that are bound to by system code, this is
20789b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         * the package that holds the binding.
20799b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         */
20809b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public String clientPackage;
20813f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li
20829b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        /**
20833f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li         * For special services that are bound to by system code, this is
20843f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li         * a string resource providing a user-visible label for who the
20853f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li         * client is.
20863f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li         */
20873f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li        public int clientLabel;
20883f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li
20893f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li        public RunningServiceInfo() {
20903f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li        }
20913f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li
20929b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public int describeContents() {
20939b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            return 0;
20949b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        }
20959b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
20969b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public void writeToParcel(Parcel dest, int flags) {
20979b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            ComponentName.writeToParcel(service, dest);
20989b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            dest.writeInt(pid);
20999b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            dest.writeInt(uid);
21003f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li            dest.writeString(process);
21013f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li            dest.writeInt(foreground ? 1 : 0);
21029b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            dest.writeLong(activeSince);
21039b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            dest.writeInt(started ? 1 : 0);
21049b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            dest.writeInt(clientCount);
21059b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            dest.writeInt(crashCount);
21069b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            dest.writeLong(lastActivityTime);
21079b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            dest.writeLong(restarting);
21089b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            dest.writeInt(this.flags);
21099b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            dest.writeString(clientPackage);
21103f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li            dest.writeInt(clientLabel);
21119b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        }
21123f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li
21139b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public void readFromParcel(Parcel source) {
21149b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            service = ComponentName.readFromParcel(source);
21159b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            pid = source.readInt();
21169b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            uid = source.readInt();
21179b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            process = source.readString();
21189b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            foreground = source.readInt() != 0;
21199b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            activeSince = source.readLong();
21209b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            started = source.readInt() != 0;
21219b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            clientCount = source.readInt();
21229b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            crashCount = source.readInt();
21233f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li            lastActivityTime = source.readLong();
21243f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li            restarting = source.readLong();
21253f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li            flags = source.readInt();
21263f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li            clientPackage = source.readString();
21273f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li            clientLabel = source.readInt();
21283f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li        }
21299b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
21309b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public static final Creator<RunningServiceInfo> CREATOR = new Creator<RunningServiceInfo>() {
21319b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            public RunningServiceInfo createFromParcel(Parcel source) {
21329b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li                return new RunningServiceInfo(source);
21339b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            }
21349b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            public RunningServiceInfo[] newArray(int size) {
21359b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li                return new RunningServiceInfo[size];
21369b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            }
21373f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li        };
21383f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li
21399b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        private RunningServiceInfo(Parcel source) {
21409b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            readFromParcel(source);
21419b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        }
21429b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    }
21439b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
21449b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    /**
21459b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * Return a list of the services that are currently running.
21469b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     *
21473f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li     * <p><b>Note: this method is only intended for debugging or implementing
21483f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li     * service management type user interfaces.</b></p>
21493f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li     *
21509b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * @param maxNum The maximum number of entries to return in the list.  The
21519b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * actual number returned may be smaller, depending on how many services
21529b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * are running.
21539b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     *
21549b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * @return Returns a list of RunningServiceInfo records describing each of
21559b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * the running tasks.
21569b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     */
21579b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    public List<RunningServiceInfo> getRunningServices(int maxNum)
21589b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            throws SecurityException {
21599b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        try {
21609b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            return ActivityManagerNative.getDefault()
21613f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li                    .getServices(maxNum, 0);
21623f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li        } catch (RemoteException e) {
21633f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li            throw e.rethrowFromSystemServer();
21643f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li        }
21653f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li    }
21663f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li
21673f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li    /**
21683f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li     * Returns a PendingIntent you can start to show a control panel for the
21693f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li     * given running service.  If the service does not have a control panel,
21703f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li     * null is returned.
21713f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li     */
21723f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li    public PendingIntent getRunningServiceControlPanel(ComponentName service)
21733f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li            throws SecurityException {
21743f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li        try {
21753f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li            return ActivityManagerNative.getDefault()
21769b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li                    .getRunningServiceControlPanel(service);
21779b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        } catch (RemoteException e) {
21789b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            throw e.rethrowFromSystemServer();
21799b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        }
21809b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    }
21819b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
2182c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li    /**
2183c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li     * Information you can retrieve about the available memory through
2184c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li     * {@link ActivityManager#getMemoryInfo}.
2185c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li     */
2186c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li    public static class MemoryInfo implements Parcelable {
21872988ab7c322aad7508df930204886f334216b65cWu-cheng Li        /**
21882988ab7c322aad7508df930204886f334216b65cWu-cheng Li         * The available memory on the system.  This number should not
21899b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         * be considered absolute: due to the nature of the kernel, a significant
21903f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li         * portion of this memory is actually in use and needed for the overall
21913f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li         * system to run well.
21929b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         */
21939b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public long availMem;
21949b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
21959b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        /**
21969b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         * The total memory accessible by the kernel.  This is basically the
21979b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         * RAM size of the device, not including below-kernel fixed allocations
21989b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         * like DMA buffers, RAM for the baseband CPU, etc.
21999b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         */
22003f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li        public long totalMem;
22013f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li
22023f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li        /**
22039b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         * The threshold of {@link #availMem} at which we consider memory to be
22049b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         * low and start killing background services and other non-extraneous
22059b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         * processes.
22069b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         */
22079b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public long threshold;
22089b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
22099b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        /**
22109b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         * Set to true if the system considers itself to currently be in a low
22119b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         * memory situation.
22123f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li         */
22133f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li        public boolean lowMemory;
22143f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li
22153f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li        /** @hide */
22163f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li        public long hiddenAppThreshold;
22173f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li        /** @hide */
22183f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li        public long secondaryServerThreshold;
22199b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        /** @hide */
22209b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public long visibleAppThreshold;
22219b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        /** @hide */
22229b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public long foregroundAppThreshold;
22239b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
22249b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public MemoryInfo() {
22259b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        }
22269b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
22273f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li        public int describeContents() {
22283f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li            return 0;
22299b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        }
22309b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
22319b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public void writeToParcel(Parcel dest, int flags) {
22329b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            dest.writeLong(availMem);
22339b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            dest.writeLong(totalMem);
22349b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            dest.writeLong(threshold);
22359b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            dest.writeInt(lowMemory ? 1 : 0);
22369b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            dest.writeLong(hiddenAppThreshold);
22373f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li            dest.writeLong(secondaryServerThreshold);
22383f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li            dest.writeLong(visibleAppThreshold);
22393f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li            dest.writeLong(foregroundAppThreshold);
22409b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        }
22419b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
22429b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public void readFromParcel(Parcel source) {
22439b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            availMem = source.readLong();
22449b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            totalMem = source.readLong();
22459b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            threshold = source.readLong();
224636322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li            lowMemory = source.readInt() != 0;
224736322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li            hiddenAppThreshold = source.readLong();
224836322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li            secondaryServerThreshold = source.readLong();
2249699fe9397974685e6b2c73f9a3a0eb9e5a5a2ccfWu-cheng Li            visibleAppThreshold = source.readLong();
2250699fe9397974685e6b2c73f9a3a0eb9e5a5a2ccfWu-cheng Li            foregroundAppThreshold = source.readLong();
2251699fe9397974685e6b2c73f9a3a0eb9e5a5a2ccfWu-cheng Li        }
2252699fe9397974685e6b2c73f9a3a0eb9e5a5a2ccfWu-cheng Li
22533f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li        public static final Creator<MemoryInfo> CREATOR
22543f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li                = new Creator<MemoryInfo>() {
22553f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li            public MemoryInfo createFromParcel(Parcel source) {
22563f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li                return new MemoryInfo(source);
2257f008f3ea82a0518375ee4ea41b32451badffbd95Wu-cheng Li            }
2258d45cb72ac0d7d57829ffc9223decb89a5fc42ce2Wu-cheng Li            public MemoryInfo[] newArray(int size) {
225936322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li                return new MemoryInfo[size];
226036322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li            }
226136322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li        };
226236322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li
226336322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li        private MemoryInfo(Parcel source) {
226436322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li            readFromParcel(source);
226536322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li        }
226636322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li    }
22673f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li
22683f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li    /**
226936322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li     * Return general information about the memory state of the system.  This
227036322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li     * can be used to help decide how to manage your own memory, though note
227136322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li     * that polling is not recommended and
227236322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li     * {@link android.content.ComponentCallbacks2#onTrimMemory(int)
227336322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li     * ComponentCallbacks2.onTrimMemory(int)} is the preferred way to do this.
227436322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li     * Also see {@link #getMyMemoryState} for how to retrieve the current trim
227536322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li     * level of your process as needed, which gives a better hint for how to
227636322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li     * manage its memory.
22773f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li     */
22783f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li    public void getMemoryInfo(MemoryInfo outInfo) {
22793f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li        try {
228036322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li            ActivityManagerNative.getDefault().getMemoryInfo(outInfo);
228136322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li        } catch (RemoteException e) {
228236322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li            throw e.rethrowFromSystemServer();
228336322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li        }
228436322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li    }
228536322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li
228636f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li    /**
22876c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li     * Information you can retrieve about an ActivityStack in the system.
22886c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li     * @hide
22896c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li     */
22906c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li    public static class StackInfo implements Parcelable {
22916c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li        public int stackId;
22926c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li        public Rect bounds = new Rect();
22936c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li        public int[] taskIds;
22946c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li        public String[] taskNames;
22956c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li        public Rect[] taskBounds;
22966c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li        public int[] taskUserIds;
22976c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li        public int displayId;
22986c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li        public int userId;
22996c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li
23006c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li        @Override
23016c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li        public int describeContents() {
23026c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li            return 0;
23036c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li        }
23046c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li
23056c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li        @Override
23066c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li        public void writeToParcel(Parcel dest, int flags) {
23076c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li            dest.writeInt(stackId);
23086c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li            dest.writeInt(bounds.left);
23096c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li            dest.writeInt(bounds.top);
23106c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li            dest.writeInt(bounds.right);
23116c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li            dest.writeInt(bounds.bottom);
23126c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li            dest.writeIntArray(taskIds);
23136c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li            dest.writeStringArray(taskNames);
23146c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li            final int boundsCount = taskBounds == null ? 0 : taskBounds.length;
23156c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li            dest.writeInt(boundsCount);
23166c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li            for (int i = 0; i < boundsCount; i++) {
231724b326a8978bf78e3e560723dde221792784325bWu-cheng Li                dest.writeInt(taskBounds[i].left);
2318ff723b6c43d5a8fd0ae0e0732f5d47012d74e01dWu-cheng Li                dest.writeInt(taskBounds[i].top);
231924b326a8978bf78e3e560723dde221792784325bWu-cheng Li                dest.writeInt(taskBounds[i].right);
232024b326a8978bf78e3e560723dde221792784325bWu-cheng Li                dest.writeInt(taskBounds[i].bottom);
232124b326a8978bf78e3e560723dde221792784325bWu-cheng Li            }
232224b326a8978bf78e3e560723dde221792784325bWu-cheng Li            dest.writeIntArray(taskUserIds);
2323ff723b6c43d5a8fd0ae0e0732f5d47012d74e01dWu-cheng Li            dest.writeInt(displayId);
2324ff723b6c43d5a8fd0ae0e0732f5d47012d74e01dWu-cheng Li            dest.writeInt(userId);
232524b326a8978bf78e3e560723dde221792784325bWu-cheng Li        }
2326ff723b6c43d5a8fd0ae0e0732f5d47012d74e01dWu-cheng Li
2327ff723b6c43d5a8fd0ae0e0732f5d47012d74e01dWu-cheng Li        public void readFromParcel(Parcel source) {
2328ff723b6c43d5a8fd0ae0e0732f5d47012d74e01dWu-cheng Li            stackId = source.readInt();
232924b326a8978bf78e3e560723dde221792784325bWu-cheng Li            bounds = new Rect(
2330ff723b6c43d5a8fd0ae0e0732f5d47012d74e01dWu-cheng Li                    source.readInt(), source.readInt(), source.readInt(), source.readInt());
23310402e7da70715c96af90aa95c16d1bedc5199645Wu-cheng Li            taskIds = source.createIntArray();
23320402e7da70715c96af90aa95c16d1bedc5199645Wu-cheng Li            taskNames = source.createStringArray();
233324b326a8978bf78e3e560723dde221792784325bWu-cheng Li            final int boundsCount = source.readInt();
233424b326a8978bf78e3e560723dde221792784325bWu-cheng Li            if (boundsCount > 0) {
233524b326a8978bf78e3e560723dde221792784325bWu-cheng Li                taskBounds = new Rect[boundsCount];
233624b326a8978bf78e3e560723dde221792784325bWu-cheng Li                for (int i = 0; i < boundsCount; i++) {
2337ff723b6c43d5a8fd0ae0e0732f5d47012d74e01dWu-cheng Li                    taskBounds[i] = new Rect();
2338ff723b6c43d5a8fd0ae0e0732f5d47012d74e01dWu-cheng Li                    taskBounds[i].set(
2339ff723b6c43d5a8fd0ae0e0732f5d47012d74e01dWu-cheng Li                            source.readInt(), source.readInt(), source.readInt(), source.readInt());
2340ff723b6c43d5a8fd0ae0e0732f5d47012d74e01dWu-cheng Li                }
2341ff723b6c43d5a8fd0ae0e0732f5d47012d74e01dWu-cheng Li            } else {
2342ff723b6c43d5a8fd0ae0e0732f5d47012d74e01dWu-cheng Li                taskBounds = null;
234324b326a8978bf78e3e560723dde221792784325bWu-cheng Li            }
2344ff723b6c43d5a8fd0ae0e0732f5d47012d74e01dWu-cheng Li            taskUserIds = source.createIntArray();
234524b326a8978bf78e3e560723dde221792784325bWu-cheng Li            displayId = source.readInt();
234624b326a8978bf78e3e560723dde221792784325bWu-cheng Li            userId = source.readInt();
234724b326a8978bf78e3e560723dde221792784325bWu-cheng Li        }
234824b326a8978bf78e3e560723dde221792784325bWu-cheng Li
234924b326a8978bf78e3e560723dde221792784325bWu-cheng Li        public static final Creator<StackInfo> CREATOR = new Creator<StackInfo>() {
235024b326a8978bf78e3e560723dde221792784325bWu-cheng Li            @Override
235124b326a8978bf78e3e560723dde221792784325bWu-cheng Li            public StackInfo createFromParcel(Parcel source) {
235224b326a8978bf78e3e560723dde221792784325bWu-cheng Li                return new StackInfo(source);
235324b326a8978bf78e3e560723dde221792784325bWu-cheng Li            }
235424b326a8978bf78e3e560723dde221792784325bWu-cheng Li            @Override
235524b326a8978bf78e3e560723dde221792784325bWu-cheng Li            public StackInfo[] newArray(int size) {
235624b326a8978bf78e3e560723dde221792784325bWu-cheng Li                return new StackInfo[size];
235724b326a8978bf78e3e560723dde221792784325bWu-cheng Li            }
235824b326a8978bf78e3e560723dde221792784325bWu-cheng Li        };
2359ff723b6c43d5a8fd0ae0e0732f5d47012d74e01dWu-cheng Li
236024b326a8978bf78e3e560723dde221792784325bWu-cheng Li        public StackInfo() {
236124b326a8978bf78e3e560723dde221792784325bWu-cheng Li        }
236224b326a8978bf78e3e560723dde221792784325bWu-cheng Li
236324b326a8978bf78e3e560723dde221792784325bWu-cheng Li        private StackInfo(Parcel source) {
236424b326a8978bf78e3e560723dde221792784325bWu-cheng Li            readFromParcel(source);
236524b326a8978bf78e3e560723dde221792784325bWu-cheng Li        }
236624b326a8978bf78e3e560723dde221792784325bWu-cheng Li
236724b326a8978bf78e3e560723dde221792784325bWu-cheng Li        public String toString(String prefix) {
236824b326a8978bf78e3e560723dde221792784325bWu-cheng Li            StringBuilder sb = new StringBuilder(256);
236924b326a8978bf78e3e560723dde221792784325bWu-cheng Li            sb.append(prefix); sb.append("Stack id="); sb.append(stackId);
237024b326a8978bf78e3e560723dde221792784325bWu-cheng Li                    sb.append(" bounds="); sb.append(bounds.toShortString());
237124b326a8978bf78e3e560723dde221792784325bWu-cheng Li                    sb.append(" displayId="); sb.append(displayId);
237224b326a8978bf78e3e560723dde221792784325bWu-cheng Li                    sb.append(" userId="); sb.append(userId);
237324b326a8978bf78e3e560723dde221792784325bWu-cheng Li                    sb.append("\n");
2374ff723b6c43d5a8fd0ae0e0732f5d47012d74e01dWu-cheng Li            prefix = prefix + "  ";
2375ff723b6c43d5a8fd0ae0e0732f5d47012d74e01dWu-cheng Li            for (int i = 0; i < taskIds.length; ++i) {
2376ff723b6c43d5a8fd0ae0e0732f5d47012d74e01dWu-cheng Li                sb.append(prefix); sb.append("taskId="); sb.append(taskIds[i]);
237736f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li                        sb.append(": "); sb.append(taskNames[i]);
23788cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li                        if (taskBounds != null) {
23798cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li                            sb.append(" bounds="); sb.append(taskBounds[i].toShortString());
238036f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li                        }
238136f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li                        sb.append(" userId=").append(taskUserIds[i]);
23828cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li                        sb.append("\n");
238336f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li            }
238436f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li            return sb.toString();
23858cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li        }
238636f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li
238736f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li        @Override
238836f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li        public String toString() {
23898cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li            return toString("");
23908cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li        }
23918cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li    }
23928cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li
23938cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li    /**
23948cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li     * @hide
239536f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li     */
239636f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li    public boolean clearApplicationUserData(String packageName, IPackageDataObserver observer) {
239736f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li        try {
239836f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li            return ActivityManagerNative.getDefault().clearApplicationUserData(packageName,
23998cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li                    observer, UserHandle.myUserId());
240036f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li        } catch (RemoteException e) {
240136f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li            throw e.rethrowFromSystemServer();
240236f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li        }
240336f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li    }
240436f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li
240536f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li    /**
240636f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li     * Permits an application to erase its own data from disk.  This is equivalent to
240736f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li     * the user choosing to clear the app's data from within the device settings UI.  It
240836f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li     * erases all dynamic data associated with the app -- its private data and data in its
24098cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li     * private area on external storage -- but does not remove the installed application
24108cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li     * itself, nor any OBB files.
241136f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li     *
241236f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li     * @return {@code true} if the application successfully requested that the application's
241336f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li     *     data be erased; {@code false} otherwise.
241436f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li     */
241536f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li    public boolean clearApplicationUserData() {
24168cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li        return clearApplicationUserData(mContext.getPackageName(), null);
24178cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li    }
24188cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li
241936f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li
242036f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li    /**
242136f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li     * Permits an application to get the persistent URI permissions granted to another.
242236f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li     *
24238cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li     * <p>Typically called by Settings.
242436f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li     *
242536f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li     * @param packageName application to look for the granted permissions
242636f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li     * @return list of granted URI permissions
24278cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li     *
24288cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li     * @hide
242936f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li     */
24308cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li    public ParceledListSlice<UriPermission> getGrantedUriPermissions(String packageName) {
24318cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li        try {
24328cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li            return ActivityManagerNative.getDefault().getGrantedUriPermissions(packageName,
24338cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li                    UserHandle.myUserId());
24348cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li        } catch (RemoteException e) {
243536f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li            throw e.rethrowFromSystemServer();
24368cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li        }
24378cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li    }
243836f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li
243936f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li    /**
244036f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li     * Permits an application to clear the persistent URI permissions granted to another.
244136f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li     *
244236f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li     * <p>Typically called by Settings.
244336f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li     *
244436f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li     * @param packageName application to clear its granted permissions
244536f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li     *
244636f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li     * @hide
24478cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li     */
24488cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li    public void clearGrantedUriPermissions(String packageName) {
244936f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li        try {
245036f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li            ActivityManagerNative.getDefault().clearGrantedUriPermissions(packageName,
2451e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li                    UserHandle.myUserId());
2452e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li        } catch (RemoteException e) {
2453e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li            throw e.rethrowFromSystemServer();
2454e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li        }
2455e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li    }
2456e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li
2457e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li    /**
2458e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li     * Information you can retrieve about any processes that are in an error condition.
2459e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li     */
2460d45cb72ac0d7d57829ffc9223decb89a5fc42ce2Wu-cheng Li    public static class ProcessErrorStateInfo implements Parcelable {
2461d45cb72ac0d7d57829ffc9223decb89a5fc42ce2Wu-cheng Li        /**
2462699fe9397974685e6b2c73f9a3a0eb9e5a5a2ccfWu-cheng Li         * Condition codes
2463699fe9397974685e6b2c73f9a3a0eb9e5a5a2ccfWu-cheng Li         */
2464699fe9397974685e6b2c73f9a3a0eb9e5a5a2ccfWu-cheng Li        public static final int NO_ERROR = 0;
2465699fe9397974685e6b2c73f9a3a0eb9e5a5a2ccfWu-cheng Li        public static final int CRASHED = 1;
2466699fe9397974685e6b2c73f9a3a0eb9e5a5a2ccfWu-cheng Li        public static final int NOT_RESPONDING = 2;
2467699fe9397974685e6b2c73f9a3a0eb9e5a5a2ccfWu-cheng Li
2468e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li        /**
2469185cc455a87c636d48ad9a16c13d2ebad7433735Wu-cheng Li         * The condition that the process is in.
2470185cc455a87c636d48ad9a16c13d2ebad7433735Wu-cheng Li         */
2471e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li        public int condition;
2472e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li
2473e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li        /**
2474e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li         * The process name in which the crash or error occurred.
2475e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li         */
2476185cc455a87c636d48ad9a16c13d2ebad7433735Wu-cheng Li        public String processName;
2477185cc455a87c636d48ad9a16c13d2ebad7433735Wu-cheng Li
2478185cc455a87c636d48ad9a16c13d2ebad7433735Wu-cheng Li        /**
2479e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li         * The pid of this process; 0 if none
2480e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li         */
2481e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li        public int pid;
2482e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li
2483e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li        /**
2484e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li         * The kernel user-ID that has been assigned to this process;
2485454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li         * currently this is not a unique ID (multiple applications can have
2486e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li         * the same uid).
2487e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li         */
24889b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public int uid;
24899b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
24909b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        /**
24919b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         * The activity name associated with the error, if known.  May be null.
24929b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         */
24939b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public String tag;
24949b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
24959b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        /**
24969b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         * A short message describing the error condition.
24979b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         */
24989b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public String shortMsg;
24999b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
25009b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        /**
25019b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         * A long message describing the error condition.
25029b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         */
25039b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public String longMsg;
25049b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
25059b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        /**
25069b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         * The stack trace where the error originated.  May be null.
25079b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         */
25089b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public String stackTrace;
25099b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
25109b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        /**
25119b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         * to be deprecated: This value will always be null.
25129b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         */
25139b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public byte[] crashData = null;
25149b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
25159b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public ProcessErrorStateInfo() {
25169b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        }
2517454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li
2518454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li        @Override
2519454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li        public int describeContents() {
2520454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li            return 0;
2521454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li        }
2522454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li
2523454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li        @Override
2524454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li        public void writeToParcel(Parcel dest, int flags) {
2525454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li            dest.writeInt(condition);
2526454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li            dest.writeString(processName);
2527454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li            dest.writeInt(pid);
2528e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li            dest.writeInt(uid);
2529454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li            dest.writeString(tag);
2530454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li            dest.writeString(shortMsg);
2531e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li            dest.writeString(longMsg);
2532e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li            dest.writeString(stackTrace);
2533454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li        }
2534e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li
2535e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li        public void readFromParcel(Parcel source) {
2536454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li            condition = source.readInt();
2537e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li            processName = source.readString();
2538e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li            pid = source.readInt();
2539e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li            uid = source.readInt();
254024b326a8978bf78e3e560723dde221792784325bWu-cheng Li            tag = source.readString();
254124b326a8978bf78e3e560723dde221792784325bWu-cheng Li            shortMsg = source.readString();
254224b326a8978bf78e3e560723dde221792784325bWu-cheng Li            longMsg = source.readString();
254324b326a8978bf78e3e560723dde221792784325bWu-cheng Li            stackTrace = source.readString();
254424b326a8978bf78e3e560723dde221792784325bWu-cheng Li        }
254524b326a8978bf78e3e560723dde221792784325bWu-cheng Li
254624b326a8978bf78e3e560723dde221792784325bWu-cheng Li        public static final Creator<ProcessErrorStateInfo> CREATOR =
254724b326a8978bf78e3e560723dde221792784325bWu-cheng Li                new Creator<ProcessErrorStateInfo>() {
254824b326a8978bf78e3e560723dde221792784325bWu-cheng Li            public ProcessErrorStateInfo createFromParcel(Parcel source) {
254924b326a8978bf78e3e560723dde221792784325bWu-cheng Li                return new ProcessErrorStateInfo(source);
255024b326a8978bf78e3e560723dde221792784325bWu-cheng Li            }
255124b326a8978bf78e3e560723dde221792784325bWu-cheng Li            public ProcessErrorStateInfo[] newArray(int size) {
255224b326a8978bf78e3e560723dde221792784325bWu-cheng Li                return new ProcessErrorStateInfo[size];
255324b326a8978bf78e3e560723dde221792784325bWu-cheng Li            }
255424b326a8978bf78e3e560723dde221792784325bWu-cheng Li        };
255524b326a8978bf78e3e560723dde221792784325bWu-cheng Li
255624b326a8978bf78e3e560723dde221792784325bWu-cheng Li        private ProcessErrorStateInfo(Parcel source) {
255724b326a8978bf78e3e560723dde221792784325bWu-cheng Li            readFromParcel(source);
25589b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        }
25599b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    }
25609b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
25619b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    /**
25629b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * Returns a list of any processes that are currently in an error condition.  The result
25639b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * will be null if all processes are running properly at this time.
25649b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     *
25659b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * @return Returns a list of ProcessErrorStateInfo records, or null if there are no
25669b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * current error conditions (it will not return an empty list).  This list ordering is not
25679b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * specified.
25689b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     */
25699b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    public List<ProcessErrorStateInfo> getProcessesInErrorState() {
25709b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        try {
25719b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            return ActivityManagerNative.getDefault().getProcessesInErrorState();
25729b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        } catch (RemoteException e) {
25739b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            throw e.rethrowFromSystemServer();
25749b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        }
25759b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    }
25769b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
25779b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    /**
25789b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     * Information you can retrieve about a running process.
25799b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li     */
25809b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    public static class RunningAppProcessInfo implements Parcelable {
25819b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        /**
25829b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         * The name of the process that this object is associated with
25839b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         */
25849b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        public String processName;
25859b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
25869b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        /**
25879b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li         * The pid of this process; 0 if none
2588454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li         */
2589454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li        public int pid;
2590454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li
2591454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li        /**
2592454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li         * The user id of this process.
2593454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li         */
2594454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li        public int uid;
2595454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li
2596454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li        /**
2597454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li         * All packages that have been loaded into the process.
2598454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li         */
2599454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li        public String pkgList[];
2600454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li
2601454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li        /**
2602454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li         * Constant for {@link #flags}: this is an app that is unable to
2603454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li         * correctly save its state when going to the background,
2604454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li         * so it can not be killed while in the background.
2605454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li         * @hide
2606454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li         */
2607454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li        public static final int FLAG_CANT_SAVE_STATE = 1<<0;
2608454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li
2609454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li        /**
2610454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li         * Constant for {@link #flags}: this process is associated with a
2611454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li         * persistent system app.
2612454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li         * @hide
26139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
26149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int FLAG_PERSISTENT = 1<<1;
2615
2616        /**
2617         * Constant for {@link #flags}: this process is associated with a
2618         * persistent system app.
2619         * @hide
2620         */
2621        public static final int FLAG_HAS_ACTIVITIES = 1<<2;
2622
2623        /**
2624         * Flags of information.  May be any of
2625         * {@link #FLAG_CANT_SAVE_STATE}.
2626         * @hide
2627         */
2628        public int flags;
2629
2630        /**
2631         * Last memory trim level reported to the process: corresponds to
2632         * the values supplied to {@link android.content.ComponentCallbacks2#onTrimMemory(int)
2633         * ComponentCallbacks2.onTrimMemory(int)}.
2634         */
2635        public int lastTrimLevel;
2636
2637        /**
2638         * Constant for {@link #importance}: This process is running the
2639         * foreground UI; that is, it is the thing currently at the top of the screen
2640         * that the user is interacting with.
2641         */
2642        public static final int IMPORTANCE_FOREGROUND = 100;
2643
2644        /**
2645         * Constant for {@link #importance}: This process is running a foreground
2646         * service, for example to perform music playback even while the user is
2647         * not immediately in the app.  This generally indicates that the process
2648         * is doing something the user actively cares about.
2649         */
2650        public static final int IMPORTANCE_FOREGROUND_SERVICE = 125;
2651
2652        /**
2653         * Constant for {@link #importance}: This process is running the foreground
2654         * UI, but the device is asleep so it is not visible to the user.  This means
2655         * the user is not really aware of the process, because they can not see or
2656         * interact with it, but it is quite important because it what they expect to
2657         * return to once unlocking the device.
2658         */
2659        public static final int IMPORTANCE_TOP_SLEEPING = 150;
2660
2661        /**
2662         * Constant for {@link #importance}: This process is running something
2663         * that is actively visible to the user, though not in the immediate
2664         * foreground.  This may be running a window that is behind the current
2665         * foreground (so paused and with its state saved, not interacting with
2666         * the user, but visible to them to some degree); it may also be running
2667         * other services under the system's control that it inconsiders important.
2668         */
2669        public static final int IMPORTANCE_VISIBLE = 200;
2670
2671        /**
2672         * Constant for {@link #importance}: This process is not something the user
2673         * is directly aware of, but is otherwise perceptable to them to some degree.
2674         */
2675        public static final int IMPORTANCE_PERCEPTIBLE = 130;
2676
2677        /**
2678         * Constant for {@link #importance}: This process is running an
2679         * application that can not save its state, and thus can't be killed
2680         * while in the background.
2681         * @hide
2682         */
2683        public static final int IMPORTANCE_CANT_SAVE_STATE = 170;
2684
2685        /**
2686         * Constant for {@link #importance}: This process is contains services
2687         * that should remain running.  These are background services apps have
2688         * started, not something the user is aware of, so they may be killed by
2689         * the system relatively freely (though it is generally desired that they
2690         * stay running as long as they want to).
2691         */
2692        public static final int IMPORTANCE_SERVICE = 300;
2693
2694        /**
2695         * Constant for {@link #importance}: This process process contains
2696         * background code that is expendable.
2697         */
2698        public static final int IMPORTANCE_BACKGROUND = 400;
2699
2700        /**
2701         * Constant for {@link #importance}: This process is empty of any
2702         * actively running code.
2703         */
2704        public static final int IMPORTANCE_EMPTY = 500;
2705
2706        /**
2707         * Constant for {@link #importance}: This process does not exist.
2708         */
2709        public static final int IMPORTANCE_GONE = 1000;
2710
2711        /** @hide */
2712        public static int procStateToImportance(int procState) {
2713            if (procState == PROCESS_STATE_NONEXISTENT) {
2714                return IMPORTANCE_GONE;
2715            } else if (procState >= PROCESS_STATE_HOME) {
2716                return IMPORTANCE_BACKGROUND;
2717            } else if (procState >= PROCESS_STATE_SERVICE) {
2718                return IMPORTANCE_SERVICE;
2719            } else if (procState > PROCESS_STATE_HEAVY_WEIGHT) {
2720                return IMPORTANCE_CANT_SAVE_STATE;
2721            } else if (procState >= PROCESS_STATE_IMPORTANT_BACKGROUND) {
2722                return IMPORTANCE_PERCEPTIBLE;
2723            } else if (procState >= PROCESS_STATE_IMPORTANT_FOREGROUND) {
2724                return IMPORTANCE_VISIBLE;
2725            } else if (procState >= PROCESS_STATE_TOP_SLEEPING) {
2726                return IMPORTANCE_TOP_SLEEPING;
2727            } else if (procState >= PROCESS_STATE_FOREGROUND_SERVICE) {
2728                return IMPORTANCE_FOREGROUND_SERVICE;
2729            } else {
2730                return IMPORTANCE_FOREGROUND;
2731            }
2732        }
2733
2734        /**
2735         * The relative importance level that the system places on this
2736         * process.  May be one of {@link #IMPORTANCE_FOREGROUND},
2737         * {@link #IMPORTANCE_VISIBLE}, {@link #IMPORTANCE_SERVICE},
2738         * {@link #IMPORTANCE_BACKGROUND}, or {@link #IMPORTANCE_EMPTY}.  These
2739         * constants are numbered so that "more important" values are always
2740         * smaller than "less important" values.
2741         */
2742        public int importance;
2743
2744        /**
2745         * An additional ordering within a particular {@link #importance}
2746         * category, providing finer-grained information about the relative
2747         * utility of processes within a category.  This number means nothing
2748         * except that a smaller values are more recently used (and thus
2749         * more important).  Currently an LRU value is only maintained for
2750         * the {@link #IMPORTANCE_BACKGROUND} category, though others may
2751         * be maintained in the future.
2752         */
2753        public int lru;
2754
2755        /**
2756         * Constant for {@link #importanceReasonCode}: nothing special has
2757         * been specified for the reason for this level.
2758         */
2759        public static final int REASON_UNKNOWN = 0;
2760
2761        /**
2762         * Constant for {@link #importanceReasonCode}: one of the application's
2763         * content providers is being used by another process.  The pid of
2764         * the client process is in {@link #importanceReasonPid} and the
2765         * target provider in this process is in
2766         * {@link #importanceReasonComponent}.
2767         */
2768        public static final int REASON_PROVIDER_IN_USE = 1;
2769
2770        /**
2771         * Constant for {@link #importanceReasonCode}: one of the application's
2772         * content providers is being used by another process.  The pid of
2773         * the client process is in {@link #importanceReasonPid} and the
2774         * target provider in this process is in
2775         * {@link #importanceReasonComponent}.
2776         */
2777        public static final int REASON_SERVICE_IN_USE = 2;
2778
2779        /**
2780         * The reason for {@link #importance}, if any.
2781         */
2782        public int importanceReasonCode;
2783
2784        /**
2785         * For the specified values of {@link #importanceReasonCode}, this
2786         * is the process ID of the other process that is a client of this
2787         * process.  This will be 0 if no other process is using this one.
2788         */
2789        public int importanceReasonPid;
2790
2791        /**
2792         * For the specified values of {@link #importanceReasonCode}, this
2793         * is the name of the component that is being used in this process.
2794         */
2795        public ComponentName importanceReasonComponent;
2796
2797        /**
2798         * When {@link #importanceReasonPid} is non-0, this is the importance
2799         * of the other pid. @hide
2800         */
2801        public int importanceReasonImportance;
2802
2803        /**
2804         * Current process state, as per PROCESS_STATE_* constants.
2805         * @hide
2806         */
2807        public int processState;
2808
2809        public RunningAppProcessInfo() {
2810            importance = IMPORTANCE_FOREGROUND;
2811            importanceReasonCode = REASON_UNKNOWN;
2812            processState = PROCESS_STATE_IMPORTANT_FOREGROUND;
2813        }
2814
2815        public RunningAppProcessInfo(String pProcessName, int pPid, String pArr[]) {
2816            processName = pProcessName;
2817            pid = pPid;
2818            pkgList = pArr;
2819        }
2820
2821        public int describeContents() {
2822            return 0;
2823        }
2824
2825        public void writeToParcel(Parcel dest, int flags) {
2826            dest.writeString(processName);
2827            dest.writeInt(pid);
2828            dest.writeInt(uid);
2829            dest.writeStringArray(pkgList);
2830            dest.writeInt(this.flags);
2831            dest.writeInt(lastTrimLevel);
2832            dest.writeInt(importance);
2833            dest.writeInt(lru);
2834            dest.writeInt(importanceReasonCode);
2835            dest.writeInt(importanceReasonPid);
2836            ComponentName.writeToParcel(importanceReasonComponent, dest);
2837            dest.writeInt(importanceReasonImportance);
2838            dest.writeInt(processState);
2839        }
2840
2841        public void readFromParcel(Parcel source) {
2842            processName = source.readString();
2843            pid = source.readInt();
2844            uid = source.readInt();
2845            pkgList = source.readStringArray();
2846            flags = source.readInt();
2847            lastTrimLevel = source.readInt();
2848            importance = source.readInt();
2849            lru = source.readInt();
2850            importanceReasonCode = source.readInt();
2851            importanceReasonPid = source.readInt();
2852            importanceReasonComponent = ComponentName.readFromParcel(source);
2853            importanceReasonImportance = source.readInt();
2854            processState = source.readInt();
2855        }
2856
2857        public static final Creator<RunningAppProcessInfo> CREATOR =
2858            new Creator<RunningAppProcessInfo>() {
2859            public RunningAppProcessInfo createFromParcel(Parcel source) {
2860                return new RunningAppProcessInfo(source);
2861            }
2862            public RunningAppProcessInfo[] newArray(int size) {
2863                return new RunningAppProcessInfo[size];
2864            }
2865        };
2866
2867        private RunningAppProcessInfo(Parcel source) {
2868            readFromParcel(source);
2869        }
2870    }
2871
2872    /**
2873     * Returns a list of application processes installed on external media
2874     * that are running on the device.
2875     *
2876     * <p><b>Note: this method is only intended for debugging or building
2877     * a user-facing process management UI.</b></p>
2878     *
2879     * @return Returns a list of ApplicationInfo records, or null if none
2880     * This list ordering is not specified.
2881     * @hide
2882     */
2883    public List<ApplicationInfo> getRunningExternalApplications() {
2884        try {
2885            return ActivityManagerNative.getDefault().getRunningExternalApplications();
2886        } catch (RemoteException e) {
2887            throw e.rethrowFromSystemServer();
2888        }
2889    }
2890
2891    /**
2892     * Sets the memory trim mode for a process and schedules a memory trim operation.
2893     *
2894     * <p><b>Note: this method is only intended for testing framework.</b></p>
2895     *
2896     * @return Returns true if successful.
2897     * @hide
2898     */
2899    public boolean setProcessMemoryTrimLevel(String process, int userId, int level) {
2900        try {
2901            return ActivityManagerNative.getDefault().setProcessMemoryTrimLevel(process, userId,
2902                    level);
2903        } catch (RemoteException e) {
2904            throw e.rethrowFromSystemServer();
2905        }
2906    }
2907
2908    /**
2909     * Returns a list of application processes that are running on the device.
2910     *
2911     * <p><b>Note: this method is only intended for debugging or building
2912     * a user-facing process management UI.</b></p>
2913     *
2914     * @return Returns a list of RunningAppProcessInfo records, or null if there are no
2915     * running processes (it will not return an empty list).  This list ordering is not
2916     * specified.
2917     */
2918    public List<RunningAppProcessInfo> getRunningAppProcesses() {
2919        try {
2920            return ActivityManagerNative.getDefault().getRunningAppProcesses();
2921        } catch (RemoteException e) {
2922            throw e.rethrowFromSystemServer();
2923        }
2924    }
2925
2926    /**
2927     * Return the importance of a given package name, based on the processes that are
2928     * currently running.  The return value is one of the importance constants defined
2929     * in {@link RunningAppProcessInfo}, giving you the highest importance of all the
2930     * processes that this package has code running inside of.  If there are no processes
2931     * running its code, {@link RunningAppProcessInfo#IMPORTANCE_GONE} is returned.
2932     * @hide
2933     */
2934    @SystemApi
2935    public int getPackageImportance(String packageName) {
2936        try {
2937            int procState = ActivityManagerNative.getDefault().getPackageProcessState(packageName,
2938                    mContext.getOpPackageName());
2939            return RunningAppProcessInfo.procStateToImportance(procState);
2940        } catch (RemoteException e) {
2941            throw e.rethrowFromSystemServer();
2942        }
2943    }
2944
2945    /**
2946     * Return global memory state information for the calling process.  This
2947     * does not fill in all fields of the {@link RunningAppProcessInfo}.  The
2948     * only fields that will be filled in are
2949     * {@link RunningAppProcessInfo#pid},
2950     * {@link RunningAppProcessInfo#uid},
2951     * {@link RunningAppProcessInfo#lastTrimLevel},
2952     * {@link RunningAppProcessInfo#importance},
2953     * {@link RunningAppProcessInfo#lru}, and
2954     * {@link RunningAppProcessInfo#importanceReasonCode}.
2955     */
2956    static public void getMyMemoryState(RunningAppProcessInfo outState) {
2957        try {
2958            ActivityManagerNative.getDefault().getMyMemoryState(outState);
2959        } catch (RemoteException e) {
2960            throw e.rethrowFromSystemServer();
2961        }
2962    }
2963
2964    /**
2965     * Return information about the memory usage of one or more processes.
2966     *
2967     * <p><b>Note: this method is only intended for debugging or building
2968     * a user-facing process management UI.</b></p>
2969     *
2970     * @param pids The pids of the processes whose memory usage is to be
2971     * retrieved.
2972     * @return Returns an array of memory information, one for each
2973     * requested pid.
2974     */
2975    public Debug.MemoryInfo[] getProcessMemoryInfo(int[] pids) {
2976        try {
2977            return ActivityManagerNative.getDefault().getProcessMemoryInfo(pids);
2978        } catch (RemoteException e) {
2979            throw e.rethrowFromSystemServer();
2980        }
2981    }
2982
2983    /**
2984     * @deprecated This is now just a wrapper for
2985     * {@link #killBackgroundProcesses(String)}; the previous behavior here
2986     * is no longer available to applications because it allows them to
2987     * break other applications by removing their alarms, stopping their
2988     * services, etc.
2989     */
2990    @Deprecated
2991    public void restartPackage(String packageName) {
2992        killBackgroundProcesses(packageName);
2993    }
2994
2995    /**
2996     * Have the system immediately kill all background processes associated
2997     * with the given package.  This is the same as the kernel killing those
2998     * processes to reclaim memory; the system will take care of restarting
2999     * these processes in the future as needed.
3000     *
3001     * <p>You must hold the permission
3002     * {@link android.Manifest.permission#KILL_BACKGROUND_PROCESSES} to be able to
3003     * call this method.
3004     *
3005     * @param packageName The name of the package whose processes are to
3006     * be killed.
3007     */
3008    public void killBackgroundProcesses(String packageName) {
3009        try {
3010            ActivityManagerNative.getDefault().killBackgroundProcesses(packageName,
3011                    UserHandle.myUserId());
3012        } catch (RemoteException e) {
3013            throw e.rethrowFromSystemServer();
3014        }
3015    }
3016
3017    /**
3018     * Kills the specified UID.
3019     * @param uid The UID to kill.
3020     * @param reason The reason for the kill.
3021     *
3022     * @hide
3023     */
3024    @RequiresPermission(Manifest.permission.KILL_UID)
3025    public void killUid(int uid, String reason) {
3026        try {
3027            ActivityManagerNative.getDefault().killUid(UserHandle.getAppId(uid),
3028                    UserHandle.getUserId(uid), reason);
3029        } catch (RemoteException e) {
3030            throw e.rethrowFromSystemServer();
3031        }
3032    }
3033
3034    /**
3035     * Have the system perform a force stop of everything associated with
3036     * the given application package.  All processes that share its uid
3037     * will be killed, all services it has running stopped, all activities
3038     * removed, etc.  In addition, a {@link Intent#ACTION_PACKAGE_RESTARTED}
3039     * broadcast will be sent, so that any of its registered alarms can
3040     * be stopped, notifications removed, etc.
3041     *
3042     * <p>You must hold the permission
3043     * {@link android.Manifest.permission#FORCE_STOP_PACKAGES} to be able to
3044     * call this method.
3045     *
3046     * @param packageName The name of the package to be stopped.
3047     * @param userId The user for which the running package is to be stopped.
3048     *
3049     * @hide This is not available to third party applications due to
3050     * it allowing them to break other applications by stopping their
3051     * services, removing their alarms, etc.
3052     */
3053    public void forceStopPackageAsUser(String packageName, int userId) {
3054        try {
3055            ActivityManagerNative.getDefault().forceStopPackage(packageName, userId);
3056        } catch (RemoteException e) {
3057            throw e.rethrowFromSystemServer();
3058        }
3059    }
3060
3061    /**
3062     * @see #forceStopPackageAsUser(String, int)
3063     * @hide
3064     */
3065    public void forceStopPackage(String packageName) {
3066        forceStopPackageAsUser(packageName, UserHandle.myUserId());
3067    }
3068
3069    /**
3070     * Get the device configuration attributes.
3071     */
3072    public ConfigurationInfo getDeviceConfigurationInfo() {
3073        try {
3074            return ActivityManagerNative.getDefault().getDeviceConfigurationInfo();
3075        } catch (RemoteException e) {
3076            throw e.rethrowFromSystemServer();
3077        }
3078    }
3079
3080    /**
3081     * Get the preferred density of icons for the launcher. This is used when
3082     * custom drawables are created (e.g., for shortcuts).
3083     *
3084     * @return density in terms of DPI
3085     */
3086    public int getLauncherLargeIconDensity() {
3087        final Resources res = mContext.getResources();
3088        final int density = res.getDisplayMetrics().densityDpi;
3089        final int sw = res.getConfiguration().smallestScreenWidthDp;
3090
3091        if (sw < 600) {
3092            // Smaller than approx 7" tablets, use the regular icon size.
3093            return density;
3094        }
3095
3096        switch (density) {
3097            case DisplayMetrics.DENSITY_LOW:
3098                return DisplayMetrics.DENSITY_MEDIUM;
3099            case DisplayMetrics.DENSITY_MEDIUM:
3100                return DisplayMetrics.DENSITY_HIGH;
3101            case DisplayMetrics.DENSITY_TV:
3102                return DisplayMetrics.DENSITY_XHIGH;
3103            case DisplayMetrics.DENSITY_HIGH:
3104                return DisplayMetrics.DENSITY_XHIGH;
3105            case DisplayMetrics.DENSITY_XHIGH:
3106                return DisplayMetrics.DENSITY_XXHIGH;
3107            case DisplayMetrics.DENSITY_XXHIGH:
3108                return DisplayMetrics.DENSITY_XHIGH * 2;
3109            default:
3110                // The density is some abnormal value.  Return some other
3111                // abnormal value that is a reasonable scaling of it.
3112                return (int)((density*1.5f)+.5f);
3113        }
3114    }
3115
3116    /**
3117     * Get the preferred launcher icon size. This is used when custom drawables
3118     * are created (e.g., for shortcuts).
3119     *
3120     * @return dimensions of square icons in terms of pixels
3121     */
3122    public int getLauncherLargeIconSize() {
3123        return getLauncherLargeIconSizeInner(mContext);
3124    }
3125
3126    static int getLauncherLargeIconSizeInner(Context context) {
3127        final Resources res = context.getResources();
3128        final int size = res.getDimensionPixelSize(android.R.dimen.app_icon_size);
3129        final int sw = res.getConfiguration().smallestScreenWidthDp;
3130
3131        if (sw < 600) {
3132            // Smaller than approx 7" tablets, use the regular icon size.
3133            return size;
3134        }
3135
3136        final int density = res.getDisplayMetrics().densityDpi;
3137
3138        switch (density) {
3139            case DisplayMetrics.DENSITY_LOW:
3140                return (size * DisplayMetrics.DENSITY_MEDIUM) / DisplayMetrics.DENSITY_LOW;
3141            case DisplayMetrics.DENSITY_MEDIUM:
3142                return (size * DisplayMetrics.DENSITY_HIGH) / DisplayMetrics.DENSITY_MEDIUM;
3143            case DisplayMetrics.DENSITY_TV:
3144                return (size * DisplayMetrics.DENSITY_XHIGH) / DisplayMetrics.DENSITY_HIGH;
3145            case DisplayMetrics.DENSITY_HIGH:
3146                return (size * DisplayMetrics.DENSITY_XHIGH) / DisplayMetrics.DENSITY_HIGH;
3147            case DisplayMetrics.DENSITY_XHIGH:
3148                return (size * DisplayMetrics.DENSITY_XXHIGH) / DisplayMetrics.DENSITY_XHIGH;
3149            case DisplayMetrics.DENSITY_XXHIGH:
3150                return (size * DisplayMetrics.DENSITY_XHIGH*2) / DisplayMetrics.DENSITY_XXHIGH;
3151            default:
3152                // The density is some abnormal value.  Return some other
3153                // abnormal value that is a reasonable scaling of it.
3154                return (int)((size*1.5f) + .5f);
3155        }
3156    }
3157
3158    /**
3159     * Returns "true" if the user interface is currently being messed with
3160     * by a monkey.
3161     */
3162    public static boolean isUserAMonkey() {
3163        try {
3164            return ActivityManagerNative.getDefault().isUserAMonkey();
3165        } catch (RemoteException e) {
3166            throw e.rethrowFromSystemServer();
3167        }
3168    }
3169
3170    /**
3171     * Returns "true" if device is running in a test harness.
3172     */
3173    public static boolean isRunningInTestHarness() {
3174        return SystemProperties.getBoolean("ro.test_harness", false);
3175    }
3176
3177    /**
3178     * Returns the launch count of each installed package.
3179     *
3180     * @hide
3181     */
3182    /*public Map<String, Integer> getAllPackageLaunchCounts() {
3183        try {
3184            IUsageStats usageStatsService = IUsageStats.Stub.asInterface(
3185                    ServiceManager.getService("usagestats"));
3186            if (usageStatsService == null) {
3187                return new HashMap<String, Integer>();
3188            }
3189
3190            UsageStats.PackageStats[] allPkgUsageStats = usageStatsService.getAllPkgUsageStats(
3191                    ActivityThread.currentPackageName());
3192            if (allPkgUsageStats == null) {
3193                return new HashMap<String, Integer>();
3194            }
3195
3196            Map<String, Integer> launchCounts = new HashMap<String, Integer>();
3197            for (UsageStats.PackageStats pkgUsageStats : allPkgUsageStats) {
3198                launchCounts.put(pkgUsageStats.getPackageName(), pkgUsageStats.getLaunchCount());
3199            }
3200
3201            return launchCounts;
3202        } catch (RemoteException e) {
3203            Log.w(TAG, "Could not query launch counts", e);
3204            return new HashMap<String, Integer>();
3205        }
3206    }*/
3207
3208    /** @hide */
3209    public static int checkComponentPermission(String permission, int uid,
3210            int owningUid, boolean exported) {
3211        // Root, system server get to do everything.
3212        final int appId = UserHandle.getAppId(uid);
3213        if (appId == Process.ROOT_UID || appId == Process.SYSTEM_UID) {
3214            return PackageManager.PERMISSION_GRANTED;
3215        }
3216        // Isolated processes don't get any permissions.
3217        if (UserHandle.isIsolated(uid)) {
3218            return PackageManager.PERMISSION_DENIED;
3219        }
3220        // If there is a uid that owns whatever is being accessed, it has
3221        // blanket access to it regardless of the permissions it requires.
3222        if (owningUid >= 0 && UserHandle.isSameApp(uid, owningUid)) {
3223            return PackageManager.PERMISSION_GRANTED;
3224        }
3225        // If the target is not exported, then nobody else can get to it.
3226        if (!exported) {
3227            /*
3228            RuntimeException here = new RuntimeException("here");
3229            here.fillInStackTrace();
3230            Slog.w(TAG, "Permission denied: checkComponentPermission() owningUid=" + owningUid,
3231                    here);
3232            */
3233            return PackageManager.PERMISSION_DENIED;
3234        }
3235        if (permission == null) {
3236            return PackageManager.PERMISSION_GRANTED;
3237        }
3238        try {
3239            return AppGlobals.getPackageManager()
3240                    .checkUidPermission(permission, uid);
3241        } catch (RemoteException e) {
3242            throw e.rethrowFromSystemServer();
3243        }
3244    }
3245
3246    /** @hide */
3247    public static int checkUidPermission(String permission, int uid) {
3248        try {
3249            return AppGlobals.getPackageManager()
3250                    .checkUidPermission(permission, uid);
3251        } catch (RemoteException e) {
3252            throw e.rethrowFromSystemServer();
3253        }
3254    }
3255
3256    /**
3257     * @hide
3258     * Helper for dealing with incoming user arguments to system service calls.
3259     * Takes care of checking permissions and converting USER_CURRENT to the
3260     * actual current user.
3261     *
3262     * @param callingPid The pid of the incoming call, as per Binder.getCallingPid().
3263     * @param callingUid The uid of the incoming call, as per Binder.getCallingUid().
3264     * @param userId The user id argument supplied by the caller -- this is the user
3265     * they want to run as.
3266     * @param allowAll If true, we will allow USER_ALL.  This means you must be prepared
3267     * to get a USER_ALL returned and deal with it correctly.  If false,
3268     * an exception will be thrown if USER_ALL is supplied.
3269     * @param requireFull If true, the caller must hold
3270     * {@link android.Manifest.permission#INTERACT_ACROSS_USERS_FULL} to be able to run as a
3271     * different user than their current process; otherwise they must hold
3272     * {@link android.Manifest.permission#INTERACT_ACROSS_USERS}.
3273     * @param name Optional textual name of the incoming call; only for generating error messages.
3274     * @param callerPackage Optional package name of caller; only for error messages.
3275     *
3276     * @return Returns the user ID that the call should run as.  Will always be a concrete
3277     * user number, unless <var>allowAll</var> is true in which case it could also be
3278     * USER_ALL.
3279     */
3280    public static int handleIncomingUser(int callingPid, int callingUid, int userId,
3281            boolean allowAll, boolean requireFull, String name, String callerPackage) {
3282        if (UserHandle.getUserId(callingUid) == userId) {
3283            return userId;
3284        }
3285        try {
3286            return ActivityManagerNative.getDefault().handleIncomingUser(callingPid,
3287                    callingUid, userId, allowAll, requireFull, name, callerPackage);
3288        } catch (RemoteException e) {
3289            throw e.rethrowFromSystemServer();
3290        }
3291    }
3292
3293    /**
3294     * Gets the userId of the current foreground user. Requires system permissions.
3295     * @hide
3296     */
3297    @SystemApi
3298    public static int getCurrentUser() {
3299        UserInfo ui;
3300        try {
3301            ui = ActivityManagerNative.getDefault().getCurrentUser();
3302            return ui != null ? ui.id : 0;
3303        } catch (RemoteException e) {
3304            throw e.rethrowFromSystemServer();
3305        }
3306    }
3307
3308    /**
3309     * @param userid the user's id. Zero indicates the default user.
3310     * @hide
3311     */
3312    public boolean switchUser(int userid) {
3313        try {
3314            return ActivityManagerNative.getDefault().switchUser(userid);
3315        } catch (RemoteException e) {
3316            throw e.rethrowFromSystemServer();
3317        }
3318    }
3319
3320    /** {@hide} */
3321    public static final int FLAG_OR_STOPPED = 1 << 0;
3322    /** {@hide} */
3323    public static final int FLAG_AND_LOCKED = 1 << 1;
3324    /** {@hide} */
3325    public static final int FLAG_AND_UNLOCKED = 1 << 2;
3326
3327    /**
3328     * Return whether the given user is actively running.  This means that
3329     * the user is in the "started" state, not "stopped" -- it is currently
3330     * allowed to run code through scheduled alarms, receiving broadcasts,
3331     * etc.  A started user may be either the current foreground user or a
3332     * background user; the result here does not distinguish between the two.
3333     * @param userid the user's id. Zero indicates the default user.
3334     * @hide
3335     */
3336    public boolean isUserRunning(int userId) {
3337        try {
3338            return ActivityManagerNative.getDefault().isUserRunning(userId, 0);
3339        } catch (RemoteException e) {
3340            throw e.rethrowFromSystemServer();
3341        }
3342    }
3343
3344    /** {@hide} */
3345    public boolean isUserRunningAndLocked(int userId) {
3346        try {
3347            return ActivityManagerNative.getDefault().isUserRunning(userId,
3348                    ActivityManager.FLAG_AND_LOCKED);
3349        } catch (RemoteException e) {
3350            throw e.rethrowFromSystemServer();
3351        }
3352    }
3353
3354    /** {@hide} */
3355    public boolean isUserRunningAndUnlocked(int userId) {
3356        try {
3357            return ActivityManagerNative.getDefault().isUserRunning(userId,
3358                    ActivityManager.FLAG_AND_UNLOCKED);
3359        } catch (RemoteException e) {
3360            throw e.rethrowFromSystemServer();
3361        }
3362    }
3363
3364    /**
3365     * Perform a system dump of various state associated with the given application
3366     * package name.  This call blocks while the dump is being performed, so should
3367     * not be done on a UI thread.  The data will be written to the given file
3368     * descriptor as text.  An application must hold the
3369     * {@link android.Manifest.permission#DUMP} permission to make this call.
3370     * @param fd The file descriptor that the dump should be written to.  The file
3371     * descriptor is <em>not</em> closed by this function; the caller continues to
3372     * own it.
3373     * @param packageName The name of the package that is to be dumped.
3374     */
3375    public void dumpPackageState(FileDescriptor fd, String packageName) {
3376        dumpPackageStateStatic(fd, packageName);
3377    }
3378
3379    /**
3380     * @hide
3381     */
3382    public static void dumpPackageStateStatic(FileDescriptor fd, String packageName) {
3383        FileOutputStream fout = new FileOutputStream(fd);
3384        PrintWriter pw = new FastPrintWriter(fout);
3385        dumpService(pw, fd, "package", new String[] { packageName });
3386        pw.println();
3387        dumpService(pw, fd, Context.ACTIVITY_SERVICE, new String[] {
3388                "-a", "package", packageName });
3389        pw.println();
3390        dumpService(pw, fd, "meminfo", new String[] { "--local", "--package", packageName });
3391        pw.println();
3392        dumpService(pw, fd, ProcessStats.SERVICE_NAME, new String[] { packageName });
3393        pw.println();
3394        dumpService(pw, fd, "usagestats", new String[] { "--packages", packageName });
3395        pw.println();
3396        dumpService(pw, fd, BatteryStats.SERVICE_NAME, new String[] { packageName });
3397        pw.flush();
3398    }
3399
3400    private static void dumpService(PrintWriter pw, FileDescriptor fd, String name, String[] args) {
3401        pw.print("DUMP OF SERVICE "); pw.print(name); pw.println(":");
3402        IBinder service = ServiceManager.checkService(name);
3403        if (service == null) {
3404            pw.println("  (Service not found)");
3405            return;
3406        }
3407        TransferPipe tp = null;
3408        try {
3409            pw.flush();
3410            tp = new TransferPipe();
3411            tp.setBufferPrefix("  ");
3412            service.dumpAsync(tp.getWriteFd().getFileDescriptor(), args);
3413            tp.go(fd, 10000);
3414        } catch (Throwable e) {
3415            if (tp != null) {
3416                tp.kill();
3417            }
3418            pw.println("Failure dumping service:");
3419            e.printStackTrace(pw);
3420        }
3421    }
3422
3423    /**
3424     * Request that the system start watching for the calling process to exceed a pss
3425     * size as given here.  Once called, the system will look for any occasions where it
3426     * sees the associated process with a larger pss size and, when this happens, automatically
3427     * pull a heap dump from it and allow the user to share the data.  Note that this request
3428     * continues running even if the process is killed and restarted.  To remove the watch,
3429     * use {@link #clearWatchHeapLimit()}.
3430     *
3431     * <p>This API only work if the calling process has been marked as
3432     * {@link ApplicationInfo#FLAG_DEBUGGABLE} or this is running on a debuggable
3433     * (userdebug or eng) build.</p>
3434     *
3435     * <p>Callers can optionally implement {@link #ACTION_REPORT_HEAP_LIMIT} to directly
3436     * handle heap limit reports themselves.</p>
3437     *
3438     * @param pssSize The size in bytes to set the limit at.
3439     */
3440    public void setWatchHeapLimit(long pssSize) {
3441        try {
3442            ActivityManagerNative.getDefault().setDumpHeapDebugLimit(null, 0, pssSize,
3443                    mContext.getPackageName());
3444        } catch (RemoteException e) {
3445            throw e.rethrowFromSystemServer();
3446        }
3447    }
3448
3449    /**
3450     * Action an app can implement to handle reports from {@link #setWatchHeapLimit(long)}.
3451     * If your package has an activity handling this action, it will be launched with the
3452     * heap data provided to it the same way as {@link Intent#ACTION_SEND}.  Note that to
3453     * match the activty must support this action and a MIME type of "*&#47;*".
3454     */
3455    public static final String ACTION_REPORT_HEAP_LIMIT = "android.app.action.REPORT_HEAP_LIMIT";
3456
3457    /**
3458     * Clear a heap watch limit previously set by {@link #setWatchHeapLimit(long)}.
3459     */
3460    public void clearWatchHeapLimit() {
3461        try {
3462            ActivityManagerNative.getDefault().setDumpHeapDebugLimit(null, 0, 0, null);
3463        } catch (RemoteException e) {
3464            throw e.rethrowFromSystemServer();
3465        }
3466    }
3467
3468    /**
3469     * @hide
3470     */
3471    public void startLockTaskMode(int taskId) {
3472        try {
3473            ActivityManagerNative.getDefault().startLockTaskMode(taskId);
3474        } catch (RemoteException e) {
3475            throw e.rethrowFromSystemServer();
3476        }
3477    }
3478
3479    /**
3480     * @hide
3481     */
3482    public void stopLockTaskMode() {
3483        try {
3484            ActivityManagerNative.getDefault().stopLockTaskMode();
3485        } catch (RemoteException e) {
3486            throw e.rethrowFromSystemServer();
3487        }
3488    }
3489
3490    /**
3491     * Return whether currently in lock task mode.  When in this mode
3492     * no new tasks can be created or switched to.
3493     *
3494     * @see Activity#startLockTask()
3495     *
3496     * @deprecated Use {@link #getLockTaskModeState} instead.
3497     */
3498    public boolean isInLockTaskMode() {
3499        return getLockTaskModeState() != LOCK_TASK_MODE_NONE;
3500    }
3501
3502    /**
3503     * Return the current state of task locking. The three possible outcomes
3504     * are {@link #LOCK_TASK_MODE_NONE}, {@link #LOCK_TASK_MODE_LOCKED}
3505     * and {@link #LOCK_TASK_MODE_PINNED}.
3506     *
3507     * @see Activity#startLockTask()
3508     */
3509    public int getLockTaskModeState() {
3510        try {
3511            return ActivityManagerNative.getDefault().getLockTaskModeState();
3512        } catch (RemoteException e) {
3513            throw e.rethrowFromSystemServer();
3514        }
3515    }
3516
3517    /**
3518     * The AppTask allows you to manage your own application's tasks.
3519     * See {@link android.app.ActivityManager#getAppTasks()}
3520     */
3521    public static class AppTask {
3522        private IAppTask mAppTaskImpl;
3523
3524        /** @hide */
3525        public AppTask(IAppTask task) {
3526            mAppTaskImpl = task;
3527        }
3528
3529        /**
3530         * Finishes all activities in this task and removes it from the recent tasks list.
3531         */
3532        public void finishAndRemoveTask() {
3533            try {
3534                mAppTaskImpl.finishAndRemoveTask();
3535            } catch (RemoteException e) {
3536                throw e.rethrowFromSystemServer();
3537            }
3538        }
3539
3540        /**
3541         * Get the RecentTaskInfo associated with this task.
3542         *
3543         * @return The RecentTaskInfo for this task, or null if the task no longer exists.
3544         */
3545        public RecentTaskInfo getTaskInfo() {
3546            try {
3547                return mAppTaskImpl.getTaskInfo();
3548            } catch (RemoteException e) {
3549                throw e.rethrowFromSystemServer();
3550            }
3551        }
3552
3553        /**
3554         * Bring this task to the foreground.  If it contains activities, they will be
3555         * brought to the foreground with it and their instances re-created if needed.
3556         * If it doesn't contain activities, the root activity of the task will be
3557         * re-launched.
3558         */
3559        public void moveToFront() {
3560            try {
3561                mAppTaskImpl.moveToFront();
3562            } catch (RemoteException e) {
3563                throw e.rethrowFromSystemServer();
3564            }
3565        }
3566
3567        /**
3568         * Start an activity in this task.  Brings the task to the foreground.  If this task
3569         * is not currently active (that is, its id < 0), then a new activity for the given
3570         * Intent will be launched as the root of the task and the task brought to the
3571         * foreground.  Otherwise, if this task is currently active and the Intent does not specify
3572         * an activity to launch in a new task, then a new activity for the given Intent will
3573         * be launched on top of the task and the task brought to the foreground.  If this
3574         * task is currently active and the Intent specifies {@link Intent#FLAG_ACTIVITY_NEW_TASK}
3575         * or would otherwise be launched in to a new task, then the activity not launched but
3576         * this task be brought to the foreground and a new intent delivered to the top
3577         * activity if appropriate.
3578         *
3579         * <p>In other words, you generally want to use an Intent here that does not specify
3580         * {@link Intent#FLAG_ACTIVITY_NEW_TASK} or {@link Intent#FLAG_ACTIVITY_NEW_DOCUMENT},
3581         * and let the system do the right thing.</p>
3582         *
3583         * @param intent The Intent describing the new activity to be launched on the task.
3584         * @param options Optional launch options.
3585         *
3586         * @see Activity#startActivity(android.content.Intent, android.os.Bundle)
3587         */
3588        public void startActivity(Context context, Intent intent, Bundle options) {
3589            ActivityThread thread = ActivityThread.currentActivityThread();
3590            thread.getInstrumentation().execStartActivityFromAppTask(context,
3591                    thread.getApplicationThread(), mAppTaskImpl, intent, options);
3592        }
3593
3594        /**
3595         * Modify the {@link Intent#FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS} flag in the root
3596         * Intent of this AppTask.
3597         *
3598         * @param exclude If true, {@link Intent#FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS} will
3599         * be set; otherwise, it will be cleared.
3600         */
3601        public void setExcludeFromRecents(boolean exclude) {
3602            try {
3603                mAppTaskImpl.setExcludeFromRecents(exclude);
3604            } catch (RemoteException e) {
3605                throw e.rethrowFromSystemServer();
3606            }
3607        }
3608    }
3609}
3610