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

Commit bb6c0333 authored by Winson Chung's avatar Winson Chung Committed by Android (Google) Code Review
Browse files

Merge "Ensuring that the ActivityInfo cache accounts for the task's user id....

Merge "Ensuring that the ActivityInfo cache accounts for the task's user id. (Bug 17314317)" into lmp-dev
parents b1b26711 a734fc1e
Loading
Loading
Loading
Loading
+32 −18
Original line number Diff line number Diff line
@@ -18,7 +18,6 @@ package com.android.systemui.recents.model;

import android.app.ActivityManager;
import android.content.ComponentCallbacks2;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.content.res.Resources;
@@ -28,6 +27,8 @@ import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.UserHandle;
import android.util.Log;

import com.android.systemui.recents.Constants;
import com.android.systemui.recents.RecentsConfiguration;
import com.android.systemui.recents.misc.SystemServicesProxy;
@@ -232,6 +233,8 @@ class TaskResourceLoader implements Runnable {
/* Recents task loader
 * NOTE: We should not hold any references to a Context from a static instance */
public class RecentsTaskLoader {
    private static final String TAG = "RecentsTaskLoader";

    static RecentsTaskLoader sInstance;

    SystemServicesProxy mSystemServicesProxy;
@@ -335,11 +338,15 @@ public class RecentsTaskLoader {
                infoHandle.info = ssp.getActivityInfo(taskKey.baseIntent.getComponent(),
                        taskKey.userId);
            }
            if (infoHandle.info != null) {
                icon = ssp.getActivityIcon(infoHandle.info, taskKey.userId);
                if (icon != null) {
                    mApplicationIconCache.put(taskKey, icon);
                    return icon;
                }
        // If we are not preloading, return the default icon to show
            }
        }
        // If we couldn't load any icon, return null
        return null;
    }

@@ -361,8 +368,13 @@ public class RecentsTaskLoader {
            infoHandle.info = ssp.getActivityInfo(taskKey.baseIntent.getComponent(),
                    taskKey.userId);
        }
        if (infoHandle.info != null) {
            label = ssp.getActivityLabel(infoHandle.info);
            mActivityLabelCache.put(taskKey, label);
        } else {
            Log.w(TAG, "Missing ActivityInfo for " + taskKey.baseIntent.getComponent()
                    + " u=" + taskKey.userId);
        }
        return label;
    }

@@ -401,8 +413,8 @@ public class RecentsTaskLoader {
            List<Task> tasksToLoadOut) {
        RecentsConfiguration config = RecentsConfiguration.getInstance();
        List<ActivityManager.RecentTaskInfo> tasks = getRecentTasks(ssp);
        HashMap<ComponentName, ActivityInfoHandle> activityInfoCache =
                new HashMap<ComponentName, ActivityInfoHandle>();
        HashMap<Task.ComponentNameKey, ActivityInfoHandle> activityInfoCache =
                new HashMap<Task.ComponentNameKey, ActivityInfoHandle>();
        ArrayList<Task> tasksToAdd = new ArrayList<Task>();
        TaskStack stack = new TaskStack();

@@ -410,19 +422,21 @@ public class RecentsTaskLoader {
        for (int i = 0; i < taskCount; i++) {
            ActivityManager.RecentTaskInfo t = tasks.get(i);

            // Compose the task key
            Task.TaskKey taskKey = new Task.TaskKey(t.persistentId, t.baseIntent, t.userId,
                    t.firstActiveTime, t.lastActiveTime);

            // Get an existing activity info handle if possible
            ComponentName cn = t.baseIntent.getComponent();
            ActivityInfoHandle infoHandle = new ActivityInfoHandle();
            Task.ComponentNameKey cnKey = taskKey.getComponentNameKey();
            ActivityInfoHandle infoHandle;
            boolean hasCachedActivityInfo = false;
            if (activityInfoCache.containsKey(cn)) {
                infoHandle = activityInfoCache.get(cn);
            if (activityInfoCache.containsKey(cnKey)) {
                infoHandle = activityInfoCache.get(cnKey);
                hasCachedActivityInfo = true;
            } else {
                infoHandle = new ActivityInfoHandle();
            }

            // Compose the task key
            Task.TaskKey taskKey = new Task.TaskKey(t.persistentId, t.baseIntent, t.userId,
                    t.firstActiveTime, t.lastActiveTime);

            // Determine whether to preload this task
            boolean preloadTask = false;
            if (preloadTaskId > 0) {
@@ -440,7 +454,7 @@ public class RecentsTaskLoader {

            // Update the activity info cache
            if (!hasCachedActivityInfo && infoHandle.info != null) {
                activityInfoCache.put(cn, infoHandle);
                activityInfoCache.put(cnKey, infoHandle);
            }

            // Add the task to the stack
+36 −0
Original line number Diff line number Diff line
@@ -16,12 +16,15 @@

package com.android.systemui.recents.model;

import android.content.ComponentName;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import com.android.systemui.recents.misc.Utilities;

import java.util.Objects;


/**
 * A task represents the top most task in the system's task stack.
@@ -35,8 +38,35 @@ public class Task {
        public void onTaskDataUnloaded();
    }

    /** The ComponentNameKey represents the unique primary key for a component
     * belonging to a specified user. */
    public static class ComponentNameKey {
        final ComponentName component;
        final int userId;

        public ComponentNameKey(ComponentName cn, int user) {
            component = cn;
            userId = user;
        }

        @Override
        public int hashCode() {
            return Objects.hash(component, userId);
        }

        @Override
        public boolean equals(Object o) {
            if (!(o instanceof ComponentNameKey)) {
                return false;
            }
            return component.equals(((ComponentNameKey) o).component) &&
                    userId == ((ComponentNameKey) o).userId;
        }
    }

    /* The Task Key represents the unique primary key for the task */
    public static class TaskKey {
        final ComponentNameKey mComponentNameKey;
        public final int id;
        public final Intent baseIntent;
        public final int userId;
@@ -44,6 +74,7 @@ public class Task {
        public long lastActiveTime;

        public TaskKey(int id, Intent intent, int userId, long firstActiveTime, long lastActiveTime) {
            mComponentNameKey = new ComponentNameKey(intent.getComponent(), userId);
            this.id = id;
            this.baseIntent = intent;
            this.userId = userId;
@@ -51,6 +82,11 @@ public class Task {
            this.lastActiveTime = lastActiveTime;
        }

        /** Returns the component name key for this task. */
        public ComponentNameKey getComponentNameKey() {
            return mComponentNameKey;
        }

        @Override
        public boolean equals(Object o) {
            if (!(o instanceof TaskKey)) {