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