Fix race condition on size compat UI
Before, the leash might have been released while the update surface position runnable was in queue. Now, we make sure the leash is valid before update position. Fix: 196942784 Test: manual Change-Id: I2d052bf46b12a2441dbc0aa1aabf5dfe9be2fa45
This commit is contained in:
@@ -28,6 +28,7 @@ import android.content.res.Configuration;
|
||||
import android.graphics.PixelFormat;
|
||||
import android.graphics.Rect;
|
||||
import android.os.Binder;
|
||||
import android.util.Log;
|
||||
import android.view.SurfaceControl;
|
||||
import android.view.View;
|
||||
import android.view.WindowManager;
|
||||
@@ -45,7 +46,7 @@ import com.android.wm.shell.common.SyncTransactionQueue;
|
||||
class SizeCompatUILayout {
|
||||
private static final String TAG = "SizeCompatUILayout";
|
||||
|
||||
private final SyncTransactionQueue mSyncQueue;
|
||||
final SyncTransactionQueue mSyncQueue;
|
||||
private final SizeCompatUIController.SizeCompatUICallback mCallback;
|
||||
private Context mContext;
|
||||
private Configuration mTaskConfig;
|
||||
@@ -306,6 +307,10 @@ class SizeCompatUILayout {
|
||||
|
||||
private void updateSurfacePosition(SurfaceControl leash, int positionX, int positionY) {
|
||||
mSyncQueue.runInSync(t -> {
|
||||
if (!leash.isValid()) {
|
||||
Log.w(TAG, "The leash has been released.");
|
||||
return;
|
||||
}
|
||||
t.setPosition(leash, positionX, positionY);
|
||||
// The size compat UI should be the topmost child of the Task in case there can be more
|
||||
// than one children.
|
||||
|
||||
@@ -110,7 +110,8 @@ class SizeCompatUIWindowManager extends WindowlessWindowManager {
|
||||
}
|
||||
|
||||
if (mLeash != null) {
|
||||
new SurfaceControl.Transaction().remove(mLeash).apply();
|
||||
final SurfaceControl leash = mLeash;
|
||||
mLayout.mSyncQueue.runInSync(t -> t.remove(leash));
|
||||
mLeash = null;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user