• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.UserHandle;
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 
TaskRecord(int _taskId, ActivityInfo info, Intent _intent)43     TaskRecord(int _taskId, ActivityInfo info, Intent _intent) {
44         taskId = _taskId;
45         affinity = info.taskAffinity;
46         setIntent(_intent, info);
47     }
48 
touchActiveTime()49     void touchActiveTime() {
50         lastActiveTime = android.os.SystemClock.elapsedRealtime();
51     }
52 
getInactiveDuration()53     long getInactiveDuration() {
54         return android.os.SystemClock.elapsedRealtime() - lastActiveTime;
55     }
56 
setIntent(Intent _intent, ActivityInfo info)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 = UserHandle.getUserId(info.applicationInfo.uid);
105         }
106     }
107 
dump(PrintWriter pw, String prefix)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 
toString()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