Loading core/java/android/app/ActivityManager.java +24 −0 Original line number Diff line number Diff line Loading @@ -537,6 +537,30 @@ public class ActivityManager { readFromParcel(source); } /** * Sets the label for this task description. * @hide */ public void setLabel(String label) { mLabel = label; } /** * Sets the primary color for this task description. * @hide */ public void setPrimaryColor(int primaryColor) { mColorPrimary = primaryColor; } /** * Sets the icon for this task description. * @hide */ public void setIcon(Bitmap icon) { mIcon = icon; } /** * @return The label and description of the current state of this task. */ Loading services/core/java/com/android/server/am/ActivityRecord.java +10 −25 Original line number Diff line number Diff line Loading @@ -79,8 +79,6 @@ final class ActivityRecord { private static final String ATTR_LAUNCHEDFROMPACKAGE = "launched_from_package"; private static final String ATTR_RESOLVEDTYPE = "resolved_type"; private static final String ATTR_COMPONENTSPECIFIED = "component_specified"; private static final String ATTR_TASKDESCRIPTIONLABEL = "task_description_label"; private static final String ATTR_TASKDESCRIPTIONCOLOR = "task_description_color"; private static final String ACTIVITY_ICON_SUFFIX = "_activity_icon_"; final ActivityManagerService service; // owner Loading Loading @@ -1064,20 +1062,10 @@ final class ActivityRecord { } out.attribute(null, ATTR_COMPONENTSPECIFIED, String.valueOf(componentSpecified)); out.attribute(null, ATTR_USERID, String.valueOf(userId)); if (taskDescription != null) { final String label = taskDescription.getLabel(); if (label != null) { out.attribute(null, ATTR_TASKDESCRIPTIONLABEL, label); } final int colorPrimary = taskDescription.getPrimaryColor(); if (colorPrimary != 0) { out.attribute(null, ATTR_TASKDESCRIPTIONCOLOR, Integer.toHexString(colorPrimary)); } final Bitmap icon = taskDescription.getIcon(); if (icon != null) { TaskPersister.saveImage(icon, String.valueOf(task.taskId) + ACTIVITY_ICON_SUFFIX + createTime); } TaskPersister.saveTaskDescription(taskDescription, String.valueOf(task.taskId) + ACTIVITY_ICON_SUFFIX + createTime, out); } out.startTag(null, TAG_INTENT); Loading @@ -1100,10 +1088,9 @@ final class ActivityRecord { String resolvedType = null; boolean componentSpecified = false; int userId = 0; String activityLabel = null; int activityColor = 0; long createTime = -1; final int outerDepth = in.getDepth(); TaskDescription taskDescription = new TaskDescription(); for (int attrNdx = in.getAttributeCount() - 1; attrNdx >= 0; --attrNdx) { final String attrName = in.getAttributeName(attrNdx); Loading @@ -1122,10 +1109,9 @@ final class ActivityRecord { componentSpecified = Boolean.valueOf(attrValue); } else if (ATTR_USERID.equals(attrName)) { userId = Integer.valueOf(attrValue); } else if (ATTR_TASKDESCRIPTIONLABEL.equals(attrName)) { activityLabel = attrValue; } else if (ATTR_TASKDESCRIPTIONCOLOR.equals(attrName)) { activityColor = (int) Long.parseLong(attrValue, 16); } else if (TaskPersister.readTaskDescriptionAttribute(taskDescription, attrName, attrValue)) { // Completed in TaskPersister.readTaskDescriptionAttribute() } else { Log.d(TAG, "Unknown ActivityRecord attribute=" + attrName); } Loading Loading @@ -1169,12 +1155,11 @@ final class ActivityRecord { r.persistentState = persistentState; Bitmap icon = null; if (createTime >= 0) { icon = TaskPersister.restoreImage(String.valueOf(taskId) + ACTIVITY_ICON_SUFFIX + createTime); taskDescription.setIcon(TaskPersister.restoreImage(String.valueOf(taskId) + ACTIVITY_ICON_SUFFIX + createTime)); } r.taskDescription = new TaskDescription(activityLabel, icon, activityColor); r.taskDescription = taskDescription; r.createTime = createTime; return r; Loading services/core/java/com/android/server/am/TaskPersister.java +34 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.server.am; import android.app.ActivityManager; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Debug; Loading Loading @@ -56,6 +57,9 @@ public class TaskPersister { private static final String TAG_TASK = "task"; private static final String ATTR_TASKDESCRIPTIONLABEL = "task_description_label"; private static final String ATTR_TASKDESCRIPTIONCOLOR = "task_description_color"; private static File sImagesDir; private static File sTasksDir; Loading Loading @@ -143,6 +147,36 @@ public class TaskPersister { } } static void saveTaskDescription(ActivityManager.TaskDescription taskDescription, String iconFilename, XmlSerializer out) throws IOException { if (taskDescription != null) { final String label = taskDescription.getLabel(); if (label != null) { out.attribute(null, ATTR_TASKDESCRIPTIONLABEL, label); } final int colorPrimary = taskDescription.getPrimaryColor(); if (colorPrimary != 0) { out.attribute(null, ATTR_TASKDESCRIPTIONCOLOR, Integer.toHexString(colorPrimary)); } final Bitmap icon = taskDescription.getIcon(); if (icon != null) { saveImage(icon, iconFilename); } } } static boolean readTaskDescriptionAttribute(ActivityManager.TaskDescription taskDescription, String attrName, String attrValue) { if (ATTR_TASKDESCRIPTIONLABEL.equals(attrName)) { taskDescription.setLabel(attrValue); return true; } else if (ATTR_TASKDESCRIPTIONCOLOR.equals(attrName)) { taskDescription.setPrimaryColor((int) Long.parseLong(attrValue, 16)); return true; } return false; } ArrayList<TaskRecord> restoreTasksLocked() { final ArrayList<TaskRecord> tasks = new ArrayList<TaskRecord>(); ArraySet<Integer> recoveredTaskIds = new ArraySet<Integer>(); Loading services/core/java/com/android/server/am/TaskRecord.java +20 −5 Original line number Diff line number Diff line Loading @@ -60,6 +60,7 @@ final class TaskRecord extends ThumbnailHolder { private static final String ATTR_LASTDESCRIPTION = "last_description"; private static final String ATTR_LASTTIMEMOVED = "last_time_moved"; private static final String ATTR_NEVERRELINQUISH = "never_relinquish_identity"; private static final String LAST_ACTIVITY_ICON_SUFFIX = "_last_activity_icon_"; private static final String TASK_THUMBNAIL_SUFFIX = "_task_thumbnail"; Loading Loading @@ -138,7 +139,8 @@ final class TaskRecord extends ThumbnailHolder { String _affinity, ComponentName _realActivity, ComponentName _origActivity, boolean _rootWasReset, boolean _askedCompatMode, int _taskType, int _userId, String _lastDescription, ArrayList<ActivityRecord> activities, long _lastActiveTime, long lastTimeMoved, boolean neverRelinquishIdentity) { long lastTimeMoved, boolean neverRelinquishIdentity, ActivityManager.TaskDescription _lastTaskDescription) { mService = service; taskId = _taskId; intent = _intent; Loading @@ -158,8 +160,7 @@ final class TaskRecord extends ThumbnailHolder { mActivities = activities; mLastTimeMoved = lastTimeMoved; mNeverRelinquishIdentity = neverRelinquishIdentity; // Recompute the task description for this task updateTaskDescription(); lastTaskDescription = _lastTaskDescription; } void touchActiveTime() { Loading Loading @@ -714,6 +715,11 @@ final class TaskRecord extends ThumbnailHolder { out.attribute(null, ATTR_LASTDESCRIPTION, lastDescription.toString()); } if (lastTaskDescription != null) { TaskPersister.saveTaskDescription(lastTaskDescription, String.valueOf(taskId) + LAST_ACTIVITY_ICON_SUFFIX + lastActiveTime, out); } if (affinityIntent != null) { out.startTag(null, TAG_AFFINITYINTENT); affinityIntent.saveToXml(out); Loading Loading @@ -758,11 +764,12 @@ final class TaskRecord extends ThumbnailHolder { int taskType = ActivityRecord.APPLICATION_ACTIVITY_TYPE; int userId = 0; String lastDescription = null; long lastActiveTime = 0; long lastActiveTime = -1; long lastTimeOnTop = 0; boolean neverRelinquishIdentity = true; int taskId = -1; final int outerDepth = in.getDepth(); ActivityManager.TaskDescription taskDescription = new ActivityManager.TaskDescription(); for (int attrNdx = in.getAttributeCount() - 1; attrNdx >= 0; --attrNdx) { final String attrName = in.getAttributeName(attrNdx); Loading Loading @@ -793,6 +800,9 @@ final class TaskRecord extends ThumbnailHolder { lastTimeOnTop = Long.valueOf(attrValue); } else if (ATTR_NEVERRELINQUISH.equals(attrName)) { neverRelinquishIdentity = Boolean.valueOf(attrValue); } else if (TaskPersister.readTaskDescriptionAttribute(taskDescription, attrName, attrValue)) { // Completed in TaskPersister.readTaskDescriptionAttribute() } else { Slog.w(TAG, "TaskRecord: Unknown attribute=" + attrName); } Loading Loading @@ -824,10 +834,15 @@ final class TaskRecord extends ThumbnailHolder { } } if (lastActiveTime >= 0) { taskDescription.setIcon(TaskPersister.restoreImage(String.valueOf(taskId) + LAST_ACTIVITY_ICON_SUFFIX + lastActiveTime)); } final TaskRecord task = new TaskRecord(stackSupervisor.mService, taskId, intent, affinityIntent, affinity, realActivity, origActivity, rootHasReset, askedCompatMode, taskType, userId, lastDescription, activities, lastActiveTime, lastTimeOnTop, neverRelinquishIdentity); lastTimeOnTop, neverRelinquishIdentity, taskDescription); for (int activityNdx = activities.size() - 1; activityNdx >=0; --activityNdx) { final ActivityRecord r = activities.get(activityNdx); Loading Loading
core/java/android/app/ActivityManager.java +24 −0 Original line number Diff line number Diff line Loading @@ -537,6 +537,30 @@ public class ActivityManager { readFromParcel(source); } /** * Sets the label for this task description. * @hide */ public void setLabel(String label) { mLabel = label; } /** * Sets the primary color for this task description. * @hide */ public void setPrimaryColor(int primaryColor) { mColorPrimary = primaryColor; } /** * Sets the icon for this task description. * @hide */ public void setIcon(Bitmap icon) { mIcon = icon; } /** * @return The label and description of the current state of this task. */ Loading
services/core/java/com/android/server/am/ActivityRecord.java +10 −25 Original line number Diff line number Diff line Loading @@ -79,8 +79,6 @@ final class ActivityRecord { private static final String ATTR_LAUNCHEDFROMPACKAGE = "launched_from_package"; private static final String ATTR_RESOLVEDTYPE = "resolved_type"; private static final String ATTR_COMPONENTSPECIFIED = "component_specified"; private static final String ATTR_TASKDESCRIPTIONLABEL = "task_description_label"; private static final String ATTR_TASKDESCRIPTIONCOLOR = "task_description_color"; private static final String ACTIVITY_ICON_SUFFIX = "_activity_icon_"; final ActivityManagerService service; // owner Loading Loading @@ -1064,20 +1062,10 @@ final class ActivityRecord { } out.attribute(null, ATTR_COMPONENTSPECIFIED, String.valueOf(componentSpecified)); out.attribute(null, ATTR_USERID, String.valueOf(userId)); if (taskDescription != null) { final String label = taskDescription.getLabel(); if (label != null) { out.attribute(null, ATTR_TASKDESCRIPTIONLABEL, label); } final int colorPrimary = taskDescription.getPrimaryColor(); if (colorPrimary != 0) { out.attribute(null, ATTR_TASKDESCRIPTIONCOLOR, Integer.toHexString(colorPrimary)); } final Bitmap icon = taskDescription.getIcon(); if (icon != null) { TaskPersister.saveImage(icon, String.valueOf(task.taskId) + ACTIVITY_ICON_SUFFIX + createTime); } TaskPersister.saveTaskDescription(taskDescription, String.valueOf(task.taskId) + ACTIVITY_ICON_SUFFIX + createTime, out); } out.startTag(null, TAG_INTENT); Loading @@ -1100,10 +1088,9 @@ final class ActivityRecord { String resolvedType = null; boolean componentSpecified = false; int userId = 0; String activityLabel = null; int activityColor = 0; long createTime = -1; final int outerDepth = in.getDepth(); TaskDescription taskDescription = new TaskDescription(); for (int attrNdx = in.getAttributeCount() - 1; attrNdx >= 0; --attrNdx) { final String attrName = in.getAttributeName(attrNdx); Loading @@ -1122,10 +1109,9 @@ final class ActivityRecord { componentSpecified = Boolean.valueOf(attrValue); } else if (ATTR_USERID.equals(attrName)) { userId = Integer.valueOf(attrValue); } else if (ATTR_TASKDESCRIPTIONLABEL.equals(attrName)) { activityLabel = attrValue; } else if (ATTR_TASKDESCRIPTIONCOLOR.equals(attrName)) { activityColor = (int) Long.parseLong(attrValue, 16); } else if (TaskPersister.readTaskDescriptionAttribute(taskDescription, attrName, attrValue)) { // Completed in TaskPersister.readTaskDescriptionAttribute() } else { Log.d(TAG, "Unknown ActivityRecord attribute=" + attrName); } Loading Loading @@ -1169,12 +1155,11 @@ final class ActivityRecord { r.persistentState = persistentState; Bitmap icon = null; if (createTime >= 0) { icon = TaskPersister.restoreImage(String.valueOf(taskId) + ACTIVITY_ICON_SUFFIX + createTime); taskDescription.setIcon(TaskPersister.restoreImage(String.valueOf(taskId) + ACTIVITY_ICON_SUFFIX + createTime)); } r.taskDescription = new TaskDescription(activityLabel, icon, activityColor); r.taskDescription = taskDescription; r.createTime = createTime; return r; Loading
services/core/java/com/android/server/am/TaskPersister.java +34 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.server.am; import android.app.ActivityManager; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Debug; Loading Loading @@ -56,6 +57,9 @@ public class TaskPersister { private static final String TAG_TASK = "task"; private static final String ATTR_TASKDESCRIPTIONLABEL = "task_description_label"; private static final String ATTR_TASKDESCRIPTIONCOLOR = "task_description_color"; private static File sImagesDir; private static File sTasksDir; Loading Loading @@ -143,6 +147,36 @@ public class TaskPersister { } } static void saveTaskDescription(ActivityManager.TaskDescription taskDescription, String iconFilename, XmlSerializer out) throws IOException { if (taskDescription != null) { final String label = taskDescription.getLabel(); if (label != null) { out.attribute(null, ATTR_TASKDESCRIPTIONLABEL, label); } final int colorPrimary = taskDescription.getPrimaryColor(); if (colorPrimary != 0) { out.attribute(null, ATTR_TASKDESCRIPTIONCOLOR, Integer.toHexString(colorPrimary)); } final Bitmap icon = taskDescription.getIcon(); if (icon != null) { saveImage(icon, iconFilename); } } } static boolean readTaskDescriptionAttribute(ActivityManager.TaskDescription taskDescription, String attrName, String attrValue) { if (ATTR_TASKDESCRIPTIONLABEL.equals(attrName)) { taskDescription.setLabel(attrValue); return true; } else if (ATTR_TASKDESCRIPTIONCOLOR.equals(attrName)) { taskDescription.setPrimaryColor((int) Long.parseLong(attrValue, 16)); return true; } return false; } ArrayList<TaskRecord> restoreTasksLocked() { final ArrayList<TaskRecord> tasks = new ArrayList<TaskRecord>(); ArraySet<Integer> recoveredTaskIds = new ArraySet<Integer>(); Loading
services/core/java/com/android/server/am/TaskRecord.java +20 −5 Original line number Diff line number Diff line Loading @@ -60,6 +60,7 @@ final class TaskRecord extends ThumbnailHolder { private static final String ATTR_LASTDESCRIPTION = "last_description"; private static final String ATTR_LASTTIMEMOVED = "last_time_moved"; private static final String ATTR_NEVERRELINQUISH = "never_relinquish_identity"; private static final String LAST_ACTIVITY_ICON_SUFFIX = "_last_activity_icon_"; private static final String TASK_THUMBNAIL_SUFFIX = "_task_thumbnail"; Loading Loading @@ -138,7 +139,8 @@ final class TaskRecord extends ThumbnailHolder { String _affinity, ComponentName _realActivity, ComponentName _origActivity, boolean _rootWasReset, boolean _askedCompatMode, int _taskType, int _userId, String _lastDescription, ArrayList<ActivityRecord> activities, long _lastActiveTime, long lastTimeMoved, boolean neverRelinquishIdentity) { long lastTimeMoved, boolean neverRelinquishIdentity, ActivityManager.TaskDescription _lastTaskDescription) { mService = service; taskId = _taskId; intent = _intent; Loading @@ -158,8 +160,7 @@ final class TaskRecord extends ThumbnailHolder { mActivities = activities; mLastTimeMoved = lastTimeMoved; mNeverRelinquishIdentity = neverRelinquishIdentity; // Recompute the task description for this task updateTaskDescription(); lastTaskDescription = _lastTaskDescription; } void touchActiveTime() { Loading Loading @@ -714,6 +715,11 @@ final class TaskRecord extends ThumbnailHolder { out.attribute(null, ATTR_LASTDESCRIPTION, lastDescription.toString()); } if (lastTaskDescription != null) { TaskPersister.saveTaskDescription(lastTaskDescription, String.valueOf(taskId) + LAST_ACTIVITY_ICON_SUFFIX + lastActiveTime, out); } if (affinityIntent != null) { out.startTag(null, TAG_AFFINITYINTENT); affinityIntent.saveToXml(out); Loading Loading @@ -758,11 +764,12 @@ final class TaskRecord extends ThumbnailHolder { int taskType = ActivityRecord.APPLICATION_ACTIVITY_TYPE; int userId = 0; String lastDescription = null; long lastActiveTime = 0; long lastActiveTime = -1; long lastTimeOnTop = 0; boolean neverRelinquishIdentity = true; int taskId = -1; final int outerDepth = in.getDepth(); ActivityManager.TaskDescription taskDescription = new ActivityManager.TaskDescription(); for (int attrNdx = in.getAttributeCount() - 1; attrNdx >= 0; --attrNdx) { final String attrName = in.getAttributeName(attrNdx); Loading Loading @@ -793,6 +800,9 @@ final class TaskRecord extends ThumbnailHolder { lastTimeOnTop = Long.valueOf(attrValue); } else if (ATTR_NEVERRELINQUISH.equals(attrName)) { neverRelinquishIdentity = Boolean.valueOf(attrValue); } else if (TaskPersister.readTaskDescriptionAttribute(taskDescription, attrName, attrValue)) { // Completed in TaskPersister.readTaskDescriptionAttribute() } else { Slog.w(TAG, "TaskRecord: Unknown attribute=" + attrName); } Loading Loading @@ -824,10 +834,15 @@ final class TaskRecord extends ThumbnailHolder { } } if (lastActiveTime >= 0) { taskDescription.setIcon(TaskPersister.restoreImage(String.valueOf(taskId) + LAST_ACTIVITY_ICON_SUFFIX + lastActiveTime)); } final TaskRecord task = new TaskRecord(stackSupervisor.mService, taskId, intent, affinityIntent, affinity, realActivity, origActivity, rootHasReset, askedCompatMode, taskType, userId, lastDescription, activities, lastActiveTime, lastTimeOnTop, neverRelinquishIdentity); lastTimeOnTop, neverRelinquishIdentity, taskDescription); for (int activityNdx = activities.size() - 1; activityNdx >=0; --activityNdx) { final ActivityRecord r = activities.get(activityNdx); Loading