Home | History | Annotate | Download | only in am
      1 /*
      2  * Copyright (C) 2006 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 com.android.server.am;
     18 
     19 import android.content.ComponentName;
     20 import android.content.Intent;
     21 import android.content.pm.ActivityInfo;
     22 import android.os.UserId;
     23 import android.util.Slog;
     24 
     25 import java.io.PrintWriter;
     26 
     27 class TaskRecord extends ThumbnailHolder {
     28     final int taskId;       // Unique identifier for this task.
     29     final String affinity;  // The affinity name for this task, or null.
     30     Intent intent;          // The original intent that started the task.
     31     Intent affinityIntent;  // Intent of affinity-moved activity that started this task.
     32     ComponentName origActivity; // The non-alias activity component of the intent.
     33     ComponentName realActivity; // The actual activity component that started the task.
     34     int numActivities;      // Current number of activities in this task.
     35     long lastActiveTime;    // Last time this task was active, including sleep.
     36     boolean rootWasReset;   // True if the intent at the root of the task had
     37                             // the FLAG_ACTIVITY_RESET_TASK_IF_NEEDED flag.
     38     boolean askedCompatMode;// Have asked the user about compat mode for this task.
     39 
     40     String stringName;      // caching of toString() result.
     41     int userId;             // user for which this task was created
     42 
     43     TaskRecord(int _taskId, ActivityInfo info, Intent _intent) {
     44         taskId = _taskId;
     45         affinity = info.taskAffinity;
     46         setIntent(_intent, info);
     47     }
     48 
     49     void touchActiveTime() {
     50         lastActiveTime = android.os.SystemClock.elapsedRealtime();
     51     }
     52 
     53     long getInactiveDuration() {
     54         return android.os.SystemClock.elapsedRealtime() - lastActiveTime;
     55     }
     56 
     57     void setIntent(Intent _intent, ActivityInfo info) {
     58         stringName = null;
     59 
     60         if (info.targetActivity == null) {
     61             if (_intent != null) {
     62                 // If this Intent has a selector, we want to clear it for the
     63                 // recent task since it is not relevant if the user later wants
     64                 // to re-launch the app.
     65                 if (_intent.getSelector() != null || _intent.getSourceBounds() != null) {
     66                     _intent = new Intent(_intent);
     67                     _intent.setSelector(null);
     68                     _intent.setSourceBounds(null);
     69                 }
     70             }
     71             if (ActivityManagerService.DEBUG_TASKS) Slog.v(ActivityManagerService.TAG,
     72                     "Setting Intent of " + this + " to " + _intent);
     73             intent = _intent;
     74             realActivity = _intent != null ? _intent.getComponent() : null;
     75             origActivity = null;
     76         } else {
     77             ComponentName targetComponent = new ComponentName(
     78                     info.packageName, info.targetActivity);
     79             if (_intent != null) {
     80                 Intent targetIntent = new Intent(_intent);
     81                 targetIntent.setComponent(targetComponent);
     82                 targetIntent.setSelector(null);
     83                 targetIntent.setSourceBounds(null);
     84                 if (ActivityManagerService.DEBUG_TASKS) Slog.v(ActivityManagerService.TAG,
     85                         "Setting Intent of " + this + " to target " + targetIntent);
     86                 intent = targetIntent;
     87                 realActivity = targetComponent;
     88                 origActivity = _intent.getComponent();
     89             } else {
     90                 intent = null;
     91                 realActivity = targetComponent;
     92                 origActivity = new ComponentName(info.packageName, info.name);
     93             }
     94         }
     95 
     96         if (intent != null &&
     97                 (intent.getFlags()&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) {
     98             // Once we are set to an Intent with this flag, we count this
     99             // task as having a true root activity.
    100             rootWasReset = true;
    101         }
    102 
    103         if (info.applicationInfo != null) {
    104             userId = UserId.getUserId(info.applicationInfo.uid);
    105         }
    106     }
    107 
    108     void dump(PrintWriter pw, String prefix) {
    109         if (numActivities != 0 || rootWasReset || userId != 0) {
    110             pw.print(prefix); pw.print("numActivities="); pw.print(numActivities);
    111                     pw.print(" rootWasReset="); pw.print(rootWasReset);
    112                     pw.print(" userId="); pw.println(userId);
    113         }
    114         if (affinity != null) {
    115             pw.print(prefix); pw.print("affinity="); pw.println(affinity);
    116         }
    117         if (intent != null) {
    118             StringBuilder sb = new StringBuilder(128);
    119             sb.append(prefix); sb.append("intent={");
    120             intent.toShortString(sb, false, true, false, true);
    121             sb.append('}');
    122             pw.println(sb.toString());
    123         }
    124         if (affinityIntent != null) {
    125             StringBuilder sb = new StringBuilder(128);
    126             sb.append(prefix); sb.append("affinityIntent={");
    127             affinityIntent.toShortString(sb, false, true, false, true);
    128             sb.append('}');
    129             pw.println(sb.toString());
    130         }
    131         if (origActivity != null) {
    132             pw.print(prefix); pw.print("origActivity=");
    133             pw.println(origActivity.flattenToShortString());
    134         }
    135         if (realActivity != null) {
    136             pw.print(prefix); pw.print("realActivity=");
    137             pw.println(realActivity.flattenToShortString());
    138         }
    139         if (!askedCompatMode) {
    140             pw.print(prefix); pw.print("askedCompatMode="); pw.println(askedCompatMode);
    141         }
    142         pw.print(prefix); pw.print("lastThumbnail="); pw.print(lastThumbnail);
    143                 pw.print(" lastDescription="); pw.println(lastDescription);
    144         pw.print(prefix); pw.print("lastActiveTime="); pw.print(lastActiveTime);
    145                 pw.print(" (inactive for ");
    146                 pw.print((getInactiveDuration()/1000)); pw.println("s)");
    147     }
    148 
    149     public String toString() {
    150         if (stringName != null) {
    151             return stringName;
    152         }
    153         StringBuilder sb = new StringBuilder(128);
    154         sb.append("TaskRecord{");
    155         sb.append(Integer.toHexString(System.identityHashCode(this)));
    156         sb.append(" #");
    157         sb.append(taskId);
    158         if (affinity != null) {
    159             sb.append(" A ");
    160             sb.append(affinity);
    161         } else if (intent != null) {
    162             sb.append(" I ");
    163             sb.append(intent.getComponent().flattenToShortString());
    164         } else if (affinityIntent != null) {
    165             sb.append(" aI ");
    166             sb.append(affinityIntent.getComponent().flattenToShortString());
    167         } else {
    168             sb.append(" ??");
    169         }
    170         sb.append(" U ");
    171         sb.append(userId);
    172         sb.append('}');
    173         return stringName = sb.toString();
    174     }
    175 }
    176