Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2cb86c72 authored by Winson Chung's avatar Winson Chung
Browse files

Saving last TaskDescription for TaskRecord.

Change-Id: I531e0fc661fdedeb78bee7d5472668de8e9c2104
parent 4ba615d5
Loading
Loading
Loading
Loading
+24 −0
Original line number Diff line number Diff line
@@ -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.
         */
+10 −25
Original line number Diff line number Diff line
@@ -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
@@ -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);
@@ -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);
@@ -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);
            }
@@ -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;
+34 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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;

@@ -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>();
+20 −5
Original line number Diff line number Diff line
@@ -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";

@@ -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;
@@ -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() {
@@ -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);
@@ -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);
@@ -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);
            }
@@ -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);