blob: c0a1d891cd5bf801f4e4512b84ad00a5db2f3e5a [file] [log] [blame]
/*
* Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License
*/
package com.android.systemui.shared.system;
import android.graphics.Matrix;
import android.graphics.Rect;
import android.view.Surface;
import android.view.SurfaceControl;
import android.view.SurfaceControl.Transaction;
import android.view.SyncRtSurfaceTransactionApplier;
import android.view.SyncRtSurfaceTransactionApplier.SurfaceParams;
import android.view.ThreadedRenderer;
import android.view.View;
import android.view.ViewRootImpl;
import java.util.function.Consumer;
/**
* Helper class to apply surface transactions in sync with RenderThread.
*/
public class SyncRtSurfaceTransactionApplierCompat {
private final SyncRtSurfaceTransactionApplier mApplier;
/**
* @param targetView The view in the surface that acts as synchronization anchor.
*/
public SyncRtSurfaceTransactionApplierCompat(View targetView) {
mApplier = new SyncRtSurfaceTransactionApplier(targetView);
}
private SyncRtSurfaceTransactionApplierCompat(SyncRtSurfaceTransactionApplier applier) {
mApplier = applier;
}
/**
* Schedules applying surface parameters on the next frame.
*
* @param params The surface parameters to apply. DO NOT MODIFY the list after passing into
* this method to avoid synchronization issues.
*/
public void scheduleApply(final SurfaceParams... params) {
mApplier.scheduleApply(convert(params));
}
private SyncRtSurfaceTransactionApplier.SurfaceParams[] convert(SurfaceParams[] params) {
SyncRtSurfaceTransactionApplier.SurfaceParams[] result =
new SyncRtSurfaceTransactionApplier.SurfaceParams[params.length];
for (int i = 0; i < params.length; i++) {
result[i] = params[i].mParams;
}
return result;
}
public static void applyParams(TransactionCompat t, SurfaceParams params) {
SyncRtSurfaceTransactionApplier.applyParams(t.mTransaction, params.mParams, t.mTmpValues);
}
public static void create(final View targetView,
final Consumer<SyncRtSurfaceTransactionApplierCompat> callback) {
SyncRtSurfaceTransactionApplier.create(targetView,
new Consumer<SyncRtSurfaceTransactionApplier>() {
@Override
public void accept(SyncRtSurfaceTransactionApplier applier) {
callback.accept(new SyncRtSurfaceTransactionApplierCompat(applier));
}
});
}
public static class SurfaceParams {
private final SyncRtSurfaceTransactionApplier.SurfaceParams mParams;
/**
* Constructs surface parameters to be applied when the current view state gets pushed to
* RenderThread.
*
* @param surface The surface to modify.
* @param alpha Alpha to apply.
* @param matrix Matrix to apply.
* @param windowCrop Crop to apply.
*/
public SurfaceParams(SurfaceControlCompat surface, float alpha, Matrix matrix,
Rect windowCrop, int layer, float cornerRadius) {
mParams = new SyncRtSurfaceTransactionApplier.SurfaceParams(surface.mSurfaceControl,
alpha, matrix, windowCrop, layer, cornerRadius);
}
}
}