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

Commit d34ec220 authored by Riddle Hsu's avatar Riddle Hsu
Browse files

Remove all usages of PooledConsumer

Improve readability and avoid overhead of pooled lambda.
Pool is not always efficiency with modern VM.

Bug: 163976519
Test: WmTests
Change-Id: I869c8578ce5940c31a73b77310a266aed9d60e0b
parent a44cf882
Loading
Loading
Loading
Loading
+31 −61
Original line number Diff line number Diff line
@@ -141,7 +141,6 @@ import android.window.WindowContainerToken;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.app.ResolverActivity;
import com.android.internal.protolog.common.ProtoLog;
import com.android.internal.util.function.pooled.PooledConsumer;
import com.android.internal.util.function.pooled.PooledLambda;
import com.android.internal.util.function.pooled.PooledPredicate;
import com.android.server.LocalServices;
@@ -269,12 +268,16 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
            synchronized (mService.mGlobalLock) {
                try {
                    mTaskSupervisor.beginDeferResume();

                    final PooledConsumer c = PooledLambda.obtainConsumer(
                            RootWindowContainer::destroyActivity, RootWindowContainer.this,
                            PooledLambda.__(ActivityRecord.class));
                    forAllActivities(c);
                    c.recycle();
                    forAllActivities(r -> {
                        if (r.finishing || !r.isDestroyable()) return;
                        if (DEBUG_SWITCH) {
                            Slog.v(TAG_SWITCH, "Destroying " + r + " in state " + r.getState()
                                    + " resumed=" + r.getTask().getTopResumedActivity()
                                    + " pausing=" + r.getTask().getTopPausingActivity()
                                    + " for reason " + mDestroyAllActivitiesReason);
                        }
                        r.destroyImmediately(mDestroyAllActivitiesReason);
                    });
                } finally {
                    mTaskSupervisor.endDeferResume();
                    resumeFocusedTasksTopActivities();
@@ -2422,30 +2425,23 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
        info.childTaskUserIds = new int[numTasks];
        final int[] currentIndex = {0};

        final PooledConsumer c = PooledLambda.obtainConsumer(
                RootWindowContainer::processTaskForTaskInfo, PooledLambda.__(Task.class), info,
                currentIndex);
        task.forAllLeafTasks(c, false /* traverseTopToBottom */);
        c.recycle();
        task.forAllLeafTasks(t -> {
            int i = currentIndex[0];
            info.childTaskIds[i] = t.mTaskId;
            info.childTaskNames[i] = t.origActivity != null ? t.origActivity.flattenToString()
                    : t.realActivity != null ? t.realActivity.flattenToString()
                    : t.getTopNonFinishingActivity() != null
                    ? t.getTopNonFinishingActivity().packageName : "unknown";
            info.childTaskBounds[i] = t.mAtmService.getTaskBounds(t.mTaskId);
            info.childTaskUserIds[i] = t.mUserId;
            currentIndex[0] = ++i;
        }, false /* traverseTopToBottom */);

        final ActivityRecord top = task.topRunningActivity();
        info.topActivity = top != null ? top.intent.getComponent() : null;
        return info;
    }

    private static void processTaskForTaskInfo(
            Task task, RootTaskInfo info, int[] currentIndex) {
        int i = currentIndex[0];
        info.childTaskIds[i] = task.mTaskId;
        info.childTaskNames[i] = task.origActivity != null ? task.origActivity.flattenToString()
                : task.realActivity != null ? task.realActivity.flattenToString()
                        : task.getTopNonFinishingActivity() != null
                                ? task.getTopNonFinishingActivity().packageName : "unknown";
        info.childTaskBounds[i] = task.mAtmService.getTaskBounds(task.mTaskId);
        info.childTaskUserIds[i] = task.mUserId;
        currentIndex[0] = ++i;
    }

    RootTaskInfo getRootTaskInfo(int taskId) {
        Task task = getRootTask(taskId);
        if (task != null) {
@@ -2670,17 +2666,11 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
    }

    void clearOtherAppTimeTrackers(AppTimeTracker except) {
        final PooledConsumer c = PooledLambda.obtainConsumer(
                RootWindowContainer::clearOtherAppTimeTrackers,
                PooledLambda.__(ActivityRecord.class), except);
        forAllActivities(c);
        c.recycle();
    }

    private static void clearOtherAppTimeTrackers(ActivityRecord r, AppTimeTracker except) {
        forAllActivities(r -> {
            if (r.appTimeTracker != except) {
                r.appTimeTracker = null;
            }
        });
    }

    void scheduleDestroyAllActivities(String reason) {
@@ -2688,19 +2678,6 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
        mService.mH.post(mDestroyAllActivitiesRunnable);
    }

    private void destroyActivity(ActivityRecord r) {
        if (r.finishing || !r.isDestroyable()) return;

        if (DEBUG_SWITCH) {
            Slog.v(TAG_SWITCH, "Destroying " + r + " in state " + r.getState()
                    + " resumed=" + r.getTask().getTopResumedActivity() + " pausing="
                    + r.getTask().getTopPausingActivity() + " for reason "
                    + mDestroyAllActivitiesReason);
        }

        r.destroyImmediately(mDestroyAllActivitiesReason);
    }

    // Tries to put all activity tasks to sleep. Returns true if all tasks were
    // successfully put to sleep.
    boolean putTasksToSleep(boolean allowDelay, boolean shuttingDown) {
@@ -3097,18 +3074,11 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
    void updateActivityApplicationInfo(ApplicationInfo aInfo) {
        final String packageName = aInfo.packageName;
        final int userId = UserHandle.getUserId(aInfo.uid);
        final PooledConsumer c = PooledLambda.obtainConsumer(
                RootWindowContainer::updateActivityApplicationInfo,
                PooledLambda.__(ActivityRecord.class), aInfo, userId, packageName);
        forAllActivities(c);
        c.recycle();
    }

    private static void updateActivityApplicationInfo(
            ActivityRecord r, ApplicationInfo aInfo, int userId, String packageName) {
        forAllActivities(r -> {
            if (r.mUserId == userId && packageName.equals(r.packageName)) {
                r.updateApplicationInfo(aInfo);
            }
        });
    }

    void finishVoiceTask(IVoiceInteractionSession session) {