Home | History | Annotate | Download | only in app
      1 /*
      2  * Copyright (C) 2007 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package android.app;
     18 
     19 import android.Manifest;
     20 import android.annotation.IntDef;
     21 import android.annotation.NonNull;
     22 import android.annotation.Nullable;
     23 import android.annotation.RequiresPermission;
     24 import android.annotation.SystemApi;
     25 import android.annotation.SystemService;
     26 import android.annotation.TestApi;
     27 import android.content.ComponentName;
     28 import android.content.Context;
     29 import android.content.Intent;
     30 import android.content.UriPermission;
     31 import android.content.pm.ActivityInfo;
     32 import android.content.pm.ApplicationInfo;
     33 import android.content.pm.ConfigurationInfo;
     34 import android.content.pm.IPackageDataObserver;
     35 import android.content.pm.PackageManager;
     36 import android.content.pm.ParceledListSlice;
     37 import android.content.pm.UserInfo;
     38 import android.content.res.Configuration;
     39 import android.content.res.Resources;
     40 import android.graphics.Bitmap;
     41 import android.graphics.Canvas;
     42 import android.graphics.Color;
     43 import android.graphics.GraphicBuffer;
     44 import android.graphics.Matrix;
     45 import android.graphics.Point;
     46 import android.graphics.Rect;
     47 import android.os.BatteryStats;
     48 import android.os.Build;
     49 import android.os.Build.VERSION_CODES;
     50 import android.os.Bundle;
     51 import android.os.Debug;
     52 import android.os.Handler;
     53 import android.os.IBinder;
     54 import android.os.Parcel;
     55 import android.os.ParcelFileDescriptor;
     56 import android.os.Parcelable;
     57 import android.os.Process;
     58 import android.os.RemoteException;
     59 import android.os.ServiceManager;
     60 import android.os.SystemProperties;
     61 import android.os.UserHandle;
     62 import android.text.TextUtils;
     63 import android.util.ArrayMap;
     64 import android.util.DisplayMetrics;
     65 import android.util.Singleton;
     66 import android.util.Size;
     67 
     68 import com.android.internal.app.procstats.ProcessStats;
     69 import com.android.internal.os.RoSystemProperties;
     70 import com.android.internal.os.TransferPipe;
     71 import com.android.internal.util.FastPrintWriter;
     72 import com.android.server.LocalServices;
     73 
     74 import org.xmlpull.v1.XmlSerializer;
     75 
     76 import java.io.FileDescriptor;
     77 import java.io.FileOutputStream;
     78 import java.io.IOException;
     79 import java.io.PrintWriter;
     80 import java.lang.annotation.Retention;
     81 import java.lang.annotation.RetentionPolicy;
     82 import java.util.ArrayList;
     83 import java.util.List;
     84 
     85 /**
     86  * <p>
     87  * This class gives information about, and interacts
     88  * with, activities, services, and the containing
     89  * process.
     90  * </p>
     91  *
     92  * <p>
     93  * A number of the methods in this class are for
     94  * debugging or informational purposes and they should
     95  * not be used to affect any runtime behavior of
     96  * your app. These methods are called out as such in
     97  * the method level documentation.
     98  * </p>
     99  *
    100  *<p>
    101  * Most application developers should not have the need to
    102  * use this class, most of whose methods are for specialized
    103  * use cases. However, a few methods are more broadly applicable.
    104  * For instance, {@link android.app.ActivityManager#isLowRamDevice() isLowRamDevice()}
    105  * enables your app to detect whether it is running on a low-memory device,
    106  * and behave accordingly.
    107  * {@link android.app.ActivityManager#clearApplicationUserData() clearApplicationUserData()}
    108  * is for apps with reset-data functionality.
    109  * </p>
    110  *
    111  * <p>
    112  * In some special use cases, where an app interacts with
    113  * its Task stack, the app may use the
    114  * {@link android.app.ActivityManager.AppTask} and
    115  * {@link android.app.ActivityManager.RecentTaskInfo} inner
    116  * classes. However, in general, the methods in this class should
    117  * be used for testing and debugging purposes only.
    118  * </p>
    119  */
    120 @SystemService(Context.ACTIVITY_SERVICE)
    121 public class ActivityManager {
    122     private static String TAG = "ActivityManager";
    123 
    124     private static int gMaxRecentTasks = -1;
    125 
    126     private final Context mContext;
    127 
    128     private static volatile boolean sSystemReady = false;
    129 
    130 
    131     private static final int FIRST_START_FATAL_ERROR_CODE = -100;
    132     private static final int LAST_START_FATAL_ERROR_CODE = -1;
    133     private static final int FIRST_START_SUCCESS_CODE = 0;
    134     private static final int LAST_START_SUCCESS_CODE = 99;
    135     private static final int FIRST_START_NON_FATAL_ERROR_CODE = 100;
    136     private static final int LAST_START_NON_FATAL_ERROR_CODE = 199;
    137 
    138     /**
    139      * System property to enable task snapshots.
    140      * @hide
    141      */
    142     public final static boolean ENABLE_TASK_SNAPSHOTS;
    143 
    144     static {
    145         ENABLE_TASK_SNAPSHOTS = SystemProperties.getBoolean("persist.enable_task_snapshots", true);
    146     }
    147 
    148     static final class UidObserver extends IUidObserver.Stub {
    149         final OnUidImportanceListener mListener;
    150         final Context mContext;
    151 
    152         UidObserver(OnUidImportanceListener listener, Context clientContext) {
    153             mListener = listener;
    154             mContext = clientContext;
    155         }
    156 
    157         @Override
    158         public void onUidStateChanged(int uid, int procState, long procStateSeq) {
    159             mListener.onUidImportance(uid, RunningAppProcessInfo.procStateToImportanceForClient(
    160                     procState, mContext));
    161         }
    162 
    163         @Override
    164         public void onUidGone(int uid, boolean disabled) {
    165             mListener.onUidImportance(uid, RunningAppProcessInfo.IMPORTANCE_GONE);
    166         }
    167 
    168         @Override
    169         public void onUidActive(int uid) {
    170         }
    171 
    172         @Override
    173         public void onUidIdle(int uid, boolean disabled) {
    174         }
    175 
    176         @Override public void onUidCachedChanged(int uid, boolean cached) {
    177         }
    178     }
    179 
    180     final ArrayMap<OnUidImportanceListener, UidObserver> mImportanceListeners = new ArrayMap<>();
    181 
    182     /**
    183      * Defines acceptable types of bugreports.
    184      * @hide
    185      */
    186     @Retention(RetentionPolicy.SOURCE)
    187     @IntDef({
    188             BUGREPORT_OPTION_FULL,
    189             BUGREPORT_OPTION_INTERACTIVE,
    190             BUGREPORT_OPTION_REMOTE,
    191             BUGREPORT_OPTION_WEAR,
    192             BUGREPORT_OPTION_TELEPHONY
    193     })
    194     public @interface BugreportMode {}
    195     /**
    196      * Takes a bugreport without user interference (and hence causing less
    197      * interference to the system), but includes all sections.
    198      * @hide
    199      */
    200     public static final int BUGREPORT_OPTION_FULL = 0;
    201     /**
    202      * Allows user to monitor progress and enter additional data; might not include all
    203      * sections.
    204      * @hide
    205      */
    206     public static final int BUGREPORT_OPTION_INTERACTIVE = 1;
    207     /**
    208      * Takes a bugreport requested remotely by administrator of the Device Owner app,
    209      * not the device's user.
    210      * @hide
    211      */
    212     public static final int BUGREPORT_OPTION_REMOTE = 2;
    213     /**
    214      * Takes a bugreport on a wearable device.
    215      * @hide
    216      */
    217     public static final int BUGREPORT_OPTION_WEAR = 3;
    218 
    219     /**
    220      * Takes a lightweight version of bugreport that only includes a few, urgent sections
    221      * used to report telephony bugs.
    222      * @hide
    223      */
    224     public static final int BUGREPORT_OPTION_TELEPHONY = 4;
    225 
    226     /**
    227      * <a href="{@docRoot}guide/topics/manifest/meta-data-element.html">{@code
    228      * <meta-data>}</a> name for a 'home' Activity that declares a package that is to be
    229      * uninstalled in lieu of the declaring one.  The package named here must be
    230      * signed with the same certificate as the one declaring the {@code <meta-data>}.
    231      */
    232     public static final String META_HOME_ALTERNATE = "android.app.home.alternate";
    233 
    234     // NOTE: Before adding a new start result, please reference the defined ranges to ensure the
    235     // result is properly categorized.
    236 
    237     /**
    238      * Result for IActivityManager.startVoiceActivity: active session is currently hidden.
    239      * @hide
    240      */
    241     public static final int START_VOICE_HIDDEN_SESSION = FIRST_START_FATAL_ERROR_CODE;
    242 
    243     /**
    244      * Result for IActivityManager.startVoiceActivity: active session does not match
    245      * the requesting token.
    246      * @hide
    247      */
    248     public static final int START_VOICE_NOT_ACTIVE_SESSION = FIRST_START_FATAL_ERROR_CODE + 1;
    249 
    250     /**
    251      * Result for IActivityManager.startActivity: trying to start a background user
    252      * activity that shouldn't be displayed for all users.
    253      * @hide
    254      */
    255     public static final int START_NOT_CURRENT_USER_ACTIVITY = FIRST_START_FATAL_ERROR_CODE + 2;
    256 
    257     /**
    258      * Result for IActivityManager.startActivity: trying to start an activity under voice
    259      * control when that activity does not support the VOICE category.
    260      * @hide
    261      */
    262     public static final int START_NOT_VOICE_COMPATIBLE = FIRST_START_FATAL_ERROR_CODE + 3;
    263 
    264     /**
    265      * Result for IActivityManager.startActivity: an error where the
    266      * start had to be canceled.
    267      * @hide
    268      */
    269     public static final int START_CANCELED = FIRST_START_FATAL_ERROR_CODE + 4;
    270 
    271     /**
    272      * Result for IActivityManager.startActivity: an error where the
    273      * thing being started is not an activity.
    274      * @hide
    275      */
    276     public static final int START_NOT_ACTIVITY = FIRST_START_FATAL_ERROR_CODE + 5;
    277 
    278     /**
    279      * Result for IActivityManager.startActivity: an error where the
    280      * caller does not have permission to start the activity.
    281      * @hide
    282      */
    283     public static final int START_PERMISSION_DENIED = FIRST_START_FATAL_ERROR_CODE + 6;
    284 
    285     /**
    286      * Result for IActivityManager.startActivity: an error where the
    287      * caller has requested both to forward a result and to receive
    288      * a result.
    289      * @hide
    290      */
    291     public static final int START_FORWARD_AND_REQUEST_CONFLICT = FIRST_START_FATAL_ERROR_CODE + 7;
    292 
    293     /**
    294      * Result for IActivityManager.startActivity: an error where the
    295      * requested class is not found.
    296      * @hide
    297      */
    298     public static final int START_CLASS_NOT_FOUND = FIRST_START_FATAL_ERROR_CODE + 8;
    299 
    300     /**
    301      * Result for IActivityManager.startActivity: an error where the
    302      * given Intent could not be resolved to an activity.
    303      * @hide
    304      */
    305     public static final int START_INTENT_NOT_RESOLVED = FIRST_START_FATAL_ERROR_CODE + 9;
    306 
    307     /**
    308      * Result for IActivityManager.startAssistantActivity: active session is currently hidden.
    309      * @hide
    310      */
    311     public static final int START_ASSISTANT_HIDDEN_SESSION = FIRST_START_FATAL_ERROR_CODE + 10;
    312 
    313     /**
    314      * Result for IActivityManager.startAssistantActivity: active session does not match
    315      * the requesting token.
    316      * @hide
    317      */
    318     public static final int START_ASSISTANT_NOT_ACTIVE_SESSION = FIRST_START_FATAL_ERROR_CODE + 11;
    319 
    320     /**
    321      * Result for IActivityManaqer.startActivity: the activity was started
    322      * successfully as normal.
    323      * @hide
    324      */
    325     public static final int START_SUCCESS = FIRST_START_SUCCESS_CODE;
    326 
    327     /**
    328      * Result for IActivityManaqer.startActivity: the caller asked that the Intent not
    329      * be executed if it is the recipient, and that is indeed the case.
    330      * @hide
    331      */
    332     public static final int START_RETURN_INTENT_TO_CALLER = FIRST_START_SUCCESS_CODE + 1;
    333 
    334     /**
    335      * Result for IActivityManaqer.startActivity: activity wasn't really started, but
    336      * a task was simply brought to the foreground.
    337      * @hide
    338      */
    339     public static final int START_TASK_TO_FRONT = FIRST_START_SUCCESS_CODE + 2;
    340 
    341     /**
    342      * Result for IActivityManaqer.startActivity: activity wasn't really started, but
    343      * the given Intent was given to the existing top activity.
    344      * @hide
    345      */
    346     public static final int START_DELIVERED_TO_TOP = FIRST_START_SUCCESS_CODE + 3;
    347 
    348     /**
    349      * Result for IActivityManaqer.startActivity: request was canceled because
    350      * app switches are temporarily canceled to ensure the user's last request
    351      * (such as pressing home) is performed.
    352      * @hide
    353      */
    354     public static final int START_SWITCHES_CANCELED = FIRST_START_NON_FATAL_ERROR_CODE;
    355 
    356     /**
    357      * Result for IActivityManaqer.startActivity: a new activity was attempted to be started
    358      * while in Lock Task Mode.
    359      * @hide
    360      */
    361     public static final int START_RETURN_LOCK_TASK_MODE_VIOLATION =
    362             FIRST_START_NON_FATAL_ERROR_CODE + 1;
    363 
    364     /**
    365      * Result for IActivityManaqer.startActivity: a new activity start was aborted. Never returned
    366      * externally.
    367      * @hide
    368      */
    369     public static final int START_ABORTED = FIRST_START_NON_FATAL_ERROR_CODE + 2;
    370 
    371     /**
    372      * Flag for IActivityManaqer.startActivity: do special start mode where
    373      * a new activity is launched only if it is needed.
    374      * @hide
    375      */
    376     public static final int START_FLAG_ONLY_IF_NEEDED = 1<<0;
    377 
    378     /**
    379      * Flag for IActivityManaqer.startActivity: launch the app for
    380      * debugging.
    381      * @hide
    382      */
    383     public static final int START_FLAG_DEBUG = 1<<1;
    384 
    385     /**
    386      * Flag for IActivityManaqer.startActivity: launch the app for
    387      * allocation tracking.
    388      * @hide
    389      */
    390     public static final int START_FLAG_TRACK_ALLOCATION = 1<<2;
    391 
    392     /**
    393      * Flag for IActivityManaqer.startActivity: launch the app with
    394      * native debugging support.
    395      * @hide
    396      */
    397     public static final int START_FLAG_NATIVE_DEBUGGING = 1<<3;
    398 
    399     /**
    400      * Result for IActivityManaqer.broadcastIntent: success!
    401      * @hide
    402      */
    403     public static final int BROADCAST_SUCCESS = 0;
    404 
    405     /**
    406      * Result for IActivityManaqer.broadcastIntent: attempt to broadcast
    407      * a sticky intent without appropriate permission.
    408      * @hide
    409      */
    410     public static final int BROADCAST_STICKY_CANT_HAVE_PERMISSION = -1;
    411 
    412     /**
    413      * Result for IActivityManager.broadcastIntent: trying to send a broadcast
    414      * to a stopped user. Fail.
    415      * @hide
    416      */
    417     public static final int BROADCAST_FAILED_USER_STOPPED = -2;
    418 
    419     /**
    420      * Type for IActivityManaqer.getIntentSender: this PendingIntent is
    421      * for a sendBroadcast operation.
    422      * @hide
    423      */
    424     public static final int INTENT_SENDER_BROADCAST = 1;
    425 
    426     /**
    427      * Type for IActivityManaqer.getIntentSender: this PendingIntent is
    428      * for a startActivity operation.
    429      * @hide
    430      */
    431     public static final int INTENT_SENDER_ACTIVITY = 2;
    432 
    433     /**
    434      * Type for IActivityManaqer.getIntentSender: this PendingIntent is
    435      * for an activity result operation.
    436      * @hide
    437      */
    438     public static final int INTENT_SENDER_ACTIVITY_RESULT = 3;
    439 
    440     /**
    441      * Type for IActivityManaqer.getIntentSender: this PendingIntent is
    442      * for a startService operation.
    443      * @hide
    444      */
    445     public static final int INTENT_SENDER_SERVICE = 4;
    446 
    447     /**
    448      * Type for IActivityManaqer.getIntentSender: this PendingIntent is
    449      * for a startForegroundService operation.
    450      * @hide
    451      */
    452     public static final int INTENT_SENDER_FOREGROUND_SERVICE = 5;
    453 
    454     /** @hide User operation call: success! */
    455     public static final int USER_OP_SUCCESS = 0;
    456 
    457     /** @hide User operation call: given user id is not known. */
    458     public static final int USER_OP_UNKNOWN_USER = -1;
    459 
    460     /** @hide User operation call: given user id is the current user, can't be stopped. */
    461     public static final int USER_OP_IS_CURRENT = -2;
    462 
    463     /** @hide User operation call: system user can't be stopped. */
    464     public static final int USER_OP_ERROR_IS_SYSTEM = -3;
    465 
    466     /** @hide User operation call: one of related users cannot be stopped. */
    467     public static final int USER_OP_ERROR_RELATED_USERS_CANNOT_STOP = -4;
    468 
    469     /** @hide Not a real process state. */
    470     public static final int PROCESS_STATE_UNKNOWN = -1;
    471 
    472     /** @hide Process is a persistent system process. */
    473     public static final int PROCESS_STATE_PERSISTENT = 0;
    474 
    475     /** @hide Process is a persistent system process and is doing UI. */
    476     public static final int PROCESS_STATE_PERSISTENT_UI = 1;
    477 
    478     /** @hide Process is hosting the current top activities.  Note that this covers
    479      * all activities that are visible to the user. */
    480     public static final int PROCESS_STATE_TOP = 2;
    481 
    482     /** @hide Process is hosting a foreground service due to a system binding. */
    483     public static final int PROCESS_STATE_BOUND_FOREGROUND_SERVICE = 3;
    484 
    485     /** @hide Process is hosting a foreground service. */
    486     public static final int PROCESS_STATE_FOREGROUND_SERVICE = 4;
    487 
    488     /** @hide Same as {@link #PROCESS_STATE_TOP} but while device is sleeping. */
    489     public static final int PROCESS_STATE_TOP_SLEEPING = 5;
    490 
    491     /** @hide Process is important to the user, and something they are aware of. */
    492     public static final int PROCESS_STATE_IMPORTANT_FOREGROUND = 6;
    493 
    494     /** @hide Process is important to the user, but not something they are aware of. */
    495     public static final int PROCESS_STATE_IMPORTANT_BACKGROUND = 7;
    496 
    497     /** @hide Process is in the background transient so we will try to keep running. */
    498     public static final int PROCESS_STATE_TRANSIENT_BACKGROUND = 8;
    499 
    500     /** @hide Process is in the background running a backup/restore operation. */
    501     public static final int PROCESS_STATE_BACKUP = 9;
    502 
    503     /** @hide Process is in the background, but it can't restore its state so we want
    504      * to try to avoid killing it. */
    505     public static final int PROCESS_STATE_HEAVY_WEIGHT = 10;
    506 
    507     /** @hide Process is in the background running a service.  Unlike oom_adj, this level
    508      * is used for both the normal running in background state and the executing
    509      * operations state. */
    510     public static final int PROCESS_STATE_SERVICE = 11;
    511 
    512     /** @hide Process is in the background running a receiver.   Note that from the
    513      * perspective of oom_adj receivers run at a higher foreground level, but for our
    514      * prioritization here that is not necessary and putting them below services means
    515      * many fewer changes in some process states as they receive broadcasts. */
    516     public static final int PROCESS_STATE_RECEIVER = 12;
    517 
    518     /** @hide Process is in the background but hosts the home activity. */
    519     public static final int PROCESS_STATE_HOME = 13;
    520 
    521     /** @hide Process is in the background but hosts the last shown activity. */
    522     public static final int PROCESS_STATE_LAST_ACTIVITY = 14;
    523 
    524     /** @hide Process is being cached for later use and contains activities. */
    525     public static final int PROCESS_STATE_CACHED_ACTIVITY = 15;
    526 
    527     /** @hide Process is being cached for later use and is a client of another cached
    528      * process that contains activities. */
    529     public static final int PROCESS_STATE_CACHED_ACTIVITY_CLIENT = 16;
    530 
    531     /** @hide Process is being cached for later use and is empty. */
    532     public static final int PROCESS_STATE_CACHED_EMPTY = 17;
    533 
    534     /** @hide Process does not exist. */
    535     public static final int PROCESS_STATE_NONEXISTENT = 18;
    536 
    537     /** @hide The lowest process state number */
    538     public static final int MIN_PROCESS_STATE = PROCESS_STATE_PERSISTENT;
    539 
    540     /** @hide The highest process state number */
    541     public static final int MAX_PROCESS_STATE = PROCESS_STATE_NONEXISTENT;
    542 
    543     /** @hide Should this process state be considered a background state? */
    544     public static final boolean isProcStateBackground(int procState) {
    545         return procState >= PROCESS_STATE_TRANSIENT_BACKGROUND;
    546     }
    547 
    548     /** @hide requestType for assist context: only basic information. */
    549     public static final int ASSIST_CONTEXT_BASIC = 0;
    550 
    551     /** @hide requestType for assist context: generate full AssistStructure. */
    552     public static final int ASSIST_CONTEXT_FULL = 1;
    553 
    554     /** @hide requestType for assist context: generate full AssistStructure for autofill. */
    555     public static final int ASSIST_CONTEXT_AUTOFILL = 2;
    556 
    557     /** @hide Flag for registerUidObserver: report changes in process state. */
    558     public static final int UID_OBSERVER_PROCSTATE = 1<<0;
    559 
    560     /** @hide Flag for registerUidObserver: report uid gone. */
    561     public static final int UID_OBSERVER_GONE = 1<<1;
    562 
    563     /** @hide Flag for registerUidObserver: report uid has become idle. */
    564     public static final int UID_OBSERVER_IDLE = 1<<2;
    565 
    566     /** @hide Flag for registerUidObserver: report uid has become active. */
    567     public static final int UID_OBSERVER_ACTIVE = 1<<3;
    568 
    569     /** @hide Flag for registerUidObserver: report uid cached state has changed. */
    570     public static final int UID_OBSERVER_CACHED = 1<<4;
    571 
    572     /** @hide Mode for {@link IActivityManager#isAppStartModeDisabled}: normal free-to-run operation. */
    573     public static final int APP_START_MODE_NORMAL = 0;
    574 
    575     /** @hide Mode for {@link IActivityManager#isAppStartModeDisabled}: delay running until later. */
    576     public static final int APP_START_MODE_DELAYED = 1;
    577 
    578     /** @hide Mode for {@link IActivityManager#isAppStartModeDisabled}: delay running until later, with
    579      * rigid errors (throwing exception). */
    580     public static final int APP_START_MODE_DELAYED_RIGID = 2;
    581 
    582     /** @hide Mode for {@link IActivityManager#isAppStartModeDisabled}: disable/cancel pending
    583      * launches; this is the mode for ephemeral apps. */
    584     public static final int APP_START_MODE_DISABLED = 3;
    585 
    586     /**
    587      * Lock task mode is not active.
    588      */
    589     public static final int LOCK_TASK_MODE_NONE = 0;
    590 
    591     /**
    592      * Full lock task mode is active.
    593      */
    594     public static final int LOCK_TASK_MODE_LOCKED = 1;
    595 
    596     /**
    597      * App pinning mode is active.
    598      */
    599     public static final int LOCK_TASK_MODE_PINNED = 2;
    600 
    601     Point mAppTaskThumbnailSize;
    602 
    603     /*package*/ ActivityManager(Context context, Handler handler) {
    604         mContext = context;
    605     }
    606 
    607     /**
    608      * Returns whether the launch was successful.
    609      * @hide
    610      */
    611     public static final boolean isStartResultSuccessful(int result) {
    612         return FIRST_START_SUCCESS_CODE <= result && result <= LAST_START_SUCCESS_CODE;
    613     }
    614 
    615     /**
    616      * Returns whether the launch result was a fatal error.
    617      * @hide
    618      */
    619     public static final boolean isStartResultFatalError(int result) {
    620         return FIRST_START_FATAL_ERROR_CODE <= result && result <= LAST_START_FATAL_ERROR_CODE;
    621     }
    622 
    623     /**
    624      * Screen compatibility mode: the application most always run in
    625      * compatibility mode.
    626      * @hide
    627      */
    628     public static final int COMPAT_MODE_ALWAYS = -1;
    629 
    630     /**
    631      * Screen compatibility mode: the application can never run in
    632      * compatibility mode.
    633      * @hide
    634      */
    635     public static final int COMPAT_MODE_NEVER = -2;
    636 
    637     /**
    638      * Screen compatibility mode: unknown.
    639      * @hide
    640      */
    641     public static final int COMPAT_MODE_UNKNOWN = -3;
    642 
    643     /**
    644      * Screen compatibility mode: the application currently has compatibility
    645      * mode disabled.
    646      * @hide
    647      */
    648     public static final int COMPAT_MODE_DISABLED = 0;
    649 
    650     /**
    651      * Screen compatibility mode: the application currently has compatibility
    652      * mode enabled.
    653      * @hide
    654      */
    655     public static final int COMPAT_MODE_ENABLED = 1;
    656 
    657     /**
    658      * Screen compatibility mode: request to toggle the application's
    659      * compatibility mode.
    660      * @hide
    661      */
    662     public static final int COMPAT_MODE_TOGGLE = 2;
    663 
    664     private static final boolean DEVELOPMENT_FORCE_LOW_RAM =
    665             SystemProperties.getBoolean("debug.force_low_ram", false);
    666 
    667     /** @hide */
    668     public static class StackId {
    669         /** Invalid stack ID. */
    670         public static final int INVALID_STACK_ID = -1;
    671 
    672         /** First static stack ID. */
    673         public static final int FIRST_STATIC_STACK_ID = 0;
    674 
    675         /** Home activity stack ID. */
    676         public static final int HOME_STACK_ID = FIRST_STATIC_STACK_ID;
    677 
    678         /** ID of stack where fullscreen activities are normally launched into. */
    679         public static final int FULLSCREEN_WORKSPACE_STACK_ID = 1;
    680 
    681         /** ID of stack where freeform/resized activities are normally launched into. */
    682         public static final int FREEFORM_WORKSPACE_STACK_ID = FULLSCREEN_WORKSPACE_STACK_ID + 1;
    683 
    684         /** ID of stack that occupies a dedicated region of the screen. */
    685         public static final int DOCKED_STACK_ID = FREEFORM_WORKSPACE_STACK_ID + 1;
    686 
    687         /** ID of stack that always on top (always visible) when it exist. */
    688         public static final int PINNED_STACK_ID = DOCKED_STACK_ID + 1;
    689 
    690         /** ID of stack that contains the Recents activity. */
    691         public static final int RECENTS_STACK_ID = PINNED_STACK_ID + 1;
    692 
    693         /** ID of stack that contains activities launched by the assistant. */
    694         public static final int ASSISTANT_STACK_ID = RECENTS_STACK_ID + 1;
    695 
    696         /** Last static stack stack ID. */
    697         public static final int LAST_STATIC_STACK_ID = ASSISTANT_STACK_ID;
    698 
    699         /** Start of ID range used by stacks that are created dynamically. */
    700         public static final int FIRST_DYNAMIC_STACK_ID = LAST_STATIC_STACK_ID + 1;
    701 
    702         public static boolean isStaticStack(int stackId) {
    703             return stackId >= FIRST_STATIC_STACK_ID && stackId <= LAST_STATIC_STACK_ID;
    704         }
    705 
    706         public static boolean isDynamicStack(int stackId) {
    707             return stackId >= FIRST_DYNAMIC_STACK_ID;
    708         }
    709 
    710         /**
    711          * Returns true if the activities contained in the input stack display a shadow around
    712          * their border.
    713          */
    714         public static boolean hasWindowShadow(int stackId) {
    715             return stackId == FREEFORM_WORKSPACE_STACK_ID || stackId == PINNED_STACK_ID;
    716         }
    717 
    718         /**
    719          * Returns true if the activities contained in the input stack display a decor view.
    720          */
    721         public static boolean hasWindowDecor(int stackId) {
    722             return stackId == FREEFORM_WORKSPACE_STACK_ID;
    723         }
    724 
    725         /**
    726          * Returns true if the tasks contained in the stack can be resized independently of the
    727          * stack.
    728          */
    729         public static boolean isTaskResizeAllowed(int stackId) {
    730             return stackId == FREEFORM_WORKSPACE_STACK_ID;
    731         }
    732 
    733         /** Returns true if the task bounds should persist across power cycles. */
    734         public static boolean persistTaskBounds(int stackId) {
    735             return stackId == FREEFORM_WORKSPACE_STACK_ID;
    736         }
    737 
    738         /**
    739          * Returns true if dynamic stacks are allowed to be visible behind the input stack.
    740          */
    741         public static boolean isDynamicStacksVisibleBehindAllowed(int stackId) {
    742             return stackId == PINNED_STACK_ID || stackId == ASSISTANT_STACK_ID;
    743         }
    744 
    745         /**
    746          * Returns true if we try to maintain focus in the current stack when the top activity
    747          * finishes.
    748          */
    749         public static boolean keepFocusInStackIfPossible(int stackId) {
    750             return stackId == FREEFORM_WORKSPACE_STACK_ID
    751                     || stackId == DOCKED_STACK_ID || stackId == PINNED_STACK_ID;
    752         }
    753 
    754         /**
    755          * Returns true if Stack size is affected by the docked stack changing size.
    756          */
    757         public static boolean isResizeableByDockedStack(int stackId) {
    758             return isStaticStack(stackId) && stackId != DOCKED_STACK_ID
    759                     && stackId != PINNED_STACK_ID && stackId != ASSISTANT_STACK_ID;
    760         }
    761 
    762         /**
    763          * Returns true if the size of tasks in the input stack are affected by the docked stack
    764          * changing size.
    765          */
    766         public static boolean isTaskResizeableByDockedStack(int stackId) {
    767             return isStaticStack(stackId) && stackId != FREEFORM_WORKSPACE_STACK_ID
    768                     && stackId != DOCKED_STACK_ID && stackId != PINNED_STACK_ID
    769                     && stackId != ASSISTANT_STACK_ID;
    770         }
    771 
    772         /**
    773          * Returns true if the input stack is affected by drag resizing.
    774          */
    775         public static boolean isStackAffectedByDragResizing(int stackId) {
    776             return isStaticStack(stackId) && stackId != PINNED_STACK_ID
    777                     && stackId != ASSISTANT_STACK_ID;
    778         }
    779 
    780         /**
    781          * Returns true if the windows of tasks being moved to the target stack from the source
    782          * stack should be replaced, meaning that window manager will keep the old window around
    783          * until the new is ready.
    784          */
    785         public static boolean replaceWindowsOnTaskMove(int sourceStackId, int targetStackId) {
    786             return sourceStackId == FREEFORM_WORKSPACE_STACK_ID
    787                     || targetStackId == FREEFORM_WORKSPACE_STACK_ID;
    788         }
    789 
    790         /**
    791          * Return whether a stackId is a stack containing floating windows. Floating windows
    792          * are laid out differently as they are allowed to extend past the display bounds
    793          * without overscan insets.
    794          */
    795         public static boolean tasksAreFloating(int stackId) {
    796             return stackId == FREEFORM_WORKSPACE_STACK_ID
    797                 || stackId == PINNED_STACK_ID;
    798         }
    799 
    800         /**
    801          * Return whether a stackId is a stack that be a backdrop to a translucent activity.  These
    802          * are generally fullscreen stacks.
    803          */
    804         public static boolean isBackdropToTranslucentActivity(int stackId) {
    805             return stackId == FULLSCREEN_WORKSPACE_STACK_ID
    806                     || stackId == ASSISTANT_STACK_ID;
    807         }
    808 
    809         /**
    810          * Returns true if animation specs should be constructed for app transition that moves
    811          * the task to the specified stack.
    812          */
    813         public static boolean useAnimationSpecForAppTransition(int stackId) {
    814             // TODO: INVALID_STACK_ID is also animated because we don't persist stack id's across
    815             // reboots.
    816             return stackId == FREEFORM_WORKSPACE_STACK_ID
    817                     || stackId == FULLSCREEN_WORKSPACE_STACK_ID
    818                     || stackId == ASSISTANT_STACK_ID
    819                     || stackId == DOCKED_STACK_ID
    820                     || stackId == INVALID_STACK_ID;
    821         }
    822 
    823         /**
    824          * Returns true if the windows in the stack can receive input keys.
    825          */
    826         public static boolean canReceiveKeys(int stackId) {
    827             return stackId != PINNED_STACK_ID;
    828         }
    829 
    830         /**
    831          * Returns true if the stack can be visible above lockscreen.
    832          */
    833         public static boolean isAllowedOverLockscreen(int stackId) {
    834             return stackId == HOME_STACK_ID || stackId == FULLSCREEN_WORKSPACE_STACK_ID ||
    835                     stackId == ASSISTANT_STACK_ID;
    836         }
    837 
    838         /**
    839          * Returns true if activities from stasks in the given {@param stackId} are allowed to
    840          * enter picture-in-picture.
    841          */
    842         public static boolean isAllowedToEnterPictureInPicture(int stackId) {
    843             return stackId != HOME_STACK_ID && stackId != ASSISTANT_STACK_ID &&
    844                     stackId != RECENTS_STACK_ID;
    845         }
    846 
    847         public static boolean isAlwaysOnTop(int stackId) {
    848             return stackId == PINNED_STACK_ID;
    849         }
    850 
    851         /**
    852          * Returns true if the top task in the task is allowed to return home when finished and
    853          * there are other tasks in the stack.
    854          */
    855         public static boolean allowTopTaskToReturnHome(int stackId) {
    856             return stackId != PINNED_STACK_ID;
    857         }
    858 
    859         /**
    860          * Returns true if the stack should be resized to match the bounds specified by
    861          * {@link ActivityOptions#setLaunchBounds} when launching an activity into the stack.
    862          */
    863         public static boolean resizeStackWithLaunchBounds(int stackId) {
    864             return stackId == PINNED_STACK_ID;
    865         }
    866 
    867         /**
    868          * Returns true if any visible windows belonging to apps in this stack should be kept on
    869          * screen when the app is killed due to something like the low memory killer.
    870          */
    871         public static boolean keepVisibleDeadAppWindowOnScreen(int stackId) {
    872             return stackId != PINNED_STACK_ID;
    873         }
    874 
    875         /**
    876          * Returns true if the backdrop on the client side should match the frame of the window.
    877          * Returns false, if the backdrop should be fullscreen.
    878          */
    879         public static boolean useWindowFrameForBackdrop(int stackId) {
    880             return stackId == FREEFORM_WORKSPACE_STACK_ID || stackId == PINNED_STACK_ID;
    881         }
    882 
    883         /**
    884          * Returns true if a window from the specified stack with {@param stackId} are normally
    885          * fullscreen, i. e. they can become the top opaque fullscreen window, meaning that it
    886          * controls system bars, lockscreen occluded/dismissing state, screen rotation animation,
    887          * etc.
    888          */
    889         public static boolean normallyFullscreenWindows(int stackId) {
    890             return stackId != PINNED_STACK_ID && stackId != FREEFORM_WORKSPACE_STACK_ID
    891                     && stackId != DOCKED_STACK_ID;
    892         }
    893 
    894         /**
    895          * Returns true if the input stack id should only be present on a device that supports
    896          * multi-window mode.
    897          * @see android.app.ActivityManager#supportsMultiWindow
    898          */
    899         public static boolean isMultiWindowStack(int stackId) {
    900             return stackId == PINNED_STACK_ID || stackId == FREEFORM_WORKSPACE_STACK_ID
    901                     || stackId == DOCKED_STACK_ID;
    902         }
    903 
    904         /**
    905          * Returns true if the input {@param stackId} is HOME_STACK_ID or RECENTS_STACK_ID
    906          */
    907         public static boolean isHomeOrRecentsStack(int stackId) {
    908             return stackId == HOME_STACK_ID || stackId == RECENTS_STACK_ID;
    909         }
    910 
    911         /**
    912          * Returns true if this stack may be scaled without resizing, and windows within may need
    913          * to be configured as such.
    914          */
    915         public static boolean windowsAreScaleable(int stackId) {
    916             return stackId == PINNED_STACK_ID;
    917         }
    918 
    919         /**
    920          * Returns true if windows in this stack should be given move animations by default.
    921          */
    922         public static boolean hasMovementAnimations(int stackId) {
    923             return stackId != PINNED_STACK_ID;
    924         }
    925 
    926         /** Returns true if the input stack and its content can affect the device orientation. */
    927         public static boolean canSpecifyOrientation(int stackId) {
    928             return stackId == HOME_STACK_ID
    929                     || stackId == RECENTS_STACK_ID
    930                     || stackId == FULLSCREEN_WORKSPACE_STACK_ID
    931                     || stackId == ASSISTANT_STACK_ID
    932                     || isDynamicStack(stackId);
    933         }
    934     }
    935 
    936     /**
    937      * Input parameter to {@link android.app.IActivityManager#moveTaskToDockedStack} which
    938      * specifies the position of the created docked stack at the top half of the screen if
    939      * in portrait mode or at the left half of the screen if in landscape mode.
    940      * @hide
    941      */
    942     public static final int DOCKED_STACK_CREATE_MODE_TOP_OR_LEFT = 0;
    943 
    944     /**
    945      * Input parameter to {@link android.app.IActivityManager#moveTaskToDockedStack} which
    946      * specifies the position of the created docked stack at the bottom half of the screen if
    947      * in portrait mode or at the right half of the screen if in landscape mode.
    948      * @hide
    949      */
    950     public static final int DOCKED_STACK_CREATE_MODE_BOTTOM_OR_RIGHT = 1;
    951 
    952     /**
    953      * Input parameter to {@link android.app.IActivityManager#resizeTask} which indicates
    954      * that the resize doesn't need to preserve the window, and can be skipped if bounds
    955      * is unchanged. This mode is used by window manager in most cases.
    956      * @hide
    957      */
    958     public static final int RESIZE_MODE_SYSTEM = 0;
    959 
    960     /**
    961      * Input parameter to {@link android.app.IActivityManager#resizeTask} which indicates
    962      * that the resize should preserve the window if possible.
    963      * @hide
    964      */
    965     public static final int RESIZE_MODE_PRESERVE_WINDOW   = (0x1 << 0);
    966 
    967     /**
    968      * Input parameter to {@link android.app.IActivityManager#resizeTask} which indicates
    969      * that the resize should be performed even if the bounds appears unchanged.
    970      * @hide
    971      */
    972     public static final int RESIZE_MODE_FORCED = (0x1 << 1);
    973 
    974     /**
    975      * Input parameter to {@link android.app.IActivityManager#resizeTask} used by window
    976      * manager during a screen rotation.
    977      * @hide
    978      */
    979     public static final int RESIZE_MODE_SYSTEM_SCREEN_ROTATION = RESIZE_MODE_PRESERVE_WINDOW;
    980 
    981     /**
    982      * Input parameter to {@link android.app.IActivityManager#resizeTask} used when the
    983      * resize is due to a drag action.
    984      * @hide
    985      */
    986     public static final int RESIZE_MODE_USER = RESIZE_MODE_PRESERVE_WINDOW;
    987 
    988     /**
    989      * Input parameter to {@link android.app.IActivityManager#resizeTask} which indicates
    990      * that the resize should preserve the window if possible, and should not be skipped
    991      * even if the bounds is unchanged. Usually used to force a resizing when a drag action
    992      * is ending.
    993      * @hide
    994      */
    995     public static final int RESIZE_MODE_USER_FORCED =
    996             RESIZE_MODE_PRESERVE_WINDOW | RESIZE_MODE_FORCED;
    997 
    998     /** @hide */
    999     public int getFrontActivityScreenCompatMode() {
   1000         try {
   1001             return getService().getFrontActivityScreenCompatMode();
   1002         } catch (RemoteException e) {
   1003             throw e.rethrowFromSystemServer();
   1004         }
   1005     }
   1006 
   1007     /** @hide */
   1008     public void setFrontActivityScreenCompatMode(int mode) {
   1009         try {
   1010             getService().setFrontActivityScreenCompatMode(mode);
   1011         } catch (RemoteException e) {
   1012             throw e.rethrowFromSystemServer();
   1013         }
   1014     }
   1015 
   1016     /** @hide */
   1017     public int getPackageScreenCompatMode(String packageName) {
   1018         try {
   1019             return getService().getPackageScreenCompatMode(packageName);
   1020         } catch (RemoteException e) {
   1021             throw e.rethrowFromSystemServer();
   1022         }
   1023     }
   1024 
   1025     /** @hide */
   1026     public void setPackageScreenCompatMode(String packageName, int mode) {
   1027         try {
   1028             getService().setPackageScreenCompatMode(packageName, mode);
   1029         } catch (RemoteException e) {
   1030             throw e.rethrowFromSystemServer();
   1031         }
   1032     }
   1033 
   1034     /** @hide */
   1035     public boolean getPackageAskScreenCompat(String packageName) {
   1036         try {
   1037             return getService().getPackageAskScreenCompat(packageName);
   1038         } catch (RemoteException e) {
   1039             throw e.rethrowFromSystemServer();
   1040         }
   1041     }
   1042 
   1043     /** @hide */
   1044     public void setPackageAskScreenCompat(String packageName, boolean ask) {
   1045         try {
   1046             getService().setPackageAskScreenCompat(packageName, ask);
   1047         } catch (RemoteException e) {
   1048             throw e.rethrowFromSystemServer();
   1049         }
   1050     }
   1051 
   1052     /**
   1053      * Return the approximate per-application memory class of the current
   1054      * device.  This gives you an idea of how hard a memory limit you should
   1055      * impose on your application to let the overall system work best.  The
   1056      * returned value is in megabytes; the baseline Android memory class is
   1057      * 16 (which happens to be the Java heap limit of those devices); some
   1058      * device with more memory may return 24 or even higher numbers.
   1059      */
   1060     public int getMemoryClass() {
   1061         return staticGetMemoryClass();
   1062     }
   1063 
   1064     /** @hide */
   1065     static public int staticGetMemoryClass() {
   1066         // Really brain dead right now -- just take this from the configured
   1067         // vm heap size, and assume it is in megabytes and thus ends with "m".
   1068         String vmHeapSize = SystemProperties.get("dalvik.vm.heapgrowthlimit", "");
   1069         if (vmHeapSize != null && !"".equals(vmHeapSize)) {
   1070             return Integer.parseInt(vmHeapSize.substring(0, vmHeapSize.length()-1));
   1071         }
   1072         return staticGetLargeMemoryClass();
   1073     }
   1074 
   1075     /**
   1076      * Return the approximate per-application memory class of the current
   1077      * device when an application is running with a large heap.  This is the
   1078      * space available for memory-intensive applications; most applications
   1079      * should not need this amount of memory, and should instead stay with the
   1080      * {@link #getMemoryClass()} limit.  The returned value is in megabytes.
   1081      * This may be the same size as {@link #getMemoryClass()} on memory
   1082      * constrained devices, or it may be significantly larger on devices with
   1083      * a large amount of available RAM.
   1084      *
   1085      * <p>The is the size of the application's Dalvik heap if it has
   1086      * specified <code>android:largeHeap="true"</code> in its manifest.
   1087      */
   1088     public int getLargeMemoryClass() {
   1089         return staticGetLargeMemoryClass();
   1090     }
   1091 
   1092     /** @hide */
   1093     static public int staticGetLargeMemoryClass() {
   1094         // Really brain dead right now -- just take this from the configured
   1095         // vm heap size, and assume it is in megabytes and thus ends with "m".
   1096         String vmHeapSize = SystemProperties.get("dalvik.vm.heapsize", "16m");
   1097         return Integer.parseInt(vmHeapSize.substring(0, vmHeapSize.length() - 1));
   1098     }
   1099 
   1100     /**
   1101      * Returns true if this is a low-RAM device.  Exactly whether a device is low-RAM
   1102      * is ultimately up to the device configuration, but currently it generally means
   1103      * something in the class of a 512MB device with about a 800x480 or less screen.
   1104      * This is mostly intended to be used by apps to determine whether they should turn
   1105      * off certain features that require more RAM.
   1106      */
   1107     public boolean isLowRamDevice() {
   1108         return isLowRamDeviceStatic();
   1109     }
   1110 
   1111     /** @hide */
   1112     public static boolean isLowRamDeviceStatic() {
   1113         return RoSystemProperties.CONFIG_LOW_RAM ||
   1114                 (Build.IS_DEBUGGABLE && DEVELOPMENT_FORCE_LOW_RAM);
   1115     }
   1116 
   1117     /**
   1118      * Returns true if this is a small battery device. Exactly whether a device is considered to be
   1119      * small battery is ultimately up to the device configuration, but currently it generally means
   1120      * something in the class of a device with 1000 mAh or less. This is mostly intended to be used
   1121      * to determine whether certain features should be altered to account for a drastically smaller
   1122      * battery.
   1123      * @hide
   1124      */
   1125     public static boolean isSmallBatteryDevice() {
   1126         return RoSystemProperties.CONFIG_SMALL_BATTERY;
   1127     }
   1128 
   1129     /**
   1130      * Used by persistent processes to determine if they are running on a
   1131      * higher-end device so should be okay using hardware drawing acceleration
   1132      * (which tends to consume a lot more RAM).
   1133      * @hide
   1134      */
   1135     static public boolean isHighEndGfx() {
   1136         return !isLowRamDeviceStatic() &&
   1137                 !Resources.getSystem().getBoolean(com.android.internal.R.bool.config_avoidGfxAccel);
   1138     }
   1139 
   1140     /**
   1141      * Return the maximum number of recents entries that we will maintain and show.
   1142      * @hide
   1143      */
   1144     static public int getMaxRecentTasksStatic() {
   1145         if (gMaxRecentTasks < 0) {
   1146             return gMaxRecentTasks = isLowRamDeviceStatic() ? 36 : 48;
   1147         }
   1148         return gMaxRecentTasks;
   1149     }
   1150 
   1151     /**
   1152      * Return the default limit on the number of recents that an app can make.
   1153      * @hide
   1154      */
   1155     static public int getDefaultAppRecentsLimitStatic() {
   1156         return getMaxRecentTasksStatic() / 6;
   1157     }
   1158 
   1159     /**
   1160      * Return the maximum limit on the number of recents that an app can make.
   1161      * @hide
   1162      */
   1163     static public int getMaxAppRecentsLimitStatic() {
   1164         return getMaxRecentTasksStatic() / 2;
   1165     }
   1166 
   1167     /**
   1168      * Returns true if the system supports at least one form of multi-window.
   1169      * E.g. freeform, split-screen, picture-in-picture.
   1170      * @hide
   1171      */
   1172     static public boolean supportsMultiWindow(Context context) {
   1173         // On watches, multi-window is used to present essential system UI, and thus it must be
   1174         // supported regardless of device memory characteristics.
   1175         boolean isWatch = context.getPackageManager().hasSystemFeature(
   1176                 PackageManager.FEATURE_WATCH);
   1177         return (!isLowRamDeviceStatic() || isWatch)
   1178                 && Resources.getSystem().getBoolean(
   1179                     com.android.internal.R.bool.config_supportsMultiWindow);
   1180     }
   1181 
   1182     /**
   1183      * Returns true if the system supports split screen multi-window.
   1184      * @hide
   1185      */
   1186     static public boolean supportsSplitScreenMultiWindow(Context context) {
   1187         return supportsMultiWindow(context)
   1188                 && Resources.getSystem().getBoolean(
   1189                     com.android.internal.R.bool.config_supportsSplitScreenMultiWindow);
   1190     }
   1191 
   1192     /** @removed */
   1193     @Deprecated
   1194     public static int getMaxNumPictureInPictureActions() {
   1195         return 3;
   1196     }
   1197 
   1198     /**
   1199      * Information you can set and retrieve about the current activity within the recent task list.
   1200      */
   1201     public static class TaskDescription implements Parcelable {
   1202         /** @hide */
   1203         public static final String ATTR_TASKDESCRIPTION_PREFIX = "task_description_";
   1204         private static final String ATTR_TASKDESCRIPTIONLABEL =
   1205                 ATTR_TASKDESCRIPTION_PREFIX + "label";
   1206         private static final String ATTR_TASKDESCRIPTIONCOLOR_PRIMARY =
   1207                 ATTR_TASKDESCRIPTION_PREFIX + "color";
   1208         private static final String ATTR_TASKDESCRIPTIONCOLOR_BACKGROUND =
   1209                 ATTR_TASKDESCRIPTION_PREFIX + "colorBackground";
   1210         private static final String ATTR_TASKDESCRIPTIONICONFILENAME =
   1211                 ATTR_TASKDESCRIPTION_PREFIX + "icon_filename";
   1212 
   1213         private String mLabel;
   1214         private Bitmap mIcon;
   1215         private String mIconFilename;
   1216         private int mColorPrimary;
   1217         private int mColorBackground;
   1218         private int mStatusBarColor;
   1219         private int mNavigationBarColor;
   1220 
   1221         /**
   1222          * Creates the TaskDescription to the specified values.
   1223          *
   1224          * @param label A label and description of the current state of this task.
   1225          * @param icon An icon that represents the current state of this task.
   1226          * @param colorPrimary A color to override the theme's primary color.  This color must be
   1227          *                     opaque.
   1228          */
   1229         public TaskDescription(String label, Bitmap icon, int colorPrimary) {
   1230             this(label, icon, null, colorPrimary, 0, 0, 0);
   1231             if ((colorPrimary != 0) && (Color.alpha(colorPrimary) != 255)) {
   1232                 throw new RuntimeException("A TaskDescription's primary color should be opaque");
   1233             }
   1234         }
   1235 
   1236         /**
   1237          * Creates the TaskDescription to the specified values.
   1238          *
   1239          * @param label A label and description of the current state of this activity.
   1240          * @param icon An icon that represents the current state of this activity.
   1241          */
   1242         public TaskDescription(String label, Bitmap icon) {
   1243             this(label, icon, null, 0, 0, 0, 0);
   1244         }
   1245 
   1246         /**
   1247          * Creates the TaskDescription to the specified values.
   1248          *
   1249          * @param label A label and description of the current state of this activity.
   1250          */
   1251         public TaskDescription(String label) {
   1252             this(label, null, null, 0, 0, 0, 0);
   1253         }
   1254 
   1255         /**
   1256          * Creates an empty TaskDescription.
   1257          */
   1258         public TaskDescription() {
   1259             this(null, null, null, 0, 0, 0, 0);
   1260         }
   1261 
   1262         /** @hide */
   1263         public TaskDescription(String label, Bitmap icon, String iconFilename, int colorPrimary,
   1264                 int colorBackground, int statusBarColor, int navigationBarColor) {
   1265             mLabel = label;
   1266             mIcon = icon;
   1267             mIconFilename = iconFilename;
   1268             mColorPrimary = colorPrimary;
   1269             mColorBackground = colorBackground;
   1270             mStatusBarColor = statusBarColor;
   1271             mNavigationBarColor = navigationBarColor;
   1272         }
   1273 
   1274         /**
   1275          * Creates a copy of another TaskDescription.
   1276          */
   1277         public TaskDescription(TaskDescription td) {
   1278             copyFrom(td);
   1279         }
   1280 
   1281         /**
   1282          * Copies this the values from another TaskDescription.
   1283          * @hide
   1284          */
   1285         public void copyFrom(TaskDescription other) {
   1286             mLabel = other.mLabel;
   1287             mIcon = other.mIcon;
   1288             mIconFilename = other.mIconFilename;
   1289             mColorPrimary = other.mColorPrimary;
   1290             mColorBackground = other.mColorBackground;
   1291             mStatusBarColor = other.mStatusBarColor;
   1292             mNavigationBarColor = other.mNavigationBarColor;
   1293         }
   1294 
   1295         /**
   1296          * Copies this the values from another TaskDescription, but preserves the hidden fields
   1297          * if they weren't set on {@code other}
   1298          * @hide
   1299          */
   1300         public void copyFromPreserveHiddenFields(TaskDescription other) {
   1301             mLabel = other.mLabel;
   1302             mIcon = other.mIcon;
   1303             mIconFilename = other.mIconFilename;
   1304             mColorPrimary = other.mColorPrimary;
   1305             if (other.mColorBackground != 0) {
   1306                 mColorBackground = other.mColorBackground;
   1307             }
   1308             if (other.mStatusBarColor != 0) {
   1309                 mStatusBarColor = other.mStatusBarColor;
   1310             }
   1311             if (other.mNavigationBarColor != 0) {
   1312                 mNavigationBarColor = other.mNavigationBarColor;
   1313             }
   1314         }
   1315 
   1316         private TaskDescription(Parcel source) {
   1317             readFromParcel(source);
   1318         }
   1319 
   1320         /**
   1321          * Sets the label for this task description.
   1322          * @hide
   1323          */
   1324         public void setLabel(String label) {
   1325             mLabel = label;
   1326         }
   1327 
   1328         /**
   1329          * Sets the primary color for this task description.
   1330          * @hide
   1331          */
   1332         public void setPrimaryColor(int primaryColor) {
   1333             // Ensure that the given color is valid
   1334             if ((primaryColor != 0) && (Color.alpha(primaryColor) != 255)) {
   1335                 throw new RuntimeException("A TaskDescription's primary color should be opaque");
   1336             }
   1337             mColorPrimary = primaryColor;
   1338         }
   1339 
   1340         /**
   1341          * Sets the background color for this task description.
   1342          * @hide
   1343          */
   1344         public void setBackgroundColor(int backgroundColor) {
   1345             // Ensure that the given color is valid
   1346             if ((backgroundColor != 0) && (Color.alpha(backgroundColor) != 255)) {
   1347                 throw new RuntimeException("A TaskDescription's background color should be opaque");
   1348             }
   1349             mColorBackground = backgroundColor;
   1350         }
   1351 
   1352         /**
   1353          * @hide
   1354          */
   1355         public void setStatusBarColor(int statusBarColor) {
   1356             mStatusBarColor = statusBarColor;
   1357         }
   1358 
   1359         /**
   1360          * @hide
   1361          */
   1362         public void setNavigationBarColor(int navigationBarColor) {
   1363             mNavigationBarColor = navigationBarColor;
   1364         }
   1365 
   1366         /**
   1367          * Sets the icon for this task description.
   1368          * @hide
   1369          */
   1370         public void setIcon(Bitmap icon) {
   1371             mIcon = icon;
   1372         }
   1373 
   1374         /**
   1375          * Moves the icon bitmap reference from an actual Bitmap to a file containing the
   1376          * bitmap.
   1377          * @hide
   1378          */
   1379         public void setIconFilename(String iconFilename) {
   1380             mIconFilename = iconFilename;
   1381             mIcon = null;
   1382         }
   1383 
   1384         /**
   1385          * @return The label and description of the current state of this task.
   1386          */
   1387         public String getLabel() {
   1388             return mLabel;
   1389         }
   1390 
   1391         /**
   1392          * @return The icon that represents the current state of this task.
   1393          */
   1394         public Bitmap getIcon() {
   1395             if (mIcon != null) {
   1396                 return mIcon;
   1397             }
   1398             return loadTaskDescriptionIcon(mIconFilename, UserHandle.myUserId());
   1399         }
   1400 
   1401         /** @hide */
   1402         public String getIconFilename() {
   1403             return mIconFilename;
   1404         }
   1405 
   1406         /** @hide */
   1407         public Bitmap getInMemoryIcon() {
   1408             return mIcon;
   1409         }
   1410 
   1411         /** @hide */
   1412         public static Bitmap loadTaskDescriptionIcon(String iconFilename, int userId) {
   1413             if (iconFilename != null) {
   1414                 try {
   1415                     return getService().getTaskDescriptionIcon(iconFilename,
   1416                             userId);
   1417                 } catch (RemoteException e) {
   1418                     throw e.rethrowFromSystemServer();
   1419                 }
   1420             }
   1421             return null;
   1422         }
   1423 
   1424         /**
   1425          * @return The color override on the theme's primary color.
   1426          */
   1427         public int getPrimaryColor() {
   1428             return mColorPrimary;
   1429         }
   1430 
   1431         /**
   1432          * @return The background color.
   1433          * @hide
   1434          */
   1435         public int getBackgroundColor() {
   1436             return mColorBackground;
   1437         }
   1438 
   1439         /**
   1440          * @hide
   1441          */
   1442         public int getStatusBarColor() {
   1443             return mStatusBarColor;
   1444         }
   1445 
   1446         /**
   1447          * @hide
   1448          */
   1449         public int getNavigationBarColor() {
   1450             return mNavigationBarColor;
   1451         }
   1452 
   1453         /** @hide */
   1454         public void saveToXml(XmlSerializer out) throws IOException {
   1455             if (mLabel != null) {
   1456                 out.attribute(null, ATTR_TASKDESCRIPTIONLABEL, mLabel);
   1457             }
   1458             if (mColorPrimary != 0) {
   1459                 out.attribute(null, ATTR_TASKDESCRIPTIONCOLOR_PRIMARY,
   1460                         Integer.toHexString(mColorPrimary));
   1461             }
   1462             if (mColorBackground != 0) {
   1463                 out.attribute(null, ATTR_TASKDESCRIPTIONCOLOR_BACKGROUND,
   1464                         Integer.toHexString(mColorBackground));
   1465             }
   1466             if (mIconFilename != null) {
   1467                 out.attribute(null, ATTR_TASKDESCRIPTIONICONFILENAME, mIconFilename);
   1468             }
   1469         }
   1470 
   1471         /** @hide */
   1472         public void restoreFromXml(String attrName, String attrValue) {
   1473             if (ATTR_TASKDESCRIPTIONLABEL.equals(attrName)) {
   1474                 setLabel(attrValue);
   1475             } else if (ATTR_TASKDESCRIPTIONCOLOR_PRIMARY.equals(attrName)) {
   1476                 setPrimaryColor((int) Long.parseLong(attrValue, 16));
   1477             } else if (ATTR_TASKDESCRIPTIONCOLOR_BACKGROUND.equals(attrName)) {
   1478                 setBackgroundColor((int) Long.parseLong(attrValue, 16));
   1479             } else if (ATTR_TASKDESCRIPTIONICONFILENAME.equals(attrName)) {
   1480                 setIconFilename(attrValue);
   1481             }
   1482         }
   1483 
   1484         @Override
   1485         public int describeContents() {
   1486             return 0;
   1487         }
   1488 
   1489         @Override
   1490         public void writeToParcel(Parcel dest, int flags) {
   1491             if (mLabel == null) {
   1492                 dest.writeInt(0);
   1493             } else {
   1494                 dest.writeInt(1);
   1495                 dest.writeString(mLabel);
   1496             }
   1497             if (mIcon == null) {
   1498                 dest.writeInt(0);
   1499             } else {
   1500                 dest.writeInt(1);
   1501                 mIcon.writeToParcel(dest, 0);
   1502             }
   1503             dest.writeInt(mColorPrimary);
   1504             dest.writeInt(mColorBackground);
   1505             dest.writeInt(mStatusBarColor);
   1506             dest.writeInt(mNavigationBarColor);
   1507             if (mIconFilename == null) {
   1508                 dest.writeInt(0);
   1509             } else {
   1510                 dest.writeInt(1);
   1511                 dest.writeString(mIconFilename);
   1512             }
   1513         }
   1514 
   1515         public void readFromParcel(Parcel source) {
   1516             mLabel = source.readInt() > 0 ? source.readString() : null;
   1517             mIcon = source.readInt() > 0 ? Bitmap.CREATOR.createFromParcel(source) : null;
   1518             mColorPrimary = source.readInt();
   1519             mColorBackground = source.readInt();
   1520             mStatusBarColor = source.readInt();
   1521             mNavigationBarColor = source.readInt();
   1522             mIconFilename = source.readInt() > 0 ? source.readString() : null;
   1523         }
   1524 
   1525         public static final Creator<TaskDescription> CREATOR
   1526                 = new Creator<TaskDescription>() {
   1527             public TaskDescription createFromParcel(Parcel source) {
   1528                 return new TaskDescription(source);
   1529             }
   1530             public TaskDescription[] newArray(int size) {
   1531                 return new TaskDescription[size];
   1532             }
   1533         };
   1534 
   1535         @Override
   1536         public String toString() {
   1537             return "TaskDescription Label: " + mLabel + " Icon: " + mIcon +
   1538                     " IconFilename: " + mIconFilename + " colorPrimary: " + mColorPrimary +
   1539                     " colorBackground: " + mColorBackground +
   1540                     " statusBarColor: " + mColorBackground +
   1541                     " navigationBarColor: " + mNavigationBarColor;
   1542         }
   1543     }
   1544 
   1545     /**
   1546      * Information you can retrieve about tasks that the user has most recently
   1547      * started or visited.
   1548      */
   1549     public static class RecentTaskInfo implements Parcelable {
   1550         /**
   1551          * If this task is currently running, this is the identifier for it.
   1552          * If it is not running, this will be -1.
   1553          */
   1554         public int id;
   1555 
   1556         /**
   1557          * The true identifier of this task, valid even if it is not running.
   1558          */
   1559         public int persistentId;
   1560 
   1561         /**
   1562          * The original Intent used to launch the task.  You can use this
   1563          * Intent to re-launch the task (if it is no longer running) or bring
   1564          * the current task to the front.
   1565          */
   1566         public Intent baseIntent;
   1567 
   1568         /**
   1569          * If this task was started from an alias, this is the actual
   1570          * activity component that was initially started; the component of
   1571          * the baseIntent in this case is the name of the actual activity
   1572          * implementation that the alias referred to.  Otherwise, this is null.
   1573          */
   1574         public ComponentName origActivity;
   1575 
   1576         /**
   1577          * The actual activity component that started the task.
   1578          * @hide
   1579          */
   1580         @Nullable
   1581         public ComponentName realActivity;
   1582 
   1583         /**
   1584          * Description of the task's last state.
   1585          */
   1586         public CharSequence description;
   1587 
   1588         /**
   1589          * The id of the ActivityStack this Task was on most recently.
   1590          * @hide
   1591          */
   1592         public int stackId;
   1593 
   1594         /**
   1595          * The id of the user the task was running as.
   1596          * @hide
   1597          */
   1598         public int userId;
   1599 
   1600         /**
   1601          * The first time this task was active.
   1602          * @hide
   1603          */
   1604         public long firstActiveTime;
   1605 
   1606         /**
   1607          * The last time this task was active.
   1608          * @hide
   1609          */
   1610         public long lastActiveTime;
   1611 
   1612         /**
   1613          * The recent activity values for the highest activity in the stack to have set the values.
   1614          * {@link Activity#setTaskDescription(android.app.ActivityManager.TaskDescription)}.
   1615          */
   1616         public TaskDescription taskDescription;
   1617 
   1618         /**
   1619          * Task affiliation for grouping with other tasks.
   1620          */
   1621         public int affiliatedTaskId;
   1622 
   1623         /**
   1624          * Task affiliation color of the source task with the affiliated task id.
   1625          *
   1626          * @hide
   1627          */
   1628         public int affiliatedTaskColor;
   1629 
   1630         /**
   1631          * The component launched as the first activity in the task.
   1632          * This can be considered the "application" of this task.
   1633          */
   1634         public ComponentName baseActivity;
   1635 
   1636         /**
   1637          * The activity component at the top of the history stack of the task.
   1638          * This is what the user is currently doing.
   1639          */
   1640         public ComponentName topActivity;
   1641 
   1642         /**
   1643          * Number of activities in this task.
   1644          */
   1645         public int numActivities;
   1646 
   1647         /**
   1648          * The bounds of the task.
   1649          * @hide
   1650          */
   1651         public Rect bounds;
   1652 
   1653         /**
   1654          * True if the task can go in the docked stack.
   1655          * @hide
   1656          */
   1657         public boolean supportsSplitScreenMultiWindow;
   1658 
   1659         /**
   1660          * The resize mode of the task. See {@link ActivityInfo#resizeMode}.
   1661          * @hide
   1662          */
   1663         public int resizeMode;
   1664 
   1665         public RecentTaskInfo() {
   1666         }
   1667 
   1668         @Override
   1669         public int describeContents() {
   1670             return 0;
   1671         }
   1672 
   1673         @Override
   1674         public void writeToParcel(Parcel dest, int flags) {
   1675             dest.writeInt(id);
   1676             dest.writeInt(persistentId);
   1677             if (baseIntent != null) {
   1678                 dest.writeInt(1);
   1679                 baseIntent.writeToParcel(dest, 0);
   1680             } else {
   1681                 dest.writeInt(0);
   1682             }
   1683             ComponentName.writeToParcel(origActivity, dest);
   1684             ComponentName.writeToParcel(realActivity, dest);
   1685             TextUtils.writeToParcel(description, dest,
   1686                     Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
   1687             if (taskDescription != null) {
   1688                 dest.writeInt(1);
   1689                 taskDescription.writeToParcel(dest, 0);
   1690             } else {
   1691                 dest.writeInt(0);
   1692             }
   1693             dest.writeInt(stackId);
   1694             dest.writeInt(userId);
   1695             dest.writeLong(firstActiveTime);
   1696             dest.writeLong(lastActiveTime);
   1697             dest.writeInt(affiliatedTaskId);
   1698             dest.writeInt(affiliatedTaskColor);
   1699             ComponentName.writeToParcel(baseActivity, dest);
   1700             ComponentName.writeToParcel(topActivity, dest);
   1701             dest.writeInt(numActivities);
   1702             if (bounds != null) {
   1703                 dest.writeInt(1);
   1704                 bounds.writeToParcel(dest, 0);
   1705             } else {
   1706                 dest.writeInt(0);
   1707             }
   1708             dest.writeInt(supportsSplitScreenMultiWindow ? 1 : 0);
   1709             dest.writeInt(resizeMode);
   1710         }
   1711 
   1712         public void readFromParcel(Parcel source) {
   1713             id = source.readInt();
   1714             persistentId = source.readInt();
   1715             baseIntent = source.readInt() > 0 ? Intent.CREATOR.createFromParcel(source) : null;
   1716             origActivity = ComponentName.readFromParcel(source);
   1717             realActivity = ComponentName.readFromParcel(source);
   1718             description = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source);
   1719             taskDescription = source.readInt() > 0 ?
   1720                     TaskDescription.CREATOR.createFromParcel(source) : null;
   1721             stackId = source.readInt();
   1722             userId = source.readInt();
   1723             firstActiveTime = source.readLong();
   1724             lastActiveTime = source.readLong();
   1725             affiliatedTaskId = source.readInt();
   1726             affiliatedTaskColor = source.readInt();
   1727             baseActivity = ComponentName.readFromParcel(source);
   1728             topActivity = ComponentName.readFromParcel(source);
   1729             numActivities = source.readInt();
   1730             bounds = source.readInt() > 0 ?
   1731                     Rect.CREATOR.createFromParcel(source) : null;
   1732             supportsSplitScreenMultiWindow = source.readInt() == 1;
   1733             resizeMode = source.readInt();
   1734         }
   1735 
   1736         public static final Creator<RecentTaskInfo> CREATOR
   1737                 = new Creator<RecentTaskInfo>() {
   1738             public RecentTaskInfo createFromParcel(Parcel source) {
   1739                 return new RecentTaskInfo(source);
   1740             }
   1741             public RecentTaskInfo[] newArray(int size) {
   1742                 return new RecentTaskInfo[size];
   1743             }
   1744         };
   1745 
   1746         private RecentTaskInfo(Parcel source) {
   1747             readFromParcel(source);
   1748         }
   1749     }
   1750 
   1751     /**
   1752      * Flag for use with {@link #getRecentTasks}: return all tasks, even those
   1753      * that have set their
   1754      * {@link android.content.Intent#FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS} flag.
   1755      */
   1756     public static final int RECENT_WITH_EXCLUDED = 0x0001;
   1757 
   1758     /**
   1759      * Provides a list that does not contain any
   1760      * recent tasks that currently are not available to the user.
   1761      */
   1762     public static final int RECENT_IGNORE_UNAVAILABLE = 0x0002;
   1763 
   1764     /**
   1765      * Provides a list that contains recent tasks for all
   1766      * profiles of a user.
   1767      * @hide
   1768      */
   1769     public static final int RECENT_INCLUDE_PROFILES = 0x0004;
   1770 
   1771     /**
   1772      * Ignores all tasks that are on the home stack.
   1773      * @hide
   1774      */
   1775     public static final int RECENT_IGNORE_HOME_AND_RECENTS_STACK_TASKS = 0x0008;
   1776 
   1777     /**
   1778      * Ignores the top task in the docked stack.
   1779      * @hide
   1780      */
   1781     public static final int RECENT_INGORE_DOCKED_STACK_TOP_TASK = 0x0010;
   1782 
   1783     /**
   1784      * Ignores all tasks that are on the pinned stack.
   1785      * @hide
   1786      */
   1787     public static final int RECENT_INGORE_PINNED_STACK_TASKS = 0x0020;
   1788 
   1789     /**
   1790      * <p></p>Return a list of the tasks that the user has recently launched, with
   1791      * the most recent being first and older ones after in order.
   1792      *
   1793      * <p><b>Note: this method is only intended for debugging and presenting
   1794      * task management user interfaces</b>.  This should never be used for
   1795      * core logic in an application, such as deciding between different
   1796      * behaviors based on the information found here.  Such uses are
   1797      * <em>not</em> supported, and will likely break in the future.  For
   1798      * example, if multiple applications can be actively running at the
   1799      * same time, assumptions made about the meaning of the data here for
   1800      * purposes of control flow will be incorrect.</p>
   1801      *
   1802      * @deprecated As of {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this method is
   1803      * no longer available to third party applications: the introduction of
   1804      * document-centric recents means
   1805      * it can leak personal information to the caller.  For backwards compatibility,
   1806      * it will still return a small subset of its data: at least the caller's
   1807      * own tasks (though see {@link #getAppTasks()} for the correct supported
   1808      * way to retrieve that information), and possibly some other tasks
   1809      * such as home that are known to not be sensitive.
   1810      *
   1811      * @param maxNum The maximum number of entries to return in the list.  The
   1812      * actual number returned may be smaller, depending on how many tasks the
   1813      * user has started and the maximum number the system can remember.
   1814      * @param flags Information about what to return.  May be any combination
   1815      * of {@link #RECENT_WITH_EXCLUDED} and {@link #RECENT_IGNORE_UNAVAILABLE}.
   1816      *
   1817      * @return Returns a list of RecentTaskInfo records describing each of
   1818      * the recent tasks.
   1819      */
   1820     @Deprecated
   1821     public List<RecentTaskInfo> getRecentTasks(int maxNum, int flags)
   1822             throws SecurityException {
   1823         try {
   1824             return getService().getRecentTasks(maxNum,
   1825                     flags, UserHandle.myUserId()).getList();
   1826         } catch (RemoteException e) {
   1827             throw e.rethrowFromSystemServer();
   1828         }
   1829     }
   1830 
   1831     /**
   1832      * Same as {@link #getRecentTasks(int, int)} but returns the recent tasks for a
   1833      * specific user. It requires holding
   1834      * the {@link android.Manifest.permission#INTERACT_ACROSS_USERS_FULL} permission.
   1835      * @param maxNum The maximum number of entries to return in the list.  The
   1836      * actual number returned may be smaller, depending on how many tasks the
   1837      * user has started and the maximum number the system can remember.
   1838      * @param flags Information about what to return.  May be any combination
   1839      * of {@link #RECENT_WITH_EXCLUDED} and {@link #RECENT_IGNORE_UNAVAILABLE}.
   1840      *
   1841      * @return Returns a list of RecentTaskInfo records describing each of
   1842      * the recent tasks. Most recently activated tasks go first.
   1843      *
   1844      * @hide
   1845      */
   1846     public List<RecentTaskInfo> getRecentTasksForUser(int maxNum, int flags, int userId)
   1847             throws SecurityException {
   1848         try {
   1849             return getService().getRecentTasks(maxNum,
   1850                     flags, userId).getList();
   1851         } catch (RemoteException e) {
   1852             throw e.rethrowFromSystemServer();
   1853         }
   1854     }
   1855 
   1856     /**
   1857      * Information you can retrieve about a particular task that is currently
   1858      * "running" in the system.  Note that a running task does not mean the
   1859      * given task actually has a process it is actively running in; it simply
   1860      * means that the user has gone to it and never closed it, but currently
   1861      * the system may have killed its process and is only holding on to its
   1862      * last state in order to restart it when the user returns.
   1863      */
   1864     public static class RunningTaskInfo implements Parcelable {
   1865         /**
   1866          * A unique identifier for this task.
   1867          */
   1868         public int id;
   1869 
   1870         /**
   1871          * The stack that currently contains this task.
   1872          * @hide
   1873          */
   1874         public int stackId;
   1875 
   1876         /**
   1877          * The component launched as the first activity in the task.  This can
   1878          * be considered the "application" of this task.
   1879          */
   1880         public ComponentName baseActivity;
   1881 
   1882         /**
   1883          * The activity component at the top of the history stack of the task.
   1884          * This is what the user is currently doing.
   1885          */
   1886         public ComponentName topActivity;
   1887 
   1888         /**
   1889          * Thumbnail representation of the task's current state.  Currently
   1890          * always null.
   1891          */
   1892         public Bitmap thumbnail;
   1893 
   1894         /**
   1895          * Description of the task's current state.
   1896          */
   1897         public CharSequence description;
   1898 
   1899         /**
   1900          * Number of activities in this task.
   1901          */
   1902         public int numActivities;
   1903 
   1904         /**
   1905          * Number of activities that are currently running (not stopped
   1906          * and persisted) in this task.
   1907          */
   1908         public int numRunning;
   1909 
   1910         /**
   1911          * Last time task was run. For sorting.
   1912          * @hide
   1913          */
   1914         public long lastActiveTime;
   1915 
   1916         /**
   1917          * True if the task can go in the docked stack.
   1918          * @hide
   1919          */
   1920         public boolean supportsSplitScreenMultiWindow;
   1921 
   1922         /**
   1923          * The resize mode of the task. See {@link ActivityInfo#resizeMode}.
   1924          * @hide
   1925          */
   1926         public int resizeMode;
   1927 
   1928         public RunningTaskInfo() {
   1929         }
   1930 
   1931         public int describeContents() {
   1932             return 0;
   1933         }
   1934 
   1935         public void writeToParcel(Parcel dest, int flags) {
   1936             dest.writeInt(id);
   1937             dest.writeInt(stackId);
   1938             ComponentName.writeToParcel(baseActivity, dest);
   1939             ComponentName.writeToParcel(topActivity, dest);
   1940             if (thumbnail != null) {
   1941                 dest.writeInt(1);
   1942                 thumbnail.writeToParcel(dest, 0);
   1943             } else {
   1944                 dest.writeInt(0);
   1945             }
   1946             TextUtils.writeToParcel(description, dest,
   1947                     Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
   1948             dest.writeInt(numActivities);
   1949             dest.writeInt(numRunning);
   1950             dest.writeInt(supportsSplitScreenMultiWindow ? 1 : 0);
   1951             dest.writeInt(resizeMode);
   1952         }
   1953 
   1954         public void readFromParcel(Parcel source) {
   1955             id = source.readInt();
   1956             stackId = source.readInt();
   1957             baseActivity = ComponentName.readFromParcel(source);
   1958             topActivity = ComponentName.readFromParcel(source);
   1959             if (source.readInt() != 0) {
   1960                 thumbnail = Bitmap.CREATOR.createFromParcel(source);
   1961             } else {
   1962                 thumbnail = null;
   1963             }
   1964             description = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source);
   1965             numActivities = source.readInt();
   1966             numRunning = source.readInt();
   1967             supportsSplitScreenMultiWindow = source.readInt() != 0;
   1968             resizeMode = source.readInt();
   1969         }
   1970 
   1971         public static final Creator<RunningTaskInfo> CREATOR = new Creator<RunningTaskInfo>() {
   1972             public RunningTaskInfo createFromParcel(Parcel source) {
   1973                 return new RunningTaskInfo(source);
   1974             }
   1975             public RunningTaskInfo[] newArray(int size) {
   1976                 return new RunningTaskInfo[size];
   1977             }
   1978         };
   1979 
   1980         private RunningTaskInfo(Parcel source) {
   1981             readFromParcel(source);
   1982         }
   1983     }
   1984 
   1985     /**
   1986      * Get the list of tasks associated with the calling application.
   1987      *
   1988      * @return The list of tasks associated with the application making this call.
   1989      * @throws SecurityException
   1990      */
   1991     public List<ActivityManager.AppTask> getAppTasks() {
   1992         ArrayList<AppTask> tasks = new ArrayList<AppTask>();
   1993         List<IBinder> appTasks;
   1994         try {
   1995             appTasks = getService().getAppTasks(mContext.getPackageName());
   1996         } catch (RemoteException e) {
   1997             throw e.rethrowFromSystemServer();
   1998         }
   1999         int numAppTasks = appTasks.size();
   2000         for (int i = 0; i < numAppTasks; i++) {
   2001             tasks.add(new AppTask(IAppTask.Stub.asInterface(appTasks.get(i))));
   2002         }
   2003         return tasks;
   2004     }
   2005 
   2006     /**
   2007      * Return the current design dimensions for {@link AppTask} thumbnails, for use
   2008      * with {@link #addAppTask}.
   2009      */
   2010     public Size getAppTaskThumbnailSize() {
   2011         synchronized (this) {
   2012             ensureAppTaskThumbnailSizeLocked();
   2013             return new Size(mAppTaskThumbnailSize.x, mAppTaskThumbnailSize.y);
   2014         }
   2015     }
   2016 
   2017     private void ensureAppTaskThumbnailSizeLocked() {
   2018         if (mAppTaskThumbnailSize == null) {
   2019             try {
   2020                 mAppTaskThumbnailSize = getService().getAppTaskThumbnailSize();
   2021             } catch (RemoteException e) {
   2022                 throw e.rethrowFromSystemServer();
   2023             }
   2024         }
   2025     }
   2026 
   2027     /**
   2028      * Add a new {@link AppTask} for the calling application.  This will create a new
   2029      * recents entry that is added to the <b>end</b> of all existing recents.
   2030      *
   2031      * @param activity The activity that is adding the entry.   This is used to help determine
   2032      * the context that the new recents entry will be in.
   2033      * @param intent The Intent that describes the recents entry.  This is the same Intent that
   2034      * you would have used to launch the activity for it.  In generally you will want to set
   2035      * both {@link Intent#FLAG_ACTIVITY_NEW_DOCUMENT} and
   2036      * {@link Intent#FLAG_ACTIVITY_RETAIN_IN_RECENTS}; the latter is required since this recents
   2037      * entry will exist without an activity, so it doesn't make sense to not retain it when
   2038      * its activity disappears.  The given Intent here also must have an explicit ComponentName
   2039      * set on it.
   2040      * @param description Optional additional description information.
   2041      * @param thumbnail Thumbnail to use for the recents entry.  Should be the size given by
   2042      * {@link #getAppTaskThumbnailSize()}.  If the bitmap is not that exact size, it will be
   2043      * recreated in your process, probably in a way you don't like, before the recents entry
   2044      * is added.
   2045      *
   2046      * @return Returns the task id of the newly added app task, or -1 if the add failed.  The
   2047      * most likely cause of failure is that there is no more room for more tasks for your app.
   2048      */
   2049     public int addAppTask(@NonNull Activity activity, @NonNull Intent intent,
   2050             @Nullable TaskDescription description, @NonNull Bitmap thumbnail) {
   2051         Point size;
   2052         synchronized (this) {
   2053             ensureAppTaskThumbnailSizeLocked();
   2054             size = mAppTaskThumbnailSize;
   2055         }
   2056         final int tw = thumbnail.getWidth();
   2057         final int th = thumbnail.getHeight();
   2058         if (tw != size.x || th != size.y) {
   2059             Bitmap bm = Bitmap.createBitmap(size.x, size.y, thumbnail.getConfig());
   2060 
   2061             // Use ScaleType.CENTER_CROP, except we leave the top edge at the top.
   2062             float scale;
   2063             float dx = 0, dy = 0;
   2064             if (tw * size.x > size.y * th) {
   2065                 scale = (float) size.x / (float) th;
   2066                 dx = (size.y - tw * scale) * 0.5f;
   2067             } else {
   2068                 scale = (float) size.y / (float) tw;
   2069                 dy = (size.x - th * scale) * 0.5f;
   2070             }
   2071             Matrix matrix = new Matrix();
   2072             matrix.setScale(scale, scale);
   2073             matrix.postTranslate((int) (dx + 0.5f), 0);
   2074 
   2075             Canvas canvas = new Canvas(bm);
   2076             canvas.drawBitmap(thumbnail, matrix, null);
   2077             canvas.setBitmap(null);
   2078 
   2079             thumbnail = bm;
   2080         }
   2081         if (description == null) {
   2082             description = new TaskDescription();
   2083         }
   2084         try {
   2085             return getService().addAppTask(activity.getActivityToken(),
   2086                     intent, description, thumbnail);
   2087         } catch (RemoteException e) {
   2088             throw e.rethrowFromSystemServer();
   2089         }
   2090     }
   2091 
   2092     /**
   2093      * Return a list of the tasks that are currently running, with
   2094      * the most recent being first and older ones after in order.  Note that
   2095      * "running" does not mean any of the task's code is currently loaded or
   2096      * activity -- the task may have been frozen by the system, so that it
   2097      * can be restarted in its previous state when next brought to the
   2098      * foreground.
   2099      *
   2100      * <p><b>Note: this method is only intended for debugging and presenting
   2101      * task management user interfaces</b>.  This should never be used for
   2102      * core logic in an application, such as deciding between different
   2103      * behaviors based on the information found here.  Such uses are
   2104      * <em>not</em> supported, and will likely break in the future.  For
   2105      * example, if multiple applications can be actively running at the
   2106      * same time, assumptions made about the meaning of the data here for
   2107      * purposes of control flow will be incorrect.</p>
   2108      *
   2109      * @deprecated As of {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this method
   2110      * is no longer available to third party
   2111      * applications: the introduction of document-centric recents means
   2112      * it can leak person information to the caller.  For backwards compatibility,
   2113      * it will still retu rn a small subset of its data: at least the caller's
   2114      * own tasks, and possibly some other tasks
   2115      * such as home that are known to not be sensitive.
   2116      *
   2117      * @param maxNum The maximum number of entries to return in the list.  The
   2118      * actual number returned may be smaller, depending on how many tasks the
   2119      * user has started.
   2120      *
   2121      * @return Returns a list of RunningTaskInfo records describing each of
   2122      * the running tasks.
   2123      */
   2124     @Deprecated
   2125     public List<RunningTaskInfo> getRunningTasks(int maxNum)
   2126             throws SecurityException {
   2127         try {
   2128             return getService().getTasks(maxNum, 0);
   2129         } catch (RemoteException e) {
   2130             throw e.rethrowFromSystemServer();
   2131         }
   2132     }
   2133 
   2134     /**
   2135      * Completely remove the given task.
   2136      *
   2137      * @param taskId Identifier of the task to be removed.
   2138      * @return Returns true if the given task was found and removed.
   2139      *
   2140      * @hide
   2141      */
   2142     public boolean removeTask(int taskId) throws SecurityException {
   2143         try {
   2144             return getService().removeTask(taskId);
   2145         } catch (RemoteException e) {
   2146             throw e.rethrowFromSystemServer();
   2147         }
   2148     }
   2149 
   2150     /**
   2151      * Metadata related to the {@link TaskThumbnail}.
   2152      *
   2153      * @hide
   2154      */
   2155     public static class TaskThumbnailInfo implements Parcelable {
   2156         /** @hide */
   2157         public static final String ATTR_TASK_THUMBNAILINFO_PREFIX = "task_thumbnailinfo_";
   2158         private static final String ATTR_TASK_WIDTH =
   2159                 ATTR_TASK_THUMBNAILINFO_PREFIX + "task_width";
   2160         private static final String ATTR_TASK_HEIGHT =
   2161                 ATTR_TASK_THUMBNAILINFO_PREFIX + "task_height";
   2162         private static final String ATTR_SCREEN_ORIENTATION =
   2163                 ATTR_TASK_THUMBNAILINFO_PREFIX + "screen_orientation";
   2164 
   2165         public int taskWidth;
   2166         public int taskHeight;
   2167         public int screenOrientation = Configuration.ORIENTATION_UNDEFINED;
   2168 
   2169         public TaskThumbnailInfo() {
   2170             // Do nothing
   2171         }
   2172 
   2173         private TaskThumbnailInfo(Parcel source) {
   2174             readFromParcel(source);
   2175         }
   2176 
   2177         /**
   2178          * Resets this info state to the initial state.
   2179          * @hide
   2180          */
   2181         public void reset() {
   2182             taskWidth = 0;
   2183             taskHeight = 0;
   2184             screenOrientation = Configuration.ORIENTATION_UNDEFINED;
   2185         }
   2186 
   2187         /**
   2188          * Copies from another ThumbnailInfo.
   2189          */
   2190         public void copyFrom(TaskThumbnailInfo o) {
   2191             taskWidth = o.taskWidth;
   2192             taskHeight = o.taskHeight;
   2193             screenOrientation = o.screenOrientation;
   2194         }
   2195 
   2196         /** @hide */
   2197         public void saveToXml(XmlSerializer out) throws IOException {
   2198             out.attribute(null, ATTR_TASK_WIDTH, Integer.toString(taskWidth));
   2199             out.attribute(null, ATTR_TASK_HEIGHT, Integer.toString(taskHeight));
   2200             out.attribute(null, ATTR_SCREEN_ORIENTATION, Integer.toString(screenOrientation));
   2201         }
   2202 
   2203         /** @hide */
   2204         public void restoreFromXml(String attrName, String attrValue) {
   2205             if (ATTR_TASK_WIDTH.equals(attrName)) {
   2206                 taskWidth = Integer.parseInt(attrValue);
   2207             } else if (ATTR_TASK_HEIGHT.equals(attrName)) {
   2208                 taskHeight = Integer.parseInt(attrValue);
   2209             } else if (ATTR_SCREEN_ORIENTATION.equals(attrName)) {
   2210                 screenOrientation = Integer.parseInt(attrValue);
   2211             }
   2212         }
   2213 
   2214         public int describeContents() {
   2215             return 0;
   2216         }
   2217 
   2218         public void writeToParcel(Parcel dest, int flags) {
   2219             dest.writeInt(taskWidth);
   2220             dest.writeInt(taskHeight);
   2221             dest.writeInt(screenOrientation);
   2222         }
   2223 
   2224         public void readFromParcel(Parcel source) {
   2225             taskWidth = source.readInt();
   2226             taskHeight = source.readInt();
   2227             screenOrientation = source.readInt();
   2228         }
   2229 
   2230         public static final Creator<TaskThumbnailInfo> CREATOR = new Creator<TaskThumbnailInfo>() {
   2231             public TaskThumbnailInfo createFromParcel(Parcel source) {
   2232                 return new TaskThumbnailInfo(source);
   2233             }
   2234             public TaskThumbnailInfo[] newArray(int size) {
   2235                 return new TaskThumbnailInfo[size];
   2236             }
   2237         };
   2238     }
   2239 
   2240     /** @hide */
   2241     public static class TaskThumbnail implements Parcelable {
   2242         public Bitmap mainThumbnail;
   2243         public ParcelFileDescriptor thumbnailFileDescriptor;
   2244         public TaskThumbnailInfo thumbnailInfo;
   2245 
   2246         public TaskThumbnail() {
   2247         }
   2248 
   2249         private TaskThumbnail(Parcel source) {
   2250             readFromParcel(source);
   2251         }
   2252 
   2253         public int describeContents() {
   2254             if (thumbnailFileDescriptor != null) {
   2255                 return thumbnailFileDescriptor.describeContents();
   2256             }
   2257             return 0;
   2258         }
   2259 
   2260         public void writeToParcel(Parcel dest, int flags) {
   2261             if (mainThumbnail != null) {
   2262                 dest.writeInt(1);
   2263                 mainThumbnail.writeToParcel(dest, flags);
   2264             } else {
   2265                 dest.writeInt(0);
   2266             }
   2267             if (thumbnailFileDescriptor != null) {
   2268                 dest.writeInt(1);
   2269                 thumbnailFileDescriptor.writeToParcel(dest, flags);
   2270             } else {
   2271                 dest.writeInt(0);
   2272             }
   2273             if (thumbnailInfo != null) {
   2274                 dest.writeInt(1);
   2275                 thumbnailInfo.writeToParcel(dest, flags);
   2276             } else {
   2277                 dest.writeInt(0);
   2278             }
   2279         }
   2280 
   2281         public void readFromParcel(Parcel source) {
   2282             if (source.readInt() != 0) {
   2283                 mainThumbnail = Bitmap.CREATOR.createFromParcel(source);
   2284             } else {
   2285                 mainThumbnail = null;
   2286             }
   2287             if (source.readInt() != 0) {
   2288                 thumbnailFileDescriptor = ParcelFileDescriptor.CREATOR.createFromParcel(source);
   2289             } else {
   2290                 thumbnailFileDescriptor = null;
   2291             }
   2292             if (source.readInt() != 0) {
   2293                 thumbnailInfo = TaskThumbnailInfo.CREATOR.createFromParcel(source);
   2294             } else {
   2295                 thumbnailInfo = null;
   2296             }
   2297         }
   2298 
   2299         public static final Creator<TaskThumbnail> CREATOR = new Creator<TaskThumbnail>() {
   2300             public TaskThumbnail createFromParcel(Parcel source) {
   2301                 return new TaskThumbnail(source);
   2302             }
   2303             public TaskThumbnail[] newArray(int size) {
   2304                 return new TaskThumbnail[size];
   2305             }
   2306         };
   2307     }
   2308 
   2309     /**
   2310      * Represents a task snapshot.
   2311      * @hide
   2312      */
   2313     public static class TaskSnapshot implements Parcelable {
   2314 
   2315         private final GraphicBuffer mSnapshot;
   2316         private final int mOrientation;
   2317         private final Rect mContentInsets;
   2318         private final boolean mReducedResolution;
   2319         private final float mScale;
   2320 
   2321         public TaskSnapshot(GraphicBuffer snapshot, int orientation, Rect contentInsets,
   2322                 boolean reducedResolution, float scale) {
   2323             mSnapshot = snapshot;
   2324             mOrientation = orientation;
   2325             mContentInsets = new Rect(contentInsets);
   2326             mReducedResolution = reducedResolution;
   2327             mScale = scale;
   2328         }
   2329 
   2330         private TaskSnapshot(Parcel source) {
   2331             mSnapshot = source.readParcelable(null /* classLoader */);
   2332             mOrientation = source.readInt();
   2333             mContentInsets = source.readParcelable(null /* classLoader */);
   2334             mReducedResolution = source.readBoolean();
   2335             mScale = source.readFloat();
   2336         }
   2337 
   2338         /**
   2339          * @return The graphic buffer representing the screenshot.
   2340          */
   2341         public GraphicBuffer getSnapshot() {
   2342             return mSnapshot;
   2343         }
   2344 
   2345         /**
   2346          * @return The screen orientation the screenshot was taken in.
   2347          */
   2348         public int getOrientation() {
   2349             return mOrientation;
   2350         }
   2351 
   2352         /**
   2353          * @return The system/content insets on the snapshot. These can be clipped off in order to
   2354          *         remove any areas behind system bars in the snapshot.
   2355          */
   2356         public Rect getContentInsets() {
   2357             return mContentInsets;
   2358         }
   2359 
   2360         /**
   2361          * @return Whether this snapshot is a down-sampled version of the full resolution.
   2362          */
   2363         public boolean isReducedResolution() {
   2364             return mReducedResolution;
   2365         }
   2366 
   2367         /**
   2368          * @return The scale this snapshot was taken in.
   2369          */
   2370         public float getScale() {
   2371             return mScale;
   2372         }
   2373 
   2374         @Override
   2375         public int describeContents() {
   2376             return 0;
   2377         }
   2378 
   2379         @Override
   2380         public void writeToParcel(Parcel dest, int flags) {
   2381             dest.writeParcelable(mSnapshot, 0);
   2382             dest.writeInt(mOrientation);
   2383             dest.writeParcelable(mContentInsets, 0);
   2384             dest.writeBoolean(mReducedResolution);
   2385             dest.writeFloat(mScale);
   2386         }
   2387 
   2388         @Override
   2389         public String toString() {
   2390             return "TaskSnapshot{mSnapshot=" + mSnapshot + " mOrientation=" + mOrientation
   2391                     + " mContentInsets=" + mContentInsets.toShortString()
   2392                     + " mReducedResolution=" + mReducedResolution + " mScale=" + mScale;
   2393         }
   2394 
   2395         public static final Creator<TaskSnapshot> CREATOR = new Creator<TaskSnapshot>() {
   2396             public TaskSnapshot createFromParcel(Parcel source) {
   2397                 return new TaskSnapshot(source);
   2398             }
   2399             public TaskSnapshot[] newArray(int size) {
   2400                 return new TaskSnapshot[size];
   2401             }
   2402         };
   2403     }
   2404 
   2405     /** @hide */
   2406     public TaskThumbnail getTaskThumbnail(int id) throws SecurityException {
   2407         try {
   2408             return getService().getTaskThumbnail(id);
   2409         } catch (RemoteException e) {
   2410             throw e.rethrowFromSystemServer();
   2411         }
   2412     }
   2413 
   2414     /** @hide */
   2415     @IntDef(flag = true, prefix = { "MOVE_TASK_" }, value = {
   2416             MOVE_TASK_WITH_HOME,
   2417             MOVE_TASK_NO_USER_ACTION,
   2418     })
   2419     @Retention(RetentionPolicy.SOURCE)
   2420     public @interface MoveTaskFlags {}
   2421 
   2422     /**
   2423      * Flag for {@link #moveTaskToFront(int, int)}: also move the "home"
   2424      * activity along with the task, so it is positioned immediately behind
   2425      * the task.
   2426      */
   2427     public static final int MOVE_TASK_WITH_HOME = 0x00000001;
   2428 
   2429     /**
   2430      * Flag for {@link #moveTaskToFront(int, int)}: don't count this as a
   2431      * user-instigated action, so the current activity will not receive a
   2432      * hint that the user is leaving.
   2433      */
   2434     public static final int MOVE_TASK_NO_USER_ACTION = 0x00000002;
   2435 
   2436     /**
   2437      * Equivalent to calling {@link #moveTaskToFront(int, int, Bundle)}
   2438      * with a null options argument.
   2439      *
   2440      * @param taskId The identifier of the task to be moved, as found in
   2441      * {@link RunningTaskInfo} or {@link RecentTaskInfo}.
   2442      * @param flags Additional operational flags.
   2443      */
   2444     @RequiresPermission(android.Manifest.permission.REORDER_TASKS)
   2445     public void moveTaskToFront(int taskId, @MoveTaskFlags int flags) {
   2446         moveTaskToFront(taskId, flags, null);
   2447     }
   2448 
   2449     /**
   2450      * Ask that the task associated with a given task ID be moved to the
   2451      * front of the stack, so it is now visible to the user.
   2452      *
   2453      * @param taskId The identifier of the task to be moved, as found in
   2454      * {@link RunningTaskInfo} or {@link RecentTaskInfo}.
   2455      * @param flags Additional operational flags.
   2456      * @param options Additional options for the operation, either null or
   2457      * as per {@link Context#startActivity(Intent, android.os.Bundle)
   2458      * Context.startActivity(Intent, Bundle)}.
   2459      */
   2460     @RequiresPermission(android.Manifest.permission.REORDER_TASKS)
   2461     public void moveTaskToFront(int taskId, @MoveTaskFlags int flags, Bundle options) {
   2462         try {
   2463             getService().moveTaskToFront(taskId, flags, options);
   2464         } catch (RemoteException e) {
   2465             throw e.rethrowFromSystemServer();
   2466         }
   2467     }
   2468 
   2469     /**
   2470      * Information you can retrieve about a particular Service that is
   2471      * currently running in the system.
   2472      */
   2473     public static class RunningServiceInfo implements Parcelable {
   2474         /**
   2475          * The service component.
   2476          */
   2477         public ComponentName service;
   2478 
   2479         /**
   2480          * If non-zero, this is the process the service is running in.
   2481          */
   2482         public int pid;
   2483 
   2484         /**
   2485          * The UID that owns this service.
   2486          */
   2487         public int uid;
   2488 
   2489         /**
   2490          * The name of the process this service runs in.
   2491          */
   2492         public String process;
   2493 
   2494         /**
   2495          * Set to true if the service has asked to run as a foreground process.
   2496          */
   2497         public boolean foreground;
   2498 
   2499         /**
   2500          * The time when the service was first made active, either by someone
   2501          * starting or binding to it.  This
   2502          * is in units of {@link android.os.SystemClock#elapsedRealtime()}.
   2503          */
   2504         public long activeSince;
   2505 
   2506         /**
   2507          * Set to true if this service has been explicitly started.
   2508          */
   2509         public boolean started;
   2510 
   2511         /**
   2512          * Number of clients connected to the service.
   2513          */
   2514         public int clientCount;
   2515 
   2516         /**
   2517          * Number of times the service's process has crashed while the service
   2518          * is running.
   2519          */
   2520         public int crashCount;
   2521 
   2522         /**
   2523          * The time when there was last activity in the service (either
   2524          * explicit requests to start it or clients binding to it).  This
   2525          * is in units of {@link android.os.SystemClock#uptimeMillis()}.
   2526          */
   2527         public long lastActivityTime;
   2528 
   2529         /**
   2530          * If non-zero, this service is not currently running, but scheduled to
   2531          * restart at the given time.
   2532          */
   2533         public long restarting;
   2534 
   2535         /**
   2536          * Bit for {@link #flags}: set if this service has been
   2537          * explicitly started.
   2538          */
   2539         public static final int FLAG_STARTED = 1<<0;
   2540 
   2541         /**
   2542          * Bit for {@link #flags}: set if the service has asked to
   2543          * run as a foreground process.
   2544          */
   2545         public static final int FLAG_FOREGROUND = 1<<1;
   2546 
   2547         /**
   2548          * Bit for {@link #flags}: set if the service is running in a
   2549          * core system process.
   2550          */
   2551         public static final int FLAG_SYSTEM_PROCESS = 1<<2;
   2552 
   2553         /**
   2554          * Bit for {@link #flags}: set if the service is running in a
   2555          * persistent process.
   2556          */
   2557         public static final int FLAG_PERSISTENT_PROCESS = 1<<3;
   2558 
   2559         /**
   2560          * Running flags.
   2561          */
   2562         public int flags;
   2563 
   2564         /**
   2565          * For special services that are bound to by system code, this is
   2566          * the package that holds the binding.
   2567          */
   2568         public String clientPackage;
   2569 
   2570         /**
   2571          * For special services that are bound to by system code, this is
   2572          * a string resource providing a user-visible label for who the
   2573          * client is.
   2574          */
   2575         public int clientLabel;
   2576 
   2577         public RunningServiceInfo() {
   2578         }
   2579 
   2580         public int describeContents() {
   2581             return 0;
   2582         }
   2583 
   2584         public void writeToParcel(Parcel dest, int flags) {
   2585             ComponentName.writeToParcel(service, dest);
   2586             dest.writeInt(pid);
   2587             dest.writeInt(uid);
   2588             dest.writeString(process);
   2589             dest.writeInt(foreground ? 1 : 0);
   2590             dest.writeLong(activeSince);
   2591             dest.writeInt(started ? 1 : 0);
   2592             dest.writeInt(clientCount);
   2593             dest.writeInt(crashCount);
   2594             dest.writeLong(lastActivityTime);
   2595             dest.writeLong(restarting);
   2596             dest.writeInt(this.flags);
   2597             dest.writeString(clientPackage);
   2598             dest.writeInt(clientLabel);
   2599         }
   2600 
   2601         public void readFromParcel(Parcel source) {
   2602             service = ComponentName.readFromParcel(source);
   2603             pid = source.readInt();
   2604             uid = source.readInt();
   2605             process = source.readString();
   2606             foreground = source.readInt() != 0;
   2607             activeSince = source.readLong();
   2608             started = source.readInt() != 0;
   2609             clientCount = source.readInt();
   2610             crashCount = source.readInt();
   2611             lastActivityTime = source.readLong();
   2612             restarting = source.readLong();
   2613             flags = source.readInt();
   2614             clientPackage = source.readString();
   2615             clientLabel = source.readInt();
   2616         }
   2617 
   2618         public static final Creator<RunningServiceInfo> CREATOR = new Creator<RunningServiceInfo>() {
   2619             public RunningServiceInfo createFromParcel(Parcel source) {
   2620                 return new RunningServiceInfo(source);
   2621             }
   2622             public RunningServiceInfo[] newArray(int size) {
   2623                 return new RunningServiceInfo[size];
   2624             }
   2625         };
   2626 
   2627         private RunningServiceInfo(Parcel source) {
   2628             readFromParcel(source);
   2629         }
   2630     }
   2631 
   2632     /**
   2633      * Return a list of the services that are currently running.
   2634      *
   2635      * <p><b>Note: this method is only intended for debugging or implementing
   2636      * service management type user interfaces.</b></p>
   2637      *
   2638      * @deprecated As of {@link android.os.Build.VERSION_CODES#O}, this method
   2639      * is no longer available to third party applications.  For backwards compatibility,
   2640      * it will still return the caller's own services.
   2641      *
   2642      * @param maxNum The maximum number of entries to return in the list.  The
   2643      * actual number returned may be smaller, depending on how many services
   2644      * are running.
   2645      *
   2646      * @return Returns a list of RunningServiceInfo records describing each of
   2647      * the running tasks.
   2648      */
   2649     @Deprecated
   2650     public List<RunningServiceInfo> getRunningServices(int maxNum)
   2651             throws SecurityException {
   2652         try {
   2653             return getService()
   2654                     .getServices(maxNum, 0);
   2655         } catch (RemoteException e) {
   2656             throw e.rethrowFromSystemServer();
   2657         }
   2658     }
   2659 
   2660     /**
   2661      * Returns a PendingIntent you can start to show a control panel for the
   2662      * given running service.  If the service does not have a control panel,
   2663      * null is returned.
   2664      */
   2665     public PendingIntent getRunningServiceControlPanel(ComponentName service)
   2666             throws SecurityException {
   2667         try {
   2668             return getService()
   2669                     .getRunningServiceControlPanel(service);
   2670         } catch (RemoteException e) {
   2671             throw e.rethrowFromSystemServer();
   2672         }
   2673     }
   2674 
   2675     /**
   2676      * Information you can retrieve about the available memory through
   2677      * {@link ActivityManager#getMemoryInfo}.
   2678      */
   2679     public static class MemoryInfo implements Parcelable {
   2680         /**
   2681          * The available memory on the system.  This number should not
   2682          * be considered absolute: due to the nature of the kernel, a significant
   2683          * portion of this memory is actually in use and needed for the overall
   2684          * system to run well.
   2685          */
   2686         public long availMem;
   2687 
   2688         /**
   2689          * The total memory accessible by the kernel.  This is basically the
   2690          * RAM size of the device, not including below-kernel fixed allocations
   2691          * like DMA buffers, RAM for the baseband CPU, etc.
   2692          */
   2693         public long totalMem;
   2694 
   2695         /**
   2696          * The threshold of {@link #availMem} at which we consider memory to be
   2697          * low and start killing background services and other non-extraneous
   2698          * processes.
   2699          */
   2700         public long threshold;
   2701 
   2702         /**
   2703          * Set to true if the system considers itself to currently be in a low
   2704          * memory situation.
   2705          */
   2706         public boolean lowMemory;
   2707 
   2708         /** @hide */
   2709         public long hiddenAppThreshold;
   2710         /** @hide */
   2711         public long secondaryServerThreshold;
   2712         /** @hide */
   2713         public long visibleAppThreshold;
   2714         /** @hide */
   2715         public long foregroundAppThreshold;
   2716 
   2717         public MemoryInfo() {
   2718         }
   2719 
   2720         public int describeContents() {
   2721             return 0;
   2722         }
   2723 
   2724         public void writeToParcel(Parcel dest, int flags) {
   2725             dest.writeLong(availMem);
   2726             dest.writeLong(totalMem);
   2727             dest.writeLong(threshold);
   2728             dest.writeInt(lowMemory ? 1 : 0);
   2729             dest.writeLong(hiddenAppThreshold);
   2730             dest.writeLong(secondaryServerThreshold);
   2731             dest.writeLong(visibleAppThreshold);
   2732             dest.writeLong(foregroundAppThreshold);
   2733         }
   2734 
   2735         public void readFromParcel(Parcel source) {
   2736             availMem = source.readLong();
   2737             totalMem = source.readLong();
   2738             threshold = source.readLong();
   2739             lowMemory = source.readInt() != 0;
   2740             hiddenAppThreshold = source.readLong();
   2741             secondaryServerThreshold = source.readLong();
   2742             visibleAppThreshold = source.readLong();
   2743             foregroundAppThreshold = source.readLong();
   2744         }
   2745 
   2746         public static final Creator<MemoryInfo> CREATOR
   2747                 = new Creator<MemoryInfo>() {
   2748             public MemoryInfo createFromParcel(Parcel source) {
   2749                 return new MemoryInfo(source);
   2750             }
   2751             public MemoryInfo[] newArray(int size) {
   2752                 return new MemoryInfo[size];
   2753             }
   2754         };
   2755 
   2756         private MemoryInfo(Parcel source) {
   2757             readFromParcel(source);
   2758         }
   2759     }
   2760 
   2761     /**
   2762      * Return general information about the memory state of the system.  This
   2763      * can be used to help decide how to manage your own memory, though note
   2764      * that polling is not recommended and
   2765      * {@link android.content.ComponentCallbacks2#onTrimMemory(int)
   2766      * ComponentCallbacks2.onTrimMemory(int)} is the preferred way to do this.
   2767      * Also see {@link #getMyMemoryState} for how to retrieve the current trim
   2768      * level of your process as needed, which gives a better hint for how to
   2769      * manage its memory.
   2770      */
   2771     public void getMemoryInfo(MemoryInfo outInfo) {
   2772         try {
   2773             getService().getMemoryInfo(outInfo);
   2774         } catch (RemoteException e) {
   2775             throw e.rethrowFromSystemServer();
   2776         }
   2777     }
   2778 
   2779     /**
   2780      * Information you can retrieve about an ActivityStack in the system.
   2781      * @hide
   2782      */
   2783     public static class StackInfo implements Parcelable {
   2784         public int stackId;
   2785         public Rect bounds = new Rect();
   2786         public int[] taskIds;
   2787         public String[] taskNames;
   2788         public Rect[] taskBounds;
   2789         public int[] taskUserIds;
   2790         public ComponentName topActivity;
   2791         public int displayId;
   2792         public int userId;
   2793         public boolean visible;
   2794         // Index of the stack in the display's stack list, can be used for comparison of stack order
   2795         public int position;
   2796 
   2797         @Override
   2798         public int describeContents() {
   2799             return 0;
   2800         }
   2801 
   2802         @Override
   2803         public void writeToParcel(Parcel dest, int flags) {
   2804             dest.writeInt(stackId);
   2805             dest.writeInt(bounds.left);
   2806             dest.writeInt(bounds.top);
   2807             dest.writeInt(bounds.right);
   2808             dest.writeInt(bounds.bottom);
   2809             dest.writeIntArray(taskIds);
   2810             dest.writeStringArray(taskNames);
   2811             final int boundsCount = taskBounds == null ? 0 : taskBounds.length;
   2812             dest.writeInt(boundsCount);
   2813             for (int i = 0; i < boundsCount; i++) {
   2814                 dest.writeInt(taskBounds[i].left);
   2815                 dest.writeInt(taskBounds[i].top);
   2816                 dest.writeInt(taskBounds[i].right);
   2817                 dest.writeInt(taskBounds[i].bottom);
   2818             }
   2819             dest.writeIntArray(taskUserIds);
   2820             dest.writeInt(displayId);
   2821             dest.writeInt(userId);
   2822             dest.writeInt(visible ? 1 : 0);
   2823             dest.writeInt(position);
   2824             if (topActivity != null) {
   2825                 dest.writeInt(1);
   2826                 topActivity.writeToParcel(dest, 0);
   2827             } else {
   2828                 dest.writeInt(0);
   2829             }
   2830         }
   2831 
   2832         public void readFromParcel(Parcel source) {
   2833             stackId = source.readInt();
   2834             bounds = new Rect(
   2835                     source.readInt(), source.readInt(), source.readInt(), source.readInt());
   2836             taskIds = source.createIntArray();
   2837             taskNames = source.createStringArray();
   2838             final int boundsCount = source.readInt();
   2839             if (boundsCount > 0) {
   2840                 taskBounds = new Rect[boundsCount];
   2841                 for (int i = 0; i < boundsCount; i++) {
   2842                     taskBounds[i] = new Rect();
   2843                     taskBounds[i].set(
   2844                             source.readInt(), source.readInt(), source.readInt(), source.readInt());
   2845                 }
   2846             } else {
   2847                 taskBounds = null;
   2848             }
   2849             taskUserIds = source.createIntArray();
   2850             displayId = source.readInt();
   2851             userId = source.readInt();
   2852             visible = source.readInt() > 0;
   2853             position = source.readInt();
   2854             if (source.readInt() > 0) {
   2855                 topActivity = ComponentName.readFromParcel(source);
   2856             }
   2857         }
   2858 
   2859         public static final Creator<StackInfo> CREATOR = new Creator<StackInfo>() {
   2860             @Override
   2861             public StackInfo createFromParcel(Parcel source) {
   2862                 return new StackInfo(source);
   2863             }
   2864             @Override
   2865             public StackInfo[] newArray(int size) {
   2866                 return new StackInfo[size];
   2867             }
   2868         };
   2869 
   2870         public StackInfo() {
   2871         }
   2872 
   2873         private StackInfo(Parcel source) {
   2874             readFromParcel(source);
   2875         }
   2876 
   2877         public String toString(String prefix) {
   2878             StringBuilder sb = new StringBuilder(256);
   2879             sb.append(prefix); sb.append("Stack id="); sb.append(stackId);
   2880                     sb.append(" bounds="); sb.append(bounds.toShortString());
   2881                     sb.append(" displayId="); sb.append(displayId);
   2882                     sb.append(" userId="); sb.append(userId);
   2883                     sb.append("\n");
   2884             prefix = prefix + "  ";
   2885             for (int i = 0; i < taskIds.length; ++i) {
   2886                 sb.append(prefix); sb.append("taskId="); sb.append(taskIds[i]);
   2887                         sb.append(": "); sb.append(taskNames[i]);
   2888                         if (taskBounds != null) {
   2889                             sb.append(" bounds="); sb.append(taskBounds[i].toShortString());
   2890                         }
   2891                         sb.append(" userId=").append(taskUserIds[i]);
   2892                         sb.append(" visible=").append(visible);
   2893                         if (topActivity != null) {
   2894                             sb.append(" topActivity=").append(topActivity);
   2895                         }
   2896                         sb.append("\n");
   2897             }
   2898             return sb.toString();
   2899         }
   2900 
   2901         @Override
   2902         public String toString() {
   2903             return toString("");
   2904         }
   2905     }
   2906 
   2907     /**
   2908      * @hide
   2909      */
   2910     @RequiresPermission(anyOf={Manifest.permission.CLEAR_APP_USER_DATA,
   2911             Manifest.permission.ACCESS_INSTANT_APPS})
   2912     public boolean clearApplicationUserData(String packageName, IPackageDataObserver observer) {
   2913         try {
   2914             return getService().clearApplicationUserData(packageName,
   2915                     observer, UserHandle.myUserId());
   2916         } catch (RemoteException e) {
   2917             throw e.rethrowFromSystemServer();
   2918         }
   2919     }
   2920 
   2921     /**
   2922      * Permits an application to erase its own data from disk.  This is equivalent to
   2923      * the user choosing to clear the app's data from within the device settings UI.  It
   2924      * erases all dynamic data associated with the app -- its private data and data in its
   2925      * private area on external storage -- but does not remove the installed application
   2926      * itself, nor any OBB files.
   2927      *
   2928      * @return {@code true} if the application successfully requested that the application's
   2929      *     data be erased; {@code false} otherwise.
   2930      */
   2931     public boolean clearApplicationUserData() {
   2932         return clearApplicationUserData(mContext.getPackageName(), null);
   2933     }
   2934 
   2935 
   2936     /**
   2937      * Permits an application to get the persistent URI permissions granted to another.
   2938      *
   2939      * <p>Typically called by Settings.
   2940      *
   2941      * @param packageName application to look for the granted permissions
   2942      * @return list of granted URI permissions
   2943      *
   2944      * @hide
   2945      */
   2946     public ParceledListSlice<UriPermission> getGrantedUriPermissions(String packageName) {
   2947         try {
   2948             return getService().getGrantedUriPermissions(packageName,
   2949                     UserHandle.myUserId());
   2950         } catch (RemoteException e) {
   2951             throw e.rethrowFromSystemServer();
   2952         }
   2953     }
   2954 
   2955     /**
   2956      * Permits an application to clear the persistent URI permissions granted to another.
   2957      *
   2958      * <p>Typically called by Settings.
   2959      *
   2960      * @param packageName application to clear its granted permissions
   2961      *
   2962      * @hide
   2963      */
   2964     public void clearGrantedUriPermissions(String packageName) {
   2965         try {
   2966             getService().clearGrantedUriPermissions(packageName,
   2967                     UserHandle.myUserId());
   2968         } catch (RemoteException e) {
   2969             throw e.rethrowFromSystemServer();
   2970         }
   2971     }
   2972 
   2973     /**
   2974      * Information you can retrieve about any processes that are in an error condition.
   2975      */
   2976     public static class ProcessErrorStateInfo implements Parcelable {
   2977         /**
   2978          * Condition codes
   2979          */
   2980         public static final int NO_ERROR = 0;
   2981         public static final int CRASHED = 1;
   2982         public static final int NOT_RESPONDING = 2;
   2983 
   2984         /**
   2985          * The condition that the process is in.
   2986          */
   2987         public int condition;
   2988 
   2989         /**
   2990          * The process name in which the crash or error occurred.
   2991          */
   2992         public String processName;
   2993 
   2994         /**
   2995          * The pid of this process; 0 if none
   2996          */
   2997         public int pid;
   2998 
   2999         /**
   3000          * The kernel user-ID that has been assigned to this process;
   3001          * currently this is not a unique ID (multiple applications can have
   3002          * the same uid).
   3003          */
   3004         public int uid;
   3005 
   3006         /**
   3007          * The activity name associated with the error, if known.  May be null.
   3008          */
   3009         public String tag;
   3010 
   3011         /**
   3012          * A short message describing the error condition.
   3013          */
   3014         public String shortMsg;
   3015 
   3016         /**
   3017          * A long message describing the error condition.
   3018          */
   3019         public String longMsg;
   3020 
   3021         /**
   3022          * The stack trace where the error originated.  May be null.
   3023          */
   3024         public String stackTrace;
   3025 
   3026         /**
   3027          * to be deprecated: This value will always be null.
   3028          */
   3029         public byte[] crashData = null;
   3030 
   3031         public ProcessErrorStateInfo() {
   3032         }
   3033 
   3034         @Override
   3035         public int describeContents() {
   3036             return 0;
   3037         }
   3038 
   3039         @Override
   3040         public void writeToParcel(Parcel dest, int flags) {
   3041             dest.writeInt(condition);
   3042             dest.writeString(processName);
   3043             dest.writeInt(pid);
   3044             dest.writeInt(uid);
   3045             dest.writeString(tag);
   3046             dest.writeString(shortMsg);
   3047             dest.writeString(longMsg);
   3048             dest.writeString(stackTrace);
   3049         }
   3050 
   3051         public void readFromParcel(Parcel source) {
   3052             condition = source.readInt();
   3053             processName = source.readString();
   3054             pid = source.readInt();
   3055             uid = source.readInt();
   3056             tag = source.readString();
   3057             shortMsg = source.readString();
   3058             longMsg = source.readString();
   3059             stackTrace = source.readString();
   3060         }
   3061 
   3062         public static final Creator<ProcessErrorStateInfo> CREATOR =
   3063                 new Creator<ProcessErrorStateInfo>() {
   3064             public ProcessErrorStateInfo createFromParcel(Parcel source) {
   3065                 return new ProcessErrorStateInfo(source);
   3066             }
   3067             public ProcessErrorStateInfo[] newArray(int size) {
   3068                 return new ProcessErrorStateInfo[size];
   3069             }
   3070         };
   3071 
   3072         private ProcessErrorStateInfo(Parcel source) {
   3073             readFromParcel(source);
   3074         }
   3075     }
   3076 
   3077     /**
   3078      * Returns a list of any processes that are currently in an error condition.  The result
   3079      * will be null if all processes are running properly at this time.
   3080      *
   3081      * @return Returns a list of ProcessErrorStateInfo records, or null if there are no
   3082      * current error conditions (it will not return an empty list).  This list ordering is not
   3083      * specified.
   3084      */
   3085     public List<ProcessErrorStateInfo> getProcessesInErrorState() {
   3086         try {
   3087             return getService().getProcessesInErrorState();
   3088         } catch (RemoteException e) {
   3089             throw e.rethrowFromSystemServer();
   3090         }
   3091     }
   3092 
   3093     /**
   3094      * Information you can retrieve about a running process.
   3095      */
   3096     public static class RunningAppProcessInfo implements Parcelable {
   3097         /**
   3098          * The name of the process that this object is associated with
   3099          */
   3100         public String processName;
   3101 
   3102         /**
   3103          * The pid of this process; 0 if none
   3104          */
   3105         public int pid;
   3106 
   3107         /**
   3108          * The user id of this process.
   3109          */
   3110         public int uid;
   3111 
   3112         /**
   3113          * All packages that have been loaded into the process.
   3114          */
   3115         public String pkgList[];
   3116 
   3117         /**
   3118          * Constant for {@link #flags}: this is an app that is unable to
   3119          * correctly save its state when going to the background,
   3120          * so it can not be killed while in the background.
   3121          * @hide
   3122          */
   3123         public static final int FLAG_CANT_SAVE_STATE = 1<<0;
   3124 
   3125         /**
   3126          * Constant for {@link #flags}: this process is associated with a
   3127          * persistent system app.
   3128          * @hide
   3129          */
   3130         public static final int FLAG_PERSISTENT = 1<<1;
   3131 
   3132         /**
   3133          * Constant for {@link #flags}: this process is associated with a
   3134          * persistent system app.
   3135          * @hide
   3136          */
   3137         public static final int FLAG_HAS_ACTIVITIES = 1<<2;
   3138 
   3139         /**
   3140          * Flags of information.  May be any of
   3141          * {@link #FLAG_CANT_SAVE_STATE}.
   3142          * @hide
   3143          */
   3144         public int flags;
   3145 
   3146         /**
   3147          * Last memory trim level reported to the process: corresponds to
   3148          * the values supplied to {@link android.content.ComponentCallbacks2#onTrimMemory(int)
   3149          * ComponentCallbacks2.onTrimMemory(int)}.
   3150          */
   3151         public int lastTrimLevel;
   3152 
   3153         /** @hide */
   3154         @IntDef(prefix = { "IMPORTANCE_" }, value = {
   3155                 IMPORTANCE_FOREGROUND,
   3156                 IMPORTANCE_FOREGROUND_SERVICE,
   3157                 IMPORTANCE_TOP_SLEEPING,
   3158                 IMPORTANCE_VISIBLE,
   3159                 IMPORTANCE_PERCEPTIBLE,
   3160                 IMPORTANCE_CANT_SAVE_STATE,
   3161                 IMPORTANCE_SERVICE,
   3162                 IMPORTANCE_CACHED,
   3163                 IMPORTANCE_GONE,
   3164         })
   3165         @Retention(RetentionPolicy.SOURCE)
   3166         public @interface Importance {}
   3167 
   3168         /**
   3169          * Constant for {@link #importance}: This process is running the
   3170          * foreground UI; that is, it is the thing currently at the top of the screen
   3171          * that the user is interacting with.
   3172          */
   3173         public static final int IMPORTANCE_FOREGROUND = 100;
   3174 
   3175         /**
   3176          * Constant for {@link #importance}: This process is running a foreground
   3177          * service, for example to perform music playback even while the user is
   3178          * not immediately in the app.  This generally indicates that the process
   3179          * is doing something the user actively cares about.
   3180          */
   3181         public static final int IMPORTANCE_FOREGROUND_SERVICE = 125;
   3182 
   3183         /**
   3184          * Constant for {@link #importance}: This process is running the foreground
   3185          * UI, but the device is asleep so it is not visible to the user.  This means
   3186          * the user is not really aware of the process, because they can not see or
   3187          * interact with it, but it is quite important because it what they expect to
   3188          * return to once unlocking the device.
   3189          */
   3190         public static final int IMPORTANCE_TOP_SLEEPING = 150;
   3191 
   3192         /**
   3193          * Constant for {@link #importance}: This process is running something
   3194          * that is actively visible to the user, though not in the immediate
   3195          * foreground.  This may be running a window that is behind the current
   3196          * foreground (so paused and with its state saved, not interacting with
   3197          * the user, but visible to them to some degree); it may also be running
   3198          * other services under the system's control that it inconsiders important.
   3199          */
   3200         public static final int IMPORTANCE_VISIBLE = 200;
   3201 
   3202         /**
   3203          * Constant for {@link #importance}: {@link #IMPORTANCE_PERCEPTIBLE} had this wrong value
   3204          * before {@link Build.VERSION_CODES#O}.  Since the {@link Build.VERSION_CODES#O} SDK,
   3205          * the value of {@link #IMPORTANCE_PERCEPTIBLE} has been fixed.
   3206          *
   3207          * <p>The system will return this value instead of {@link #IMPORTANCE_PERCEPTIBLE}
   3208          * on Android versions below {@link Build.VERSION_CODES#O}.
   3209          *
   3210          * <p>On Android version {@link Build.VERSION_CODES#O} and later, this value will still be
   3211          * returned for apps with the target API level below {@link Build.VERSION_CODES#O}.
   3212          * For apps targeting version {@link Build.VERSION_CODES#O} and later,
   3213          * the correct value {@link #IMPORTANCE_PERCEPTIBLE} will be returned.
   3214          */
   3215         public static final int IMPORTANCE_PERCEPTIBLE_PRE_26 = 130;
   3216 
   3217         /**
   3218          * Constant for {@link #importance}: This process is not something the user
   3219          * is directly aware of, but is otherwise perceptible to them to some degree.
   3220          */
   3221         public static final int IMPORTANCE_PERCEPTIBLE = 230;
   3222 
   3223         /**
   3224          * Constant for {@link #importance}: {@link #IMPORTANCE_CANT_SAVE_STATE} had
   3225          * this wrong value
   3226          * before {@link Build.VERSION_CODES#O}.  Since the {@link Build.VERSION_CODES#O} SDK,
   3227          * the value of {@link #IMPORTANCE_CANT_SAVE_STATE} has been fixed.
   3228          *
   3229          * <p>The system will return this value instead of {@link #IMPORTANCE_CANT_SAVE_STATE}
   3230          * on Android versions below {@link Build.VERSION_CODES#O}.
   3231          *
   3232          * <p>On Android version {@link Build.VERSION_CODES#O} after, this value will still be
   3233          * returned for apps with the target API level below {@link Build.VERSION_CODES#O}.
   3234          * For apps targeting version {@link Build.VERSION_CODES#O} and later,
   3235          * the correct value {@link #IMPORTANCE_CANT_SAVE_STATE} will be returned.
   3236          *
   3237          * @hide
   3238          */
   3239         public static final int IMPORTANCE_CANT_SAVE_STATE_PRE_26 = 170;
   3240 
   3241         /**
   3242          * Constant for {@link #importance}: This process is running an
   3243          * application that can not save its state, and thus can't be killed
   3244          * while in the background.
   3245          * @hide
   3246          */
   3247         public static final int IMPORTANCE_CANT_SAVE_STATE= 270;
   3248 
   3249         /**
   3250          * Constant for {@link #importance}: This process is contains services
   3251          * that should remain running.  These are background services apps have
   3252          * started, not something the user is aware of, so they may be killed by
   3253          * the system relatively freely (though it is generally desired that they
   3254          * stay running as long as they want to).
   3255          */
   3256         public static final int IMPORTANCE_SERVICE = 300;
   3257 
   3258         /**
   3259          * Constant for {@link #importance}: This process process contains
   3260          * cached code that is expendable, not actively running any app components
   3261          * we care about.
   3262          */
   3263         public static final int IMPORTANCE_CACHED = 400;
   3264 
   3265         /**
   3266          * @deprecated Renamed to {@link #IMPORTANCE_CACHED}.
   3267          */
   3268         public static final int IMPORTANCE_BACKGROUND = IMPORTANCE_CACHED;
   3269 
   3270         /**
   3271          * Constant for {@link #importance}: This process is empty of any
   3272          * actively running code.
   3273          * @deprecated This value is no longer reported, use {@link #IMPORTANCE_CACHED} instead.
   3274          */
   3275         @Deprecated
   3276         public static final int IMPORTANCE_EMPTY = 500;
   3277 
   3278         /**
   3279          * Constant for {@link #importance}: This process does not exist.
   3280          */
   3281         public static final int IMPORTANCE_GONE = 1000;
   3282 
   3283         /**
   3284          * Convert a proc state to the correspondent IMPORTANCE_* constant.  If the return value
   3285          * will be passed to a client, use {@link #procStateToImportanceForClient}.
   3286          * @hide
   3287          */
   3288         public static @Importance int procStateToImportance(int procState) {
   3289             if (procState == PROCESS_STATE_NONEXISTENT) {
   3290                 return IMPORTANCE_GONE;
   3291             } else if (procState >= PROCESS_STATE_HOME) {
   3292                 return IMPORTANCE_CACHED;
   3293             } else if (procState >= PROCESS_STATE_SERVICE) {
   3294                 return IMPORTANCE_SERVICE;
   3295             } else if (procState > PROCESS_STATE_HEAVY_WEIGHT) {
   3296                 return IMPORTANCE_CANT_SAVE_STATE;
   3297             } else if (procState >= PROCESS_STATE_TRANSIENT_BACKGROUND) {
   3298                 return IMPORTANCE_PERCEPTIBLE;
   3299             } else if (procState >= PROCESS_STATE_IMPORTANT_FOREGROUND) {
   3300                 return IMPORTANCE_VISIBLE;
   3301             } else if (procState >= PROCESS_STATE_TOP_SLEEPING) {
   3302                 return IMPORTANCE_TOP_SLEEPING;
   3303             } else if (procState >= PROCESS_STATE_FOREGROUND_SERVICE) {
   3304                 return IMPORTANCE_FOREGROUND_SERVICE;
   3305             } else {
   3306                 return IMPORTANCE_FOREGROUND;
   3307             }
   3308         }
   3309 
   3310         /**
   3311          * Convert a proc state to the correspondent IMPORTANCE_* constant for a client represented
   3312          * by a given {@link Context}, with converting {@link #IMPORTANCE_PERCEPTIBLE}
   3313          * and {@link #IMPORTANCE_CANT_SAVE_STATE} to the corresponding "wrong" value if the
   3314          * client's target SDK < {@link VERSION_CODES#O}.
   3315          * @hide
   3316          */
   3317         public static @Importance int procStateToImportanceForClient(int procState,
   3318                 Context clientContext) {
   3319             return procStateToImportanceForTargetSdk(procState,
   3320                     clientContext.getApplicationInfo().targetSdkVersion);
   3321         }
   3322 
   3323         /**
   3324          * See {@link #procStateToImportanceForClient}.
   3325          * @hide
   3326          */
   3327         public static @Importance int procStateToImportanceForTargetSdk(int procState,
   3328                 int targetSdkVersion) {
   3329             final int importance = procStateToImportance(procState);
   3330 
   3331             // For pre O apps, convert to the old, wrong values.
   3332             if (targetSdkVersion < VERSION_CODES.O) {
   3333                 switch (importance) {
   3334                     case IMPORTANCE_PERCEPTIBLE:
   3335                         return IMPORTANCE_PERCEPTIBLE_PRE_26;
   3336                     case IMPORTANCE_CANT_SAVE_STATE:
   3337                         return IMPORTANCE_CANT_SAVE_STATE_PRE_26;
   3338                 }
   3339             }
   3340             return importance;
   3341         }
   3342 
   3343         /** @hide */
   3344         public static int importanceToProcState(@Importance int importance) {
   3345             if (importance == IMPORTANCE_GONE) {
   3346                 return PROCESS_STATE_NONEXISTENT;
   3347             } else if (importance >= IMPORTANCE_CACHED) {
   3348                 return PROCESS_STATE_HOME;
   3349             } else if (importance >= IMPORTANCE_SERVICE) {
   3350                 return PROCESS_STATE_SERVICE;
   3351             } else if (importance > IMPORTANCE_CANT_SAVE_STATE) {
   3352                 return PROCESS_STATE_HEAVY_WEIGHT;
   3353             } else if (importance >= IMPORTANCE_PERCEPTIBLE) {
   3354                 return PROCESS_STATE_TRANSIENT_BACKGROUND;
   3355             } else if (importance >= IMPORTANCE_VISIBLE) {
   3356                 return PROCESS_STATE_IMPORTANT_FOREGROUND;
   3357             } else if (importance >= IMPORTANCE_TOP_SLEEPING) {
   3358                 return PROCESS_STATE_TOP_SLEEPING;
   3359             } else if (importance >= IMPORTANCE_FOREGROUND_SERVICE) {
   3360                 return PROCESS_STATE_FOREGROUND_SERVICE;
   3361             } else {
   3362                 return PROCESS_STATE_BOUND_FOREGROUND_SERVICE;
   3363             }
   3364         }
   3365 
   3366         /**
   3367          * The relative importance level that the system places on this process.
   3368          * These constants are numbered so that "more important" values are
   3369          * always smaller than "less important" values.
   3370          */
   3371         public @Importance int importance;
   3372 
   3373         /**
   3374          * An additional ordering within a particular {@link #importance}
   3375          * category, providing finer-grained information about the relative
   3376          * utility of processes within a category.  This number means nothing
   3377          * except that a smaller values are more recently used (and thus
   3378          * more important).  Currently an LRU value is only maintained for
   3379          * the {@link #IMPORTANCE_CACHED} category, though others may
   3380          * be maintained in the future.
   3381          */
   3382         public int lru;
   3383 
   3384         /**
   3385          * Constant for {@link #importanceReasonCode}: nothing special has
   3386          * been specified for the reason for this level.
   3387          */
   3388         public static final int REASON_UNKNOWN = 0;
   3389 
   3390         /**
   3391          * Constant for {@link #importanceReasonCode}: one of the application's
   3392          * content providers is being used by another process.  The pid of
   3393          * the client process is in {@link #importanceReasonPid} and the
   3394          * target provider in this process is in
   3395          * {@link #importanceReasonComponent}.
   3396          */
   3397         public static final int REASON_PROVIDER_IN_USE = 1;
   3398 
   3399         /**
   3400          * Constant for {@link #importanceReasonCode}: one of the application's
   3401          * content providers is being used by another process.  The pid of
   3402          * the client process is in {@link #importanceReasonPid} and the
   3403          * target provider in this process is in
   3404          * {@link #importanceReasonComponent}.
   3405          */
   3406         public static final int REASON_SERVICE_IN_USE = 2;
   3407 
   3408         /**
   3409          * The reason for {@link #importance}, if any.
   3410          */
   3411         public int importanceReasonCode;
   3412 
   3413         /**
   3414          * For the specified values of {@link #importanceReasonCode}, this
   3415          * is the process ID of the other process that is a client of this
   3416          * process.  This will be 0 if no other process is using this one.
   3417          */
   3418         public int importanceReasonPid;
   3419 
   3420         /**
   3421          * For the specified values of {@link #importanceReasonCode}, this
   3422          * is the name of the component that is being used in this process.
   3423          */
   3424         public ComponentName importanceReasonComponent;
   3425 
   3426         /**
   3427          * When {@link #importanceReasonPid} is non-0, this is the importance
   3428          * of the other pid. @hide
   3429          */
   3430         public int importanceReasonImportance;
   3431 
   3432         /**
   3433          * Current process state, as per PROCESS_STATE_* constants.
   3434          * @hide
   3435          */
   3436         public int processState;
   3437 
   3438         public RunningAppProcessInfo() {
   3439             importance = IMPORTANCE_FOREGROUND;
   3440             importanceReasonCode = REASON_UNKNOWN;
   3441             processState = PROCESS_STATE_IMPORTANT_FOREGROUND;
   3442         }
   3443 
   3444         public RunningAppProcessInfo(String pProcessName, int pPid, String pArr[]) {
   3445             processName = pProcessName;
   3446             pid = pPid;
   3447             pkgList = pArr;
   3448         }
   3449 
   3450         public int describeContents() {
   3451             return 0;
   3452         }
   3453 
   3454         public void writeToParcel(Parcel dest, int flags) {
   3455             dest.writeString(processName);
   3456             dest.writeInt(pid);
   3457             dest.writeInt(uid);
   3458             dest.writeStringArray(pkgList);
   3459             dest.writeInt(this.flags);
   3460             dest.writeInt(lastTrimLevel);
   3461             dest.writeInt(importance);
   3462             dest.writeInt(lru);
   3463             dest.writeInt(importanceReasonCode);
   3464             dest.writeInt(importanceReasonPid);
   3465             ComponentName.writeToParcel(importanceReasonComponent, dest);
   3466             dest.writeInt(importanceReasonImportance);
   3467             dest.writeInt(processState);
   3468         }
   3469 
   3470         public void readFromParcel(Parcel source) {
   3471             processName = source.readString();
   3472             pid = source.readInt();
   3473             uid = source.readInt();
   3474             pkgList = source.readStringArray();
   3475             flags = source.readInt();
   3476             lastTrimLevel = source.readInt();
   3477             importance = source.readInt();
   3478             lru = source.readInt();
   3479             importanceReasonCode = source.readInt();
   3480             importanceReasonPid = source.readInt();
   3481             importanceReasonComponent = ComponentName.readFromParcel(source);
   3482             importanceReasonImportance = source.readInt();
   3483             processState = source.readInt();
   3484         }
   3485 
   3486         public static final Creator<RunningAppProcessInfo> CREATOR =
   3487             new Creator<RunningAppProcessInfo>() {
   3488             public RunningAppProcessInfo createFromParcel(Parcel source) {
   3489                 return new RunningAppProcessInfo(source);
   3490             }
   3491             public RunningAppProcessInfo[] newArray(int size) {
   3492                 return new RunningAppProcessInfo[size];
   3493             }
   3494         };
   3495 
   3496         private RunningAppProcessInfo(Parcel source) {
   3497             readFromParcel(source);
   3498         }
   3499     }
   3500 
   3501     /**
   3502      * Returns a list of application processes installed on external media
   3503      * that are running on the device.
   3504      *
   3505      * <p><b>Note: this method is only intended for debugging or building
   3506      * a user-facing process management UI.</b></p>
   3507      *
   3508      * @return Returns a list of ApplicationInfo records, or null if none
   3509      * This list ordering is not specified.
   3510      * @hide
   3511      */
   3512     public List<ApplicationInfo> getRunningExternalApplications() {
   3513         try {
   3514             return getService().getRunningExternalApplications();
   3515         } catch (RemoteException e) {
   3516             throw e.rethrowFromSystemServer();
   3517         }
   3518     }
   3519 
   3520     /**
   3521      * Sets the memory trim mode for a process and schedules a memory trim operation.
   3522      *
   3523      * <p><b>Note: this method is only intended for testing framework.</b></p>
   3524      *
   3525      * @return Returns true if successful.
   3526      * @hide
   3527      */
   3528     public boolean setProcessMemoryTrimLevel(String process, int userId, int level) {
   3529         try {
   3530             return getService().setProcessMemoryTrimLevel(process, userId,
   3531                     level);
   3532         } catch (RemoteException e) {
   3533             throw e.rethrowFromSystemServer();
   3534         }
   3535     }
   3536 
   3537     /**
   3538      * Returns a list of application processes that are running on the device.
   3539      *
   3540      * <p><b>Note: this method is only intended for debugging or building
   3541      * a user-facing process management UI.</b></p>
   3542      *
   3543      * @return Returns a list of RunningAppProcessInfo records, or null if there are no
   3544      * running processes (it will not return an empty list).  This list ordering is not
   3545      * specified.
   3546      */
   3547     public List<RunningAppProcessInfo> getRunningAppProcesses() {
   3548         try {
   3549             return getService().getRunningAppProcesses();
   3550         } catch (RemoteException e) {
   3551             throw e.rethrowFromSystemServer();
   3552         }
   3553     }
   3554 
   3555     /**
   3556      * Return the importance of a given package name, based on the processes that are
   3557      * currently running.  The return value is one of the importance constants defined
   3558      * in {@link RunningAppProcessInfo}, giving you the highest importance of all the
   3559      * processes that this package has code running inside of.  If there are no processes
   3560      * running its code, {@link RunningAppProcessInfo#IMPORTANCE_GONE} is returned.
   3561      * @hide
   3562      */
   3563     @SystemApi @TestApi
   3564     @RequiresPermission(Manifest.permission.PACKAGE_USAGE_STATS)
   3565     public @RunningAppProcessInfo.Importance int getPackageImportance(String packageName) {
   3566         try {
   3567             int procState = getService().getPackageProcessState(packageName,
   3568                     mContext.getOpPackageName());
   3569             return RunningAppProcessInfo.procStateToImportanceForClient(procState, mContext);
   3570         } catch (RemoteException e) {
   3571             throw e.rethrowFromSystemServer();
   3572         }
   3573     }
   3574 
   3575     /**
   3576      * Return the importance of a given uid, based on the processes that are
   3577      * currently running.  The return value is one of the importance constants defined
   3578      * in {@link RunningAppProcessInfo}, giving you the highest importance of all the
   3579      * processes that this uid has running.  If there are no processes
   3580      * running its code, {@link RunningAppProcessInfo#IMPORTANCE_GONE} is returned.
   3581      * @hide
   3582      */
   3583     @SystemApi @TestApi
   3584     @RequiresPermission(Manifest.permission.PACKAGE_USAGE_STATS)
   3585     public @RunningAppProcessInfo.Importance int getUidImportance(int uid) {
   3586         try {
   3587             int procState = getService().getUidProcessState(uid,
   3588                     mContext.getOpPackageName());
   3589             return RunningAppProcessInfo.procStateToImportanceForClient(procState, mContext);
   3590         } catch (RemoteException e) {
   3591             throw e.rethrowFromSystemServer();
   3592         }
   3593     }
   3594 
   3595     /**
   3596      * Callback to get reports about changes to the importance of a uid.  Use with
   3597      * {@link #addOnUidImportanceListener}.
   3598      * @hide
   3599      */
   3600     @SystemApi @TestApi
   3601     public interface OnUidImportanceListener {
   3602         /**
   3603          * The importance if a given uid has changed.  Will be one of the importance
   3604          * values in {@link RunningAppProcessInfo};
   3605          * {@link RunningAppProcessInfo#IMPORTANCE_GONE IMPORTANCE_GONE} will be reported
   3606          * when the uid is no longer running at all.  This callback will happen on a thread
   3607          * from a thread pool, not the main UI thread.
   3608          * @param uid The uid whose importance has changed.
   3609          * @param importance The new importance value as per {@link RunningAppProcessInfo}.
   3610          */
   3611         void onUidImportance(int uid, @RunningAppProcessInfo.Importance int importance);
   3612     }
   3613 
   3614     /**
   3615      * Start monitoring changes to the imoportance of uids running in the system.
   3616      * @param listener The listener callback that will receive change reports.
   3617      * @param importanceCutpoint The level of importance in which the caller is interested
   3618      * in differences.  For example, if {@link RunningAppProcessInfo#IMPORTANCE_PERCEPTIBLE}
   3619      * is used here, you will receive a call each time a uids importance transitions between
   3620      * being <= {@link RunningAppProcessInfo#IMPORTANCE_PERCEPTIBLE} and
   3621      * > {@link RunningAppProcessInfo#IMPORTANCE_PERCEPTIBLE}.
   3622      *
   3623      * <p>The caller must hold the {@link android.Manifest.permission#PACKAGE_USAGE_STATS}
   3624      * permission to use this feature.</p>
   3625      *
   3626      * @throws IllegalArgumentException If the listener is already registered.
   3627      * @throws SecurityException If the caller does not hold
   3628      * {@link android.Manifest.permission#PACKAGE_USAGE_STATS}.
   3629      * @hide
   3630      */
   3631     @SystemApi @TestApi
   3632     @RequiresPermission(Manifest.permission.PACKAGE_USAGE_STATS)
   3633     public void addOnUidImportanceListener(OnUidImportanceListener listener,
   3634             @RunningAppProcessInfo.Importance int importanceCutpoint) {
   3635         synchronized (this) {
   3636             if (mImportanceListeners.containsKey(listener)) {
   3637                 throw new IllegalArgumentException("Listener already registered: " + listener);
   3638             }
   3639             // TODO: implement the cut point in the system process to avoid IPCs.
   3640             UidObserver observer = new UidObserver(listener, mContext);
   3641             try {
   3642                 getService().registerUidObserver(observer,
   3643                         UID_OBSERVER_PROCSTATE | UID_OBSERVER_GONE,
   3644                         RunningAppProcessInfo.importanceToProcState(importanceCutpoint),
   3645                         mContext.getOpPackageName());
   3646             } catch (RemoteException e) {
   3647                 throw e.rethrowFromSystemServer();
   3648             }
   3649             mImportanceListeners.put(listener, observer);
   3650         }
   3651     }
   3652 
   3653     /**
   3654      * Remove an importance listener that was previously registered with
   3655      * {@link #addOnUidImportanceListener}.
   3656      *
   3657      * @throws IllegalArgumentException If the listener is not registered.
   3658      * @hide
   3659      */
   3660     @SystemApi @TestApi
   3661     @RequiresPermission(Manifest.permission.PACKAGE_USAGE_STATS)
   3662     public void removeOnUidImportanceListener(OnUidImportanceListener listener) {
   3663         synchronized (this) {
   3664             UidObserver observer = mImportanceListeners.remove(listener);
   3665             if (observer == null) {
   3666                 throw new IllegalArgumentException("Listener not registered: " + listener);
   3667             }
   3668             try {
   3669                 getService().unregisterUidObserver(observer);
   3670             } catch (RemoteException e) {
   3671                 throw e.rethrowFromSystemServer();
   3672             }
   3673         }
   3674     }
   3675 
   3676     /**
   3677      * Return global memory state information for the calling process.  This
   3678      * does not fill in all fields of the {@link RunningAppProcessInfo}.  The
   3679      * only fields that will be filled in are
   3680      * {@link RunningAppProcessInfo#pid},
   3681      * {@link RunningAppProcessInfo#uid},
   3682      * {@link RunningAppProcessInfo#lastTrimLevel},
   3683      * {@link RunningAppProcessInfo#importance},
   3684      * {@link RunningAppProcessInfo#lru}, and
   3685      * {@link RunningAppProcessInfo#importanceReasonCode}.
   3686      */
   3687     static public void getMyMemoryState(RunningAppProcessInfo outState) {
   3688         try {
   3689             getService().getMyMemoryState(outState);
   3690         } catch (RemoteException e) {
   3691             throw e.rethrowFromSystemServer();
   3692         }
   3693     }
   3694 
   3695     /**
   3696      * Return information about the memory usage of one or more processes.
   3697      *
   3698      * <p><b>Note: this method is only intended for debugging or building
   3699      * a user-facing process management UI.</b></p>
   3700      *
   3701      * @param pids The pids of the processes whose memory usage is to be
   3702      * retrieved.
   3703      * @return Returns an array of memory information, one for each
   3704      * requested pid.
   3705      */
   3706     public Debug.MemoryInfo[] getProcessMemoryInfo(int[] pids) {
   3707         try {
   3708             return getService().getProcessMemoryInfo(pids);
   3709         } catch (RemoteException e) {
   3710             throw e.rethrowFromSystemServer();
   3711         }
   3712     }
   3713 
   3714     /**
   3715      * @deprecated This is now just a wrapper for
   3716      * {@link #killBackgroundProcesses(String)}; the previous behavior here
   3717      * is no longer available to applications because it allows them to
   3718      * break other applications by removing their alarms, stopping their
   3719      * services, etc.
   3720      */
   3721     @Deprecated
   3722     public void restartPackage(String packageName) {
   3723         killBackgroundProcesses(packageName);
   3724     }
   3725 
   3726     /**
   3727      * Have the system immediately kill all background processes associated
   3728      * with the given package.  This is the same as the kernel killing those
   3729      * processes to reclaim memory; the system will take care of restarting
   3730      * these processes in the future as needed.
   3731      *
   3732      * @param packageName The name of the package whose processes are to
   3733      * be killed.
   3734      */
   3735     @RequiresPermission(Manifest.permission.KILL_BACKGROUND_PROCESSES)
   3736     public void killBackgroundProcesses(String packageName) {
   3737         try {
   3738             getService().killBackgroundProcesses(packageName,
   3739                     UserHandle.myUserId());
   3740         } catch (RemoteException e) {
   3741             throw e.rethrowFromSystemServer();
   3742         }
   3743     }
   3744 
   3745     /**
   3746      * Kills the specified UID.
   3747      * @param uid The UID to kill.
   3748      * @param reason The reason for the kill.
   3749      *
   3750      * @hide
   3751      */
   3752     @SystemApi
   3753     @RequiresPermission(Manifest.permission.KILL_UID)
   3754     public void killUid(int uid, String reason) {
   3755         try {
   3756             getService().killUid(UserHandle.getAppId(uid),
   3757                     UserHandle.getUserId(uid), reason);
   3758         } catch (RemoteException e) {
   3759             throw e.rethrowFromSystemServer();
   3760         }
   3761     }
   3762 
   3763     /**
   3764      * Have the system perform a force stop of everything associated with
   3765      * the given application package.  All processes that share its uid
   3766      * will be killed, all services it has running stopped, all activities
   3767      * removed, etc.  In addition, a {@link Intent#ACTION_PACKAGE_RESTARTED}
   3768      * broadcast will be sent, so that any of its registered alarms can
   3769      * be stopped, notifications removed, etc.
   3770      *
   3771      * <p>You must hold the permission
   3772      * {@link android.Manifest.permission#FORCE_STOP_PACKAGES} to be able to
   3773      * call this method.
   3774      *
   3775      * @param packageName The name of the package to be stopped.
   3776      * @param userId The user for which the running package is to be stopped.
   3777      *
   3778      * @hide This is not available to third party applications due to
   3779      * it allowing them to break other applications by stopping their
   3780      * services, removing their alarms, etc.
   3781      */
   3782     public void forceStopPackageAsUser(String packageName, int userId) {
   3783         try {
   3784             getService().forceStopPackage(packageName, userId);
   3785         } catch (RemoteException e) {
   3786             throw e.rethrowFromSystemServer();
   3787         }
   3788     }
   3789 
   3790     /**
   3791      * @see #forceStopPackageAsUser(String, int)
   3792      * @hide
   3793      */
   3794     @SystemApi
   3795     @RequiresPermission(Manifest.permission.FORCE_STOP_PACKAGES)
   3796     public void forceStopPackage(String packageName) {
   3797         forceStopPackageAsUser(packageName, UserHandle.myUserId());
   3798     }
   3799 
   3800     /**
   3801      * Get the device configuration attributes.
   3802      */
   3803     public ConfigurationInfo getDeviceConfigurationInfo() {
   3804         try {
   3805             return getService().getDeviceConfigurationInfo();
   3806         } catch (RemoteException e) {
   3807             throw e.rethrowFromSystemServer();
   3808         }
   3809     }
   3810 
   3811     /**
   3812      * Get the preferred density of icons for the launcher. This is used when
   3813      * custom drawables are created (e.g., for shortcuts).
   3814      *
   3815      * @return density in terms of DPI
   3816      */
   3817     public int getLauncherLargeIconDensity() {
   3818         final Resources res = mContext.getResources();
   3819         final int density = res.getDisplayMetrics().densityDpi;
   3820         final int sw = res.getConfiguration().smallestScreenWidthDp;
   3821 
   3822         if (sw < 600) {
   3823             // Smaller than approx 7" tablets, use the regular icon size.
   3824             return density;
   3825         }
   3826 
   3827         switch (density) {
   3828             case DisplayMetrics.DENSITY_LOW:
   3829                 return DisplayMetrics.DENSITY_MEDIUM;
   3830             case DisplayMetrics.DENSITY_MEDIUM:
   3831                 return DisplayMetrics.DENSITY_HIGH;
   3832             case DisplayMetrics.DENSITY_TV:
   3833                 return DisplayMetrics.DENSITY_XHIGH;
   3834             case DisplayMetrics.DENSITY_HIGH:
   3835                 return DisplayMetrics.DENSITY_XHIGH;
   3836             case DisplayMetrics.DENSITY_XHIGH:
   3837                 return DisplayMetrics.DENSITY_XXHIGH;
   3838             case DisplayMetrics.DENSITY_XXHIGH:
   3839                 return DisplayMetrics.DENSITY_XHIGH * 2;
   3840             default:
   3841                 // The density is some abnormal value.  Return some other
   3842                 // abnormal value that is a reasonable scaling of it.
   3843                 return (int)((density*1.5f)+.5f);
   3844         }
   3845     }
   3846 
   3847     /**
   3848      * Get the preferred launcher icon size. This is used when custom drawables
   3849      * are created (e.g., for shortcuts).
   3850      *
   3851      * @return dimensions of square icons in terms of pixels
   3852      */
   3853     public int getLauncherLargeIconSize() {
   3854         return getLauncherLargeIconSizeInner(mContext);
   3855     }
   3856 
   3857     static int getLauncherLargeIconSizeInner(Context context) {
   3858         final Resources res = context.getResources();
   3859         final int size = res.getDimensionPixelSize(android.R.dimen.app_icon_size);
   3860         final int sw = res.getConfiguration().smallestScreenWidthDp;
   3861 
   3862         if (sw < 600) {
   3863             // Smaller than approx 7" tablets, use the regular icon size.
   3864             return size;
   3865         }
   3866 
   3867         final int density = res.getDisplayMetrics().densityDpi;
   3868 
   3869         switch (density) {
   3870             case DisplayMetrics.DENSITY_LOW:
   3871                 return (size * DisplayMetrics.DENSITY_MEDIUM) / DisplayMetrics.DENSITY_LOW;
   3872             case DisplayMetrics.DENSITY_MEDIUM:
   3873                 return (size * DisplayMetrics.DENSITY_HIGH) / DisplayMetrics.DENSITY_MEDIUM;
   3874             case DisplayMetrics.DENSITY_TV:
   3875                 return (size * DisplayMetrics.DENSITY_XHIGH) / DisplayMetrics.DENSITY_HIGH;
   3876             case DisplayMetrics.DENSITY_HIGH:
   3877                 return (size * DisplayMetrics.DENSITY_XHIGH) / DisplayMetrics.DENSITY_HIGH;
   3878             case DisplayMetrics.DENSITY_XHIGH:
   3879                 return (size * DisplayMetrics.DENSITY_XXHIGH) / DisplayMetrics.DENSITY_XHIGH;
   3880             case DisplayMetrics.DENSITY_XXHIGH:
   3881                 return (size * DisplayMetrics.DENSITY_XHIGH*2) / DisplayMetrics.DENSITY_XXHIGH;
   3882             default:
   3883                 // The density is some abnormal value.  Return some other
   3884                 // abnormal value that is a reasonable scaling of it.
   3885                 return (int)((size*1.5f) + .5f);
   3886         }
   3887     }
   3888 
   3889     /**
   3890      * Returns "true" if the user interface is currently being messed with
   3891      * by a monkey.
   3892      */
   3893     public static boolean isUserAMonkey() {
   3894         try {
   3895             return getService().isUserAMonkey();
   3896         } catch (RemoteException e) {
   3897             throw e.rethrowFromSystemServer();
   3898         }
   3899     }
   3900 
   3901     /**
   3902      * Returns "true" if device is running in a test harness.
   3903      */
   3904     public static boolean isRunningInTestHarness() {
   3905         return SystemProperties.getBoolean("ro.test_harness", false);
   3906     }
   3907 
   3908     /**
   3909      * Returns the launch count of each installed package.
   3910      *
   3911      * @hide
   3912      */
   3913     /*public Map<String, Integer> getAllPackageLaunchCounts() {
   3914         try {
   3915             IUsageStats usageStatsService = IUsageStats.Stub.asInterface(
   3916                     ServiceManager.getService("usagestats"));
   3917             if (usageStatsService == null) {
   3918                 return new HashMap<String, Integer>();
   3919             }
   3920 
   3921             UsageStats.PackageStats[] allPkgUsageStats = usageStatsService.getAllPkgUsageStats(
   3922                     ActivityThread.currentPackageName());
   3923             if (allPkgUsageStats == null) {
   3924                 return new HashMap<String, Integer>();
   3925             }
   3926 
   3927             Map<String, Integer> launchCounts = new HashMap<String, Integer>();
   3928             for (UsageStats.PackageStats pkgUsageStats : allPkgUsageStats) {
   3929                 launchCounts.put(pkgUsageStats.getPackageName(), pkgUsageStats.getLaunchCount());
   3930             }
   3931 
   3932             return launchCounts;
   3933         } catch (RemoteException e) {
   3934             Log.w(TAG, "Could not query launch counts", e);
   3935             return new HashMap<String, Integer>();
   3936         }
   3937     }*/
   3938 
   3939     /** @hide */
   3940     public static int checkComponentPermission(String permission, int uid,
   3941             int owningUid, boolean exported) {
   3942         // Root, system server get to do everything.
   3943         final int appId = UserHandle.getAppId(uid);
   3944         if (appId == Process.ROOT_UID || appId == Process.SYSTEM_UID) {
   3945             return PackageManager.PERMISSION_GRANTED;
   3946         }
   3947         // Isolated processes don't get any permissions.
   3948         if (UserHandle.isIsolated(uid)) {
   3949             return PackageManager.PERMISSION_DENIED;
   3950         }
   3951         // If there is a uid that owns whatever is being accessed, it has
   3952         // blanket access to it regardless of the permissions it requires.
   3953         if (owningUid >= 0 && UserHandle.isSameApp(uid, owningUid)) {
   3954             return PackageManager.PERMISSION_GRANTED;
   3955         }
   3956         // If the target is not exported, then nobody else can get to it.
   3957         if (!exported) {
   3958             /*
   3959             RuntimeException here = new RuntimeException("here");
   3960             here.fillInStackTrace();
   3961             Slog.w(TAG, "Permission denied: checkComponentPermission() owningUid=" + owningUid,
   3962                     here);
   3963             */
   3964             return PackageManager.PERMISSION_DENIED;
   3965         }
   3966         if (permission == null) {
   3967             return PackageManager.PERMISSION_GRANTED;
   3968         }
   3969         try {
   3970             return AppGlobals.getPackageManager()
   3971                     .checkUidPermission(permission, uid);
   3972         } catch (RemoteException e) {
   3973             throw e.rethrowFromSystemServer();
   3974         }
   3975     }
   3976 
   3977     /** @hide */
   3978     public static int checkUidPermission(String permission, int uid) {
   3979         try {
   3980             return AppGlobals.getPackageManager()
   3981                     .checkUidPermission(permission, uid);
   3982         } catch (RemoteException e) {
   3983             throw e.rethrowFromSystemServer();
   3984         }
   3985     }
   3986 
   3987     /**
   3988      * @hide
   3989      * Helper for dealing with incoming user arguments to system service calls.
   3990      * Takes care of checking permissions and converting USER_CURRENT to the
   3991      * actual current user.
   3992      *
   3993      * @param callingPid The pid of the incoming call, as per Binder.getCallingPid().
   3994      * @param callingUid The uid of the incoming call, as per Binder.getCallingUid().
   3995      * @param userId The user id argument supplied by the caller -- this is the user
   3996      * they want to run as.
   3997      * @param allowAll If true, we will allow USER_ALL.  This means you must be prepared
   3998      * to get a USER_ALL returned and deal with it correctly.  If false,
   3999      * an exception will be thrown if USER_ALL is supplied.
   4000      * @param requireFull If true, the caller must hold
   4001      * {@link android.Manifest.permission#INTERACT_ACROSS_USERS_FULL} to be able to run as a
   4002      * different user than their current process; otherwise they must hold
   4003      * {@link android.Manifest.permission#INTERACT_ACROSS_USERS}.
   4004      * @param name Optional textual name of the incoming call; only for generating error messages.
   4005      * @param callerPackage Optional package name of caller; only for error messages.
   4006      *
   4007      * @return Returns the user ID that the call should run as.  Will always be a concrete
   4008      * user number, unless <var>allowAll</var> is true in which case it could also be
   4009      * USER_ALL.
   4010      */
   4011     public static int handleIncomingUser(int callingPid, int callingUid, int userId,
   4012             boolean allowAll, boolean requireFull, String name, String callerPackage) {
   4013         if (UserHandle.getUserId(callingUid) == userId) {
   4014             return userId;
   4015         }
   4016         try {
   4017             return getService().handleIncomingUser(callingPid,
   4018                     callingUid, userId, allowAll, requireFull, name, callerPackage);
   4019         } catch (RemoteException e) {
   4020             throw e.rethrowFromSystemServer();
   4021         }
   4022     }
   4023 
   4024     /**
   4025      * Gets the userId of the current foreground user. Requires system permissions.
   4026      * @hide
   4027      */
   4028     @SystemApi
   4029     @RequiresPermission(anyOf = {
   4030             "android.permission.INTERACT_ACROSS_USERS",
   4031             "android.permission.INTERACT_ACROSS_USERS_FULL"
   4032     })
   4033     public static int getCurrentUser() {
   4034         UserInfo ui;
   4035         try {
   4036             ui = getService().getCurrentUser();
   4037             return ui != null ? ui.id : 0;
   4038         } catch (RemoteException e) {
   4039             throw e.rethrowFromSystemServer();
   4040         }
   4041     }
   4042 
   4043     /**
   4044      * @param userid the user's id. Zero indicates the default user.
   4045      * @hide
   4046      */
   4047     public boolean switchUser(int userid) {
   4048         try {
   4049             return getService().switchUser(userid);
   4050         } catch (RemoteException e) {
   4051             throw e.rethrowFromSystemServer();
   4052         }
   4053     }
   4054 
   4055     /**
   4056      * Logs out current current foreground user by switching to the system user and stopping the
   4057      * user being switched from.
   4058      * @hide
   4059      */
   4060     public static void logoutCurrentUser() {
   4061         int currentUser = ActivityManager.getCurrentUser();
   4062         if (currentUser != UserHandle.USER_SYSTEM) {
   4063             try {
   4064                 getService().switchUser(UserHandle.USER_SYSTEM);
   4065                 getService().stopUser(currentUser, /* force= */ false, null);
   4066             } catch (RemoteException e) {
   4067                 e.rethrowFromSystemServer();
   4068             }
   4069         }
   4070     }
   4071 
   4072     /** {@hide} */
   4073     public static final int FLAG_OR_STOPPED = 1 << 0;
   4074     /** {@hide} */
   4075     public static final int FLAG_AND_LOCKED = 1 << 1;
   4076     /** {@hide} */
   4077     public static final int FLAG_AND_UNLOCKED = 1 << 2;
   4078     /** {@hide} */
   4079     public static final int FLAG_AND_UNLOCKING_OR_UNLOCKED = 1 << 3;
   4080 
   4081     /**
   4082      * Return whether the given user is actively running.  This means that
   4083      * the user is in the "started" state, not "stopped" -- it is currently
   4084      * allowed to run code through scheduled alarms, receiving broadcasts,
   4085      * etc.  A started user may be either the current foreground user or a
   4086      * background user; the result here does not distinguish between the two.
   4087      * @param userId the user's id. Zero indicates the default user.
   4088      * @hide
   4089      */
   4090     public boolean isUserRunning(int userId) {
   4091         try {
   4092             return getService().isUserRunning(userId, 0);
   4093         } catch (RemoteException e) {
   4094             throw e.rethrowFromSystemServer();
   4095         }
   4096     }
   4097 
   4098     /** {@hide} */
   4099     public boolean isVrModePackageEnabled(ComponentName component) {
   4100         try {
   4101             return getService().isVrModePackageEnabled(component);
   4102         } catch (RemoteException e) {
   4103             throw e.rethrowFromSystemServer();
   4104         }
   4105     }
   4106 
   4107     /**
   4108      * Perform a system dump of various state associated with the given application
   4109      * package name.  This call blocks while the dump is being performed, so should
   4110      * not be done on a UI thread.  The data will be written to the given file
   4111      * descriptor as text.
   4112      * @param fd The file descriptor that the dump should be written to.  The file
   4113      * descriptor is <em>not</em> closed by this function; the caller continues to
   4114      * own it.
   4115      * @param packageName The name of the package that is to be dumped.
   4116      */
   4117     @RequiresPermission(Manifest.permission.DUMP)
   4118     public void dumpPackageState(FileDescriptor fd, String packageName) {
   4119         dumpPackageStateStatic(fd, packageName);
   4120     }
   4121 
   4122     /**
   4123      * @hide
   4124      */
   4125     public static void dumpPackageStateStatic(FileDescriptor fd, String packageName) {
   4126         FileOutputStream fout = new FileOutputStream(fd);
   4127         PrintWriter pw = new FastPrintWriter(fout);
   4128         dumpService(pw, fd, "package", new String[] { packageName });
   4129         pw.println();
   4130         dumpService(pw, fd, Context.ACTIVITY_SERVICE, new String[] {
   4131                 "-a", "package", packageName });
   4132         pw.println();
   4133         dumpService(pw, fd, "meminfo", new String[] { "--local", "--package", packageName });
   4134         pw.println();
   4135         dumpService(pw, fd, ProcessStats.SERVICE_NAME, new String[] { packageName });
   4136         pw.println();
   4137         dumpService(pw, fd, "usagestats", new String[] { "--packages", packageName });
   4138         pw.println();
   4139         dumpService(pw, fd, BatteryStats.SERVICE_NAME, new String[] { packageName });
   4140         pw.flush();
   4141     }
   4142 
   4143     /**
   4144      * @hide
   4145      */
   4146     public static boolean isSystemReady() {
   4147         if (!sSystemReady) {
   4148             if (ActivityThread.isSystem()) {
   4149                 sSystemReady =
   4150                         LocalServices.getService(ActivityManagerInternal.class).isSystemReady();
   4151             } else {
   4152                 // Since this is being called from outside system server, system should be
   4153                 // ready by now.
   4154                 sSystemReady = true;
   4155             }
   4156         }
   4157         return sSystemReady;
   4158     }
   4159 
   4160     /**
   4161      * @hide
   4162      */
   4163     public static void broadcastStickyIntent(Intent intent, int userId) {
   4164         broadcastStickyIntent(intent, AppOpsManager.OP_NONE, userId);
   4165     }
   4166 
   4167     /**
   4168      * Convenience for sending a sticky broadcast.  For internal use only.
   4169      *
   4170      * @hide
   4171      */
   4172     public static void broadcastStickyIntent(Intent intent, int appOp, int userId) {
   4173         try {
   4174             getService().broadcastIntent(
   4175                     null, intent, null, null, Activity.RESULT_OK, null, null,
   4176                     null /*permission*/, appOp, null, false, true, userId);
   4177         } catch (RemoteException ex) {
   4178         }
   4179     }
   4180 
   4181     /**
   4182      * @hide
   4183      */
   4184     public static void noteWakeupAlarm(PendingIntent ps, int sourceUid, String sourcePkg,
   4185             String tag) {
   4186         try {
   4187             getService().noteWakeupAlarm((ps != null) ? ps.getTarget() : null,
   4188                     sourceUid, sourcePkg, tag);
   4189         } catch (RemoteException ex) {
   4190         }
   4191     }
   4192 
   4193     /**
   4194      * @hide
   4195      */
   4196     public static void noteAlarmStart(PendingIntent ps, int sourceUid, String tag) {
   4197         try {
   4198             getService().noteAlarmStart((ps != null) ? ps.getTarget() : null, sourceUid, tag);
   4199         } catch (RemoteException ex) {
   4200         }
   4201     }
   4202 
   4203     /**
   4204      * @hide
   4205      */
   4206     public static void noteAlarmFinish(PendingIntent ps, int sourceUid, String tag) {
   4207         try {
   4208             getService().noteAlarmFinish((ps != null) ? ps.getTarget() : null, sourceUid, tag);
   4209         } catch (RemoteException ex) {
   4210         }
   4211     }
   4212 
   4213     /**
   4214      * @hide
   4215      */
   4216     public static IActivityManager getService() {
   4217         return IActivityManagerSingleton.get();
   4218     }
   4219 
   4220     private static final Singleton<IActivityManager> IActivityManagerSingleton =
   4221             new Singleton<IActivityManager>() {
   4222                 @Override
   4223                 protected IActivityManager create() {
   4224                     final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);
   4225                     final IActivityManager am = IActivityManager.Stub.asInterface(b);
   4226                     return am;
   4227                 }
   4228             };
   4229 
   4230     private static void dumpService(PrintWriter pw, FileDescriptor fd, String name, String[] args) {
   4231         pw.print("DUMP OF SERVICE "); pw.print(name); pw.println(":");
   4232         IBinder service = ServiceManager.checkService(name);
   4233         if (service == null) {
   4234             pw.println("  (Service not found)");
   4235             return;
   4236         }
   4237         TransferPipe tp = null;
   4238         try {
   4239             pw.flush();
   4240             tp = new TransferPipe();
   4241             tp.setBufferPrefix("  ");
   4242             service.dumpAsync(tp.getWriteFd().getFileDescriptor(), args);
   4243             tp.go(fd, 10000);
   4244         } catch (Throwable e) {
   4245             if (tp != null) {
   4246                 tp.kill();
   4247             }
   4248             pw.println("Failure dumping service:");
   4249             e.printStackTrace(pw);
   4250         }
   4251     }
   4252 
   4253     /**
   4254      * Request that the system start watching for the calling process to exceed a pss
   4255      * size as given here.  Once called, the system will look for any occasions where it
   4256      * sees the associated process with a larger pss size and, when this happens, automatically
   4257      * pull a heap dump from it and allow the user to share the data.  Note that this request
   4258      * continues running even if the process is killed and restarted.  To remove the watch,
   4259      * use {@link #clearWatchHeapLimit()}.
   4260      *
   4261      * <p>This API only work if the calling process has been marked as
   4262      * {@link ApplicationInfo#FLAG_DEBUGGABLE} or this is running on a debuggable
   4263      * (userdebug or eng) build.</p>
   4264      *
   4265      * <p>Callers can optionally implement {@link #ACTION_REPORT_HEAP_LIMIT} to directly
   4266      * handle heap limit reports themselves.</p>
   4267      *
   4268      * @param pssSize The size in bytes to set the limit at.
   4269      */
   4270     public void setWatchHeapLimit(long pssSize) {
   4271         try {
   4272             getService().setDumpHeapDebugLimit(null, 0, pssSize,
   4273                     mContext.getPackageName());
   4274         } catch (RemoteException e) {
   4275             throw e.rethrowFromSystemServer();
   4276         }
   4277     }
   4278 
   4279     /**
   4280      * Action an app can implement to handle reports from {@link #setWatchHeapLimit(long)}.
   4281      * If your package has an activity handling this action, it will be launched with the
   4282      * heap data provided to it the same way as {@link Intent#ACTION_SEND}.  Note that to
   4283      * match the activty must support this action and a MIME type of "*&#47;*".
   4284      */
   4285     public static final String ACTION_REPORT_HEAP_LIMIT = "android.app.action.REPORT_HEAP_LIMIT";
   4286 
   4287     /**
   4288      * Clear a heap watch limit previously set by {@link #setWatchHeapLimit(long)}.
   4289      */
   4290     public void clearWatchHeapLimit() {
   4291         try {
   4292             getService().setDumpHeapDebugLimit(null, 0, 0, null);
   4293         } catch (RemoteException e) {
   4294             throw e.rethrowFromSystemServer();
   4295         }
   4296     }
   4297 
   4298     /**
   4299      * @hide
   4300      */
   4301     public void startLockTaskMode(int taskId) {
   4302         try {
   4303             getService().startLockTaskModeById(taskId);
   4304         } catch (RemoteException e) {
   4305             throw e.rethrowFromSystemServer();
   4306         }
   4307     }
   4308 
   4309     /**
   4310      * @hide
   4311      */
   4312     public void stopLockTaskMode() {
   4313         try {
   4314             getService().stopLockTaskMode();
   4315         } catch (RemoteException e) {
   4316             throw e.rethrowFromSystemServer();
   4317         }
   4318     }
   4319 
   4320     /**
   4321      * Return whether currently in lock task mode.  When in this mode
   4322      * no new tasks can be created or switched to.
   4323      *
   4324      * @see Activity#startLockTask()
   4325      *
   4326      * @deprecated Use {@link #getLockTaskModeState} instead.
   4327      */
   4328     @Deprecated
   4329     public boolean isInLockTaskMode() {
   4330         return getLockTaskModeState() != LOCK_TASK_MODE_NONE;
   4331     }
   4332 
   4333     /**
   4334      * Return the current state of task locking. The three possible outcomes
   4335      * are {@link #LOCK_TASK_MODE_NONE}, {@link #LOCK_TASK_MODE_LOCKED}
   4336      * and {@link #LOCK_TASK_MODE_PINNED}.
   4337      *
   4338      * @see Activity#startLockTask()
   4339      */
   4340     public int getLockTaskModeState() {
   4341         try {
   4342             return getService().getLockTaskModeState();
   4343         } catch (RemoteException e) {
   4344             throw e.rethrowFromSystemServer();
   4345         }
   4346     }
   4347 
   4348     /**
   4349      * Enable more aggressive scheduling for latency-sensitive low-runtime VR threads. Only one
   4350      * thread can be a VR thread in a process at a time, and that thread may be subject to
   4351      * restrictions on the amount of time it can run.
   4352      *
   4353      * If persistent VR mode is set, whatever thread has been granted aggressive scheduling via this
   4354      * method will return to normal operation, and calling this method will do nothing while
   4355      * persistent VR mode is enabled.
   4356      *
   4357      * To reset the VR thread for an application, a tid of 0 can be passed.
   4358      *
   4359      * @see android.os.Process#myTid()
   4360      * @param tid tid of the VR thread
   4361      */
   4362     public static void setVrThread(int tid) {
   4363         try {
   4364             getService().setVrThread(tid);
   4365         } catch (RemoteException e) {
   4366             // pass
   4367         }
   4368     }
   4369 
   4370     /**
   4371      * Enable more aggressive scheduling for latency-sensitive low-runtime VR threads that persist
   4372      * beyond a single process. Only one thread can be a
   4373      * persistent VR thread at a time, and that thread may be subject to restrictions on the amount
   4374      * of time it can run. Calling this method will disable aggressive scheduling for non-persistent
   4375      * VR threads set via {@link #setVrThread}. If persistent VR mode is disabled then the
   4376      * persistent VR thread loses its new scheduling priority; this method must be called again to
   4377      * set the persistent thread.
   4378      *
   4379      * To reset the persistent VR thread, a tid of 0 can be passed.
   4380      *
   4381      * @see android.os.Process#myTid()
   4382      * @param tid tid of the VR thread
   4383      * @hide
   4384      */
   4385     @RequiresPermission(Manifest.permission.RESTRICTED_VR_ACCESS)
   4386     public static void setPersistentVrThread(int tid) {
   4387         try {
   4388             getService().setPersistentVrThread(tid);
   4389         } catch (RemoteException e) {
   4390             // pass
   4391         }
   4392     }
   4393 
   4394     /**
   4395      * The AppTask allows you to manage your own application's tasks.
   4396      * See {@link android.app.ActivityManager#getAppTasks()}
   4397      */
   4398     public static class AppTask {
   4399         private IAppTask mAppTaskImpl;
   4400 
   4401         /** @hide */
   4402         public AppTask(IAppTask task) {
   4403             mAppTaskImpl = task;
   4404         }
   4405 
   4406         /**
   4407          * Finishes all activities in this task and removes it from the recent tasks list.
   4408          */
   4409         public void finishAndRemoveTask() {
   4410             try {
   4411                 mAppTaskImpl.finishAndRemoveTask();
   4412             } catch (RemoteException e) {
   4413                 throw e.rethrowFromSystemServer();
   4414             }
   4415         }
   4416 
   4417         /**
   4418          * Get the RecentTaskInfo associated with this task.
   4419          *
   4420          * @return The RecentTaskInfo for this task, or null if the task no longer exists.
   4421          */
   4422         public RecentTaskInfo getTaskInfo() {
   4423             try {
   4424                 return mAppTaskImpl.getTaskInfo();
   4425             } catch (RemoteException e) {
   4426                 throw e.rethrowFromSystemServer();
   4427             }
   4428         }
   4429 
   4430         /**
   4431          * Bring this task to the foreground.  If it contains activities, they will be
   4432          * brought to the foreground with it and their instances re-created if needed.
   4433          * If it doesn't contain activities, the root activity of the task will be
   4434          * re-launched.
   4435          */
   4436         public void moveToFront() {
   4437             try {
   4438                 mAppTaskImpl.moveToFront();
   4439             } catch (RemoteException e) {
   4440                 throw e.rethrowFromSystemServer();
   4441             }
   4442         }
   4443 
   4444         /**
   4445          * Start an activity in this task.  Brings the task to the foreground.  If this task
   4446          * is not currently active (that is, its id < 0), then a new activity for the given
   4447          * Intent will be launched as the root of the task and the task brought to the
   4448          * foreground.  Otherwise, if this task is currently active and the Intent does not specify
   4449          * an activity to launch in a new task, then a new activity for the given Intent will
   4450          * be launched on top of the task and the task brought to the foreground.  If this
   4451          * task is currently active and the Intent specifies {@link Intent#FLAG_ACTIVITY_NEW_TASK}
   4452          * or would otherwise be launched in to a new task, then the activity not launched but
   4453          * this task be brought to the foreground and a new intent delivered to the top
   4454          * activity if appropriate.
   4455          *
   4456          * <p>In other words, you generally want to use an Intent here that does not specify
   4457          * {@link Intent#FLAG_ACTIVITY_NEW_TASK} or {@link Intent#FLAG_ACTIVITY_NEW_DOCUMENT},
   4458          * and let the system do the right thing.</p>
   4459          *
   4460          * @param intent The Intent describing the new activity to be launched on the task.
   4461          * @param options Optional launch options.
   4462          *
   4463          * @see Activity#startActivity(android.content.Intent, android.os.Bundle)
   4464          */
   4465         public void startActivity(Context context, Intent intent, Bundle options) {
   4466             ActivityThread thread = ActivityThread.currentActivityThread();
   4467             thread.getInstrumentation().execStartActivityFromAppTask(context,
   4468                     thread.getApplicationThread(), mAppTaskImpl, intent, options);
   4469         }
   4470 
   4471         /**
   4472          * Modify the {@link Intent#FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS} flag in the root
   4473          * Intent of this AppTask.
   4474          *
   4475          * @param exclude If true, {@link Intent#FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS} will
   4476          * be set; otherwise, it will be cleared.
   4477          */
   4478         public void setExcludeFromRecents(boolean exclude) {
   4479             try {
   4480                 mAppTaskImpl.setExcludeFromRecents(exclude);
   4481             } catch (RemoteException e) {
   4482                 throw e.rethrowFromSystemServer();
   4483             }
   4484         }
   4485     }
   4486 }
   4487