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

Commit 7eb2bed2 authored by Tarandeep Singh's avatar Tarandeep Singh
Browse files

Apply Insets animation when hw acceleration unavailable

On certain midrange and lower-specced devices, apps could be running
without hardware acceleration. Insets animation relied on ThreadRenderer's
frame-by-frame callbacks to animate system bars / IME.
When hardware acceleration is not available, we should just animate it
without any frame sync for now.

Bug: 111084606
Bug: 149342281
Test: Manually tested on Go device
     1. Use app like Messages which don't have hw accelaration
     2. Tap on editor to verify IME appears.

Change-Id: Icf453f09f4236a5092cf3ff7be99f98ece073979
parent 7e51a4b6
Loading
Loading
Loading
Loading
+8 −2
Original line number Diff line number Diff line
@@ -39,7 +39,6 @@ import android.util.Log;
import android.util.Pair;
import android.util.Property;
import android.util.SparseArray;
import android.view.InputDevice.MotionRange;
import android.view.InsetsSourceConsumer.ShowResult;
import android.view.InsetsState.InternalInsetsType;
import android.view.SurfaceControl.Transaction;
@@ -680,7 +679,14 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
            }
            mApplier = new SyncRtSurfaceTransactionApplier(mViewRoot.mView);
        }
        if (mViewRoot.mView.isHardwareAccelerated()) {
            mApplier.scheduleApply(params);
        } else {
            // Window doesn't support hardware acceleration, no synchronization for now.
            // TODO(b/149342281): use mViewRoot.mSurface.getNextFrameNumber() to sync on every
            //  frame instead.
            mApplier.applyParams(new Transaction(), -1 /* frame */, params);
        }
    }

    void notifyControlRevoked(InsetsSourceConsumer consumer) {
+21 −8
Original line number Diff line number Diff line
@@ -65,18 +65,31 @@ public class SyncRtSurfaceTransactionApplier {
                return;
            }
            Transaction t = new Transaction();
            applyParams(t, frame, params);
        });

        // Make sure a frame gets scheduled.
        mTargetViewRootImpl.getView().invalidate();
    }

    /**
     * Applies surface parameters on the next frame.
     * @param t transaction to apply all parameters in.
     * @param frame frame to synchronize to. Set -1 when sync is not required.
     * @param params The surface parameters to apply. DO NOT MODIFY the list after passing into
     *               this method to avoid synchronization issues.
     */
    void applyParams(Transaction t, long frame, final SurfaceParams... params) {
        for (int i = params.length - 1; i >= 0; i--) {
            SurfaceParams surfaceParams = params[i];
            SurfaceControl surface = surfaceParams.surface;
            if (frame > 0) {
                t.deferTransactionUntil(surface, mTargetSc, frame);
            }
            applyParams(t, surfaceParams, mTmpFloat9);
        }
        t.setEarlyWakeup();
        t.apply();
        });

        // Make sure a frame gets scheduled.
        mTargetViewRootImpl.getView().invalidate();
    }

    public static void applyParams(Transaction t, SurfaceParams params, float[] tmpFloat9) {