blob: 677a559cd3b0ccdd079737f933214bb888f606d9 [file] [log] [blame]
Adrian Roos9b963d32019-02-13 18:39:36 +00001/*
2 * Copyright (C) 2019 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.view;
18
19import android.graphics.Rect;
Adrian Roos9b963d32019-02-13 18:39:36 +000020
21import com.android.internal.util.Preconditions;
22
23import java.util.concurrent.Executor;
24
25/**
26 * Listener for sampling the result of the screen composition.
27 * {@hide}
28 */
29public abstract class CompositionSamplingListener {
30
Winson Chung52d938d2019-09-25 16:50:05 -070031 private long mNativeListener;
Adrian Roos9b963d32019-02-13 18:39:36 +000032 private final Executor mExecutor;
33
34 public CompositionSamplingListener(Executor executor) {
35 mExecutor = executor;
36 mNativeListener = nativeCreate(this);
37 }
38
Winson Chung52d938d2019-09-25 16:50:05 -070039 public void destroy() {
40 if (mNativeListener == 0) {
41 return;
42 }
43 unregister(this);
44 nativeDestroy(mNativeListener);
45 mNativeListener = 0;
46 }
47
Adrian Roos9b963d32019-02-13 18:39:36 +000048 @Override
49 protected void finalize() throws Throwable {
50 try {
Winson Chung52d938d2019-09-25 16:50:05 -070051 destroy();
Adrian Roos9b963d32019-02-13 18:39:36 +000052 } finally {
53 super.finalize();
54 }
55 }
56
57 /**
58 * Reports a luma sample from the registered region.
59 */
60 public abstract void onSampleCollected(float medianLuma);
61
62 /**
63 * Registers a sampling listener.
64 */
65 public static void register(CompositionSamplingListener listener,
Vishnu Nair4bcd1522019-06-25 17:29:27 -070066 int displayId, SurfaceControl stopLayer, Rect samplingArea) {
Winson Chung52d938d2019-09-25 16:50:05 -070067 if (listener.mNativeListener == 0) {
68 return;
69 }
Adrian Roos9b963d32019-02-13 18:39:36 +000070 Preconditions.checkArgument(displayId == Display.DEFAULT_DISPLAY,
71 "default display only for now");
Vishnu Nair4bcd1522019-06-25 17:29:27 -070072 long nativeStopLayerObject = stopLayer != null ? stopLayer.mNativeObject : 0;
73 nativeRegister(listener.mNativeListener, nativeStopLayerObject, samplingArea.left,
74 samplingArea.top, samplingArea.right, samplingArea.bottom);
Adrian Roos9b963d32019-02-13 18:39:36 +000075 }
76
77 /**
78 * Unregisters a sampling listener.
79 */
80 public static void unregister(CompositionSamplingListener listener) {
Winson Chung52d938d2019-09-25 16:50:05 -070081 if (listener.mNativeListener == 0) {
82 return;
83 }
Adrian Roos9b963d32019-02-13 18:39:36 +000084 nativeUnregister(listener.mNativeListener);
85 }
86
87 /**
88 * Dispatch the collected sample.
89 *
90 * Called from native code on a binder thread.
91 */
92 private static void dispatchOnSampleCollected(CompositionSamplingListener listener,
93 float medianLuma) {
94 listener.mExecutor.execute(() -> listener.onSampleCollected(medianLuma));
95 }
96
97 private static native long nativeCreate(CompositionSamplingListener thiz);
98 private static native void nativeDestroy(long ptr);
Vishnu Nair4bcd1522019-06-25 17:29:27 -070099 private static native void nativeRegister(long ptr, long stopLayerObject,
Adrian Roos9b963d32019-02-13 18:39:36 +0000100 int samplingAreaLeft, int top, int right, int bottom);
101 private static native void nativeUnregister(long ptr);
102}