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