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