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

Commit 0015b855 authored by Wei Sheng Shih's avatar Wei Sheng Shih Committed by Android (Google) Code Review
Browse files

Merge "Check isUserUnlocked before attemp to delete snapshot file." into main

parents 158d7e32 0e09f645
Loading
Loading
Loading
Loading
+11 −31
Original line number Diff line number Diff line
@@ -31,8 +31,6 @@ import android.util.SparseArray;
import android.window.TaskSnapshot;

import com.android.internal.annotations.VisibleForTesting;
import com.android.server.LocalServices;
import com.android.server.pm.UserManagerInternal;
import com.android.server.wm.BaseAppSnapshotPersister.PersistInfoProvider;
import com.android.window.flags.Flags;

@@ -163,18 +161,12 @@ class ActivitySnapshotController extends AbsAppSnapshotController<ActivityRecord
    private void cleanUpUserFiles(int userId) {
        synchronized (mSnapshotPersistQueue.getLock()) {
            mSnapshotPersistQueue.sendToQueueLocked(
                    new SnapshotPersistQueue.WriteQueueItem(mPersistInfoProvider) {
                        @Override
                        boolean isReady() {
                            final UserManagerInternal mUserManagerInternal =
                                    LocalServices.getService(UserManagerInternal.class);
                            return mUserManagerInternal.isUserUnlocked(userId);
                        }
                    new SnapshotPersistQueue.WriteQueueItem(mPersistInfoProvider, userId) {

                        @Override
                        void write() {
                            Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "cleanUpUserFiles");
                            final File file = mPersistInfoProvider.getDirectory(userId);
                            final File file = mPersistInfoProvider.getDirectory(mUserId);
                            if (file.exists()) {
                                final File[] contents = file.listFiles();
                                if (contents != null) {
@@ -263,15 +255,13 @@ class ActivitySnapshotController extends AbsAppSnapshotController<ActivityRecord

    class LoadActivitySnapshotItem extends SnapshotPersistQueue.WriteQueueItem {
        private final int mCode;
        private final int mUserId;
        private final ActivityRecord[] mActivities;

        LoadActivitySnapshotItem(@NonNull ActivityRecord[] activities, int code, int userId,
                @NonNull PersistInfoProvider persistInfoProvider) {
            super(persistInfoProvider);
            super(persistInfoProvider, userId);
            mActivities = activities;
            mCode = code;
            mUserId = userId;
        }

        @Override
@@ -305,6 +295,11 @@ class ActivitySnapshotController extends AbsAppSnapshotController<ActivityRecord
            return mCode == other.mCode && mUserId == other.mUserId
                    && mPersistInfoProvider == other.mPersistInfoProvider;
        }

        @Override
        public String toString() {
            return "LoadActivitySnapshotItem{code=" + mCode + ", UserId=" + mUserId + "}";
        }
    }

    void loadActivitySnapshot() {
@@ -714,24 +709,9 @@ class ActivitySnapshotController extends AbsAppSnapshotController<ActivityRecord
            }
            removeTargets.add(usf);
        }
        removeSnapshotFiles(removeTargets);
    }

    private void removeSnapshotFiles(@NonNull ArrayList<UserSavedFile> files) {
        synchronized (mSnapshotPersistQueue.getLock()) {
            mSnapshotPersistQueue.sendToQueueLocked(
                    new SnapshotPersistQueue.WriteQueueItem(mPersistInfoProvider) {
                        @Override
                        void write() {
                            Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "activity_remove_files");
                            for (int i = files.size() - 1; i >= 0; --i) {
                                final UserSavedFile usf = files.get(i);
                                mSnapshotPersistQueue.deleteSnapshot(
                                        usf.mFileId, usf.mUserId, mPersistInfoProvider);
                            }
                            Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
                        }
                    });
        for (int i = removeTargets.size() - 1; i >= 0; --i) {
            final UserSavedFile usf = removeTargets.get(i);
            mPersister.removeSnapshot(usf.mFileId, usf.mUserId);
        }
    }

+1 −0
Original line number Diff line number Diff line
@@ -211,5 +211,6 @@ class SnapshotController {
    void dump(PrintWriter pw, String prefix) {
        mTaskSnapshotController.dump(pw, prefix);
        mActivitySnapshotController.dump(pw, prefix);
        mSnapshotPersistQueue.dump(pw, prefix);
    }
}
+36 −16
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ import com.android.server.wm.nano.WindowManagerProtos.TaskSnapshotProto;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayDeque;

/**
@@ -155,7 +156,9 @@ class SnapshotPersistQueue {
    void deleteSnapshot(int index, int userId, PersistInfoProvider provider) {
        final File protoFile = provider.getProtoFile(index, userId);
        final File bitmapLowResFile = provider.getLowResolutionBitmapFile(index, userId);
        if (protoFile.exists()) {
            protoFile.delete();
        }
        if (bitmapLowResFile.exists()) {
            bitmapLowResFile.delete();
        }
@@ -177,7 +180,7 @@ class SnapshotPersistQueue {
                    } else {
                        next = mWriteQueue.poll();
                        if (next != null) {
                            if (next.isReady()) {
                            if (next.isReady(mUserManagerInternal)) {
                                isReadyToWrite = true;
                                next.onDequeuedLocked();
                            } else {
@@ -210,14 +213,16 @@ class SnapshotPersistQueue {

    abstract static class WriteQueueItem {
        protected final PersistInfoProvider mPersistInfoProvider;
        WriteQueueItem(@NonNull PersistInfoProvider persistInfoProvider) {
        protected final int mUserId;
        WriteQueueItem(@NonNull PersistInfoProvider persistInfoProvider, int userId) {
            mPersistInfoProvider = persistInfoProvider;
            mUserId = userId;
        }
        /**
         * @return {@code true} if item is ready to have {@link WriteQueueItem#write} called
         */
        boolean isReady() {
            return true;
        boolean isReady(UserManagerInternal userManager) {
            return userManager.isUserUnlocked(mUserId);
        }

        abstract void write();
@@ -242,14 +247,12 @@ class SnapshotPersistQueue {

    class StoreWriteQueueItem extends WriteQueueItem {
        private final int mId;
        private final int mUserId;
        private final TaskSnapshot mSnapshot;

        StoreWriteQueueItem(int id, int userId, TaskSnapshot snapshot,
                PersistInfoProvider provider) {
            super(provider);
            super(provider, userId);
            mId = id;
            mUserId = userId;
            mSnapshot = snapshot;
        }

@@ -267,11 +270,6 @@ class SnapshotPersistQueue {
            mStoreQueueItems.remove(this);
        }

        @Override
        boolean isReady() {
            return mUserManagerInternal.isUserUnlocked(mUserId);
        }

        @Override
        void write() {
            if (Trace.isTagEnabled(TRACE_TAG_WINDOW_MANAGER)) {
@@ -391,6 +389,11 @@ class SnapshotPersistQueue {
            return mId == other.mId && mUserId == other.mUserId
                    && mPersistInfoProvider == other.mPersistInfoProvider;
        }

        @Override
        public String toString() {
            return "StoreWriteQueueItem{ID=" + mId + ", UserId=" + mUserId + "}";
        }
    }

    DeleteWriteQueueItem createDeleteWriteQueueItem(int id, int userId,
@@ -400,12 +403,10 @@ class SnapshotPersistQueue {

    private class DeleteWriteQueueItem extends WriteQueueItem {
        private final int mId;
        private final int mUserId;

        DeleteWriteQueueItem(int id, int userId, PersistInfoProvider provider) {
            super(provider);
            super(provider, userId);
            mId = id;
            mUserId = userId;
        }

        @Override
@@ -414,5 +415,24 @@ class SnapshotPersistQueue {
            deleteSnapshot(mId, mUserId, mPersistInfoProvider);
            Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
        }

        @Override
        public String toString() {
            return "DeleteWriteQueueItem{ID=" + mId + ", UserId=" + mUserId + "}";
        }
    }

    void dump(PrintWriter pw, String prefix) {
        final WriteQueueItem[] items;
        synchronized (mLock) {
            items = mWriteQueue.toArray(new WriteQueueItem[0]);
        }
        if (items.length == 0) {
            return;
        }
        pw.println(prefix + "PersistQueue contains:");
        for (int i = items.length - 1; i >= 0; --i) {
            pw.println(prefix + "  " + items[i] + "");
        }
    }
}
+16 −1
Original line number Diff line number Diff line
@@ -19,11 +19,13 @@ package com.android.server.wm;
import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;

import android.os.Trace;
import android.os.UserHandle;
import android.util.ArraySet;
import android.window.TaskSnapshot;

import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.server.pm.UserManagerInternal;

import java.io.File;
import java.util.Arrays;
@@ -84,6 +86,9 @@ class TaskSnapshotPersister extends BaseAppSnapshotPersister {
     *                       model.
     */
    void removeObsoleteFiles(ArraySet<Integer> persistentTaskIds, int[] runningUserIds) {
        if (runningUserIds.length == 0) {
            return;
        }
        synchronized (mLock) {
            mPersistedTaskIdsSinceLastRemoveObsolete.clear();
            mSnapshotPersistQueue.sendToQueueLocked(new RemoveObsoleteFilesQueueItem(
@@ -99,11 +104,21 @@ class TaskSnapshotPersister extends BaseAppSnapshotPersister {
        @VisibleForTesting
        RemoveObsoleteFilesQueueItem(ArraySet<Integer> persistentTaskIds,
                int[] runningUserIds, PersistInfoProvider provider) {
            super(provider);
            super(provider, runningUserIds.length > 0 ? runningUserIds[0] : UserHandle.USER_SYSTEM);
            mPersistentTaskIds = new ArraySet<>(persistentTaskIds);
            mRunningUserIds = Arrays.copyOf(runningUserIds, runningUserIds.length);
        }

        @Override
        boolean isReady(UserManagerInternal userManagerInternal) {
            for (int i = mRunningUserIds.length - 1; i >= 0; --i) {
                if (!userManagerInternal.isUserUnlocked(mRunningUserIds[i])) {
                    return false;
                }
            }
            return true;
        }

        @Override
        void write() {
            Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "RemoveObsoleteFilesQueueItem");