Merge "Check user unlocked before write to /data/system_ce/0/snapshots"
This commit is contained in:
@@ -28,12 +28,14 @@ import android.graphics.Bitmap;
|
||||
import android.graphics.Bitmap.Config;
|
||||
import android.os.Process;
|
||||
import android.os.SystemClock;
|
||||
import android.os.UserManagerInternal;
|
||||
import android.util.ArraySet;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.internal.annotations.GuardedBy;
|
||||
import com.android.internal.annotations.VisibleForTesting;
|
||||
import com.android.internal.os.AtomicFile;
|
||||
import com.android.server.LocalServices;
|
||||
import com.android.server.wm.nano.WindowManagerProtos.TaskSnapshotProto;
|
||||
|
||||
import java.io.File;
|
||||
@@ -73,6 +75,7 @@ class TaskSnapshotPersister {
|
||||
private boolean mStarted;
|
||||
private final Object mLock = new Object();
|
||||
private final DirectoryResolver mDirectoryResolver;
|
||||
private final UserManagerInternal mUserManagerInternal;
|
||||
private final float mReducedScale;
|
||||
|
||||
/**
|
||||
@@ -84,6 +87,7 @@ class TaskSnapshotPersister {
|
||||
|
||||
TaskSnapshotPersister(WindowManagerService service, DirectoryResolver resolver) {
|
||||
mDirectoryResolver = resolver;
|
||||
mUserManagerInternal = LocalServices.getService(UserManagerInternal.class);
|
||||
if (service.mLowRamTaskSnapshotsAndRecents) {
|
||||
// Use very low res snapshots if we are using Go version of recents.
|
||||
mReducedScale = LOW_RAM_RECENTS_REDUCED_SCALE;
|
||||
@@ -172,7 +176,7 @@ class TaskSnapshotPersister {
|
||||
return;
|
||||
}
|
||||
}
|
||||
SystemClock.sleep(100);
|
||||
SystemClock.sleep(DELAY_MS);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -218,7 +222,7 @@ class TaskSnapshotPersister {
|
||||
|
||||
private boolean createDirectory(int userId) {
|
||||
final File dir = getDirectory(userId);
|
||||
return dir.exists() || dir.mkdirs();
|
||||
return dir.exists() || dir.mkdir();
|
||||
}
|
||||
|
||||
private void deleteSnapshot(int taskId, int userId) {
|
||||
@@ -243,18 +247,26 @@ class TaskSnapshotPersister {
|
||||
android.os.Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
|
||||
while (true) {
|
||||
WriteQueueItem next;
|
||||
boolean isReadyToWrite = false;
|
||||
synchronized (mLock) {
|
||||
if (mPaused) {
|
||||
next = null;
|
||||
} else {
|
||||
next = mWriteQueue.poll();
|
||||
if (next != null) {
|
||||
next.onDequeuedLocked();
|
||||
if (next.isReady()) {
|
||||
isReadyToWrite = true;
|
||||
next.onDequeuedLocked();
|
||||
} else {
|
||||
mWriteQueue.addLast(next);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (next != null) {
|
||||
next.write();
|
||||
if (isReadyToWrite) {
|
||||
next.write();
|
||||
}
|
||||
SystemClock.sleep(DELAY_MS);
|
||||
}
|
||||
synchronized (mLock) {
|
||||
@@ -274,6 +286,13 @@ class TaskSnapshotPersister {
|
||||
};
|
||||
|
||||
private abstract class WriteQueueItem {
|
||||
/**
|
||||
* @return {@code true} if item is ready to have {@link WriteQueueItem#write} called
|
||||
*/
|
||||
boolean isReady() {
|
||||
return true;
|
||||
}
|
||||
|
||||
abstract void write();
|
||||
|
||||
/**
|
||||
@@ -312,6 +331,11 @@ class TaskSnapshotPersister {
|
||||
mStoreQueueItems.remove(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
boolean isReady() {
|
||||
return mUserManagerInternal.isUserUnlocked(mUserId);
|
||||
}
|
||||
|
||||
@Override
|
||||
void write() {
|
||||
if (!createDirectory(mUserId)) {
|
||||
|
||||
@@ -23,6 +23,9 @@ import static android.graphics.GraphicBuffer.USAGE_SW_READ_RARELY;
|
||||
|
||||
import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
|
||||
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.app.ActivityManager.TaskSnapshot;
|
||||
import android.content.ComponentName;
|
||||
import android.graphics.Canvas;
|
||||
@@ -32,9 +35,14 @@ import android.graphics.GraphicBuffer;
|
||||
import android.graphics.PixelFormat;
|
||||
import android.graphics.Rect;
|
||||
import android.os.UserManager;
|
||||
import android.os.UserManagerInternal;
|
||||
|
||||
import com.android.server.LocalServices;
|
||||
|
||||
import org.junit.After;
|
||||
import org.junit.AfterClass;
|
||||
import org.junit.Before;
|
||||
import org.junit.BeforeClass;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
@@ -50,10 +58,26 @@ class TaskSnapshotPersisterTestBase extends WindowTestsBase {
|
||||
TaskSnapshotLoader mLoader;
|
||||
int mTestUserId;
|
||||
|
||||
@BeforeClass
|
||||
public static void setUpOnce() {
|
||||
final UserManagerInternal userManager = mock(UserManagerInternal.class);
|
||||
LocalServices.addService(UserManagerInternal.class, userManager);
|
||||
}
|
||||
|
||||
@AfterClass
|
||||
public static void tearDownOnce() {
|
||||
LocalServices.removeServiceForTest(UserManagerInternal.class);
|
||||
}
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
final UserManager um = UserManager.get(getInstrumentation().getTargetContext());
|
||||
mTestUserId = um.getUserHandle();
|
||||
|
||||
final UserManagerInternal userManagerInternal =
|
||||
LocalServices.getService(UserManagerInternal.class);
|
||||
when(userManagerInternal.isUserUnlocked(mTestUserId)).thenReturn(true);
|
||||
|
||||
mPersister = new TaskSnapshotPersister(mWm, userId -> FILES_DIR);
|
||||
mLoader = new TaskSnapshotLoader(mPersister);
|
||||
mPersister.start();
|
||||
|
||||
Reference in New Issue
Block a user