mirror of
https://github.com/LawnchairLauncher/lawnchair.git
synced 2026-02-20 19:38:21 +00:00
Merge "Force finish pending frame drawn callback once launcher is stopped" into tm-qpr-dev am: 99b1580d79
Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Launcher3/+/19569180 Change-Id: I7a3c16f1e34e78df8281b832b16a379ecf35166b Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -17,6 +17,7 @@ package com.android.quickstep;
|
||||
|
||||
import android.graphics.HardwareRenderer;
|
||||
import android.os.Handler;
|
||||
import android.view.SurfaceControl;
|
||||
import android.view.View;
|
||||
import android.view.ViewRootImpl;
|
||||
|
||||
@@ -45,22 +46,42 @@ public class ViewUtils {
|
||||
return new FrameHandler(view, onFinishRunnable, canceled).schedule();
|
||||
}
|
||||
|
||||
private static class FrameHandler implements HardwareRenderer.FrameDrawingCallback {
|
||||
private static class FrameHandler implements HardwareRenderer.FrameDrawingCallback,
|
||||
ViewRootImpl.SurfaceChangedCallback {
|
||||
|
||||
final ViewRootImpl mViewRoot;
|
||||
final Runnable mFinishCallback;
|
||||
final BooleanSupplier mCancelled;
|
||||
final Handler mHandler;
|
||||
boolean mFinished;
|
||||
|
||||
int mDeferFrameCount = 1;
|
||||
|
||||
FrameHandler(View view, Runnable finishCallback, BooleanSupplier cancelled) {
|
||||
mViewRoot = view.getViewRootImpl();
|
||||
mViewRoot.addSurfaceChangedCallback(this);
|
||||
mFinishCallback = finishCallback;
|
||||
mCancelled = cancelled;
|
||||
mHandler = new Handler();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void surfaceCreated(SurfaceControl.Transaction t) {
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
@Override
|
||||
public void surfaceReplaced(SurfaceControl.Transaction t) {
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
@Override
|
||||
public void surfaceDestroyed() {
|
||||
// If the root view is detached, then the app won't get any scheduled frames so we need
|
||||
// to force-run any pending callbacks
|
||||
finish();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFrameDraw(long frame) {
|
||||
Utilities.postAsyncCallback(mHandler, this::onFrame);
|
||||
@@ -77,9 +98,7 @@ public class ViewUtils {
|
||||
return;
|
||||
}
|
||||
|
||||
if (mFinishCallback != null) {
|
||||
mFinishCallback.run();
|
||||
}
|
||||
finish();
|
||||
}
|
||||
|
||||
private boolean schedule() {
|
||||
@@ -90,5 +109,17 @@ public class ViewUtils {
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private void finish() {
|
||||
if (mFinished) {
|
||||
return;
|
||||
}
|
||||
mFinished = true;
|
||||
mDeferFrameCount = 0;
|
||||
if (mFinishCallback != null) {
|
||||
mFinishCallback.run();
|
||||
}
|
||||
mViewRoot.removeSurfaceChangedCallback(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user