1 /*
2  * Copyright (C) 2013 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 
17 #define LOG_TAG "SurfaceControl"
18 #define LOG_NDEBUG 0
19 
20 #include <aidl/android/hardware/graphics/common/PixelFormat.h>
21 #include <android-base/chrono_utils.h>
22 #include <android/graphics/properties.h>
23 #include <android/graphics/region.h>
24 #include <android/gui/BnWindowInfosReportedListener.h>
25 #include <android/hardware/display/IDeviceProductInfoConstants.h>
26 #include <android/os/IInputConstants.h>
27 #include <android_runtime/AndroidRuntime.h>
28 #include <android_runtime/android_graphics_GraphicBuffer.h>
29 #include <android_runtime/android_hardware_HardwareBuffer.h>
30 #include <android_runtime/android_hardware_OverlayProperties.h>
31 #include <android_runtime/android_view_Surface.h>
32 #include <android_runtime/android_view_SurfaceControl.h>
33 #include <android_runtime/android_view_SurfaceSession.h>
34 #include <gui/ISurfaceComposer.h>
35 #include <gui/Surface.h>
36 #include <gui/SurfaceComposerClient.h>
37 #include <jni.h>
38 #include <nativehelper/JNIHelp.h>
39 #include <nativehelper/ScopedUtfChars.h>
40 #include <private/gui/ComposerService.h>
41 #include <stdio.h>
42 #include <system/graphics.h>
43 #include <ui/BlurRegion.h>
44 #include <ui/ConfigStoreTypes.h>
45 #include <ui/DeviceProductInfo.h>
46 #include <ui/DisplayMode.h>
47 #include <ui/DisplayedFrameStats.h>
48 #include <ui/DynamicDisplayInfo.h>
49 #include <ui/FrameStats.h>
50 #include <ui/GraphicTypes.h>
51 #include <ui/HdrCapabilities.h>
52 #include <ui/Rect.h>
53 #include <ui/Region.h>
54 #include <ui/StaticDisplayInfo.h>
55 #include <utils/LightRefBase.h>
56 #include <utils/Log.h>
57 
58 #include <memory>
59 
60 #include "android_hardware_input_InputWindowHandle.h"
61 #include "android_os_Parcel.h"
62 #include "android_util_Binder.h"
63 #include "core_jni_helpers.h"
64 #include "jni_common.h"
65 
66 // ----------------------------------------------------------------------------
67 
68 namespace android {
69 
70 using gui::FocusRequest;
71 
doThrowNPE(JNIEnv * env)72 static void doThrowNPE(JNIEnv* env) {
73     jniThrowNullPointerException(env, NULL);
74 }
75 
doThrowIAE(JNIEnv * env,const char * msg=nullptr)76 static void doThrowIAE(JNIEnv* env, const char* msg = nullptr) {
77     jniThrowException(env, "java/lang/IllegalArgumentException", msg);
78 }
79 
80 static const char* const OutOfResourcesException =
81     "android/view/Surface$OutOfResourcesException";
82 
83 static struct {
84     jclass clazz;
85     jmethodID ctor;
86 } gIntegerClassInfo;
87 
toInteger(JNIEnv * env,int32_t i)88 static jobject toInteger(JNIEnv* env, int32_t i) {
89     return env->NewObject(gIntegerClassInfo.clazz, gIntegerClassInfo.ctor, i);
90 }
91 
92 static struct {
93     jclass clazz;
94     jmethodID run;
95 } gRunnableClassInfo;
96 
97 static struct {
98     jclass clazz;
99     jmethodID ctor;
100     jfieldID isInternal;
101     jfieldID density;
102     jfieldID secure;
103     jfieldID deviceProductInfo;
104     jfieldID installOrientation;
105 } gStaticDisplayInfoClassInfo;
106 
107 static struct {
108     jclass clazz;
109     jmethodID ctor;
110     jfieldID supportedDisplayModes;
111     jfieldID activeDisplayModeId;
112     jfieldID renderFrameRate;
113     jfieldID supportedColorModes;
114     jfieldID activeColorMode;
115     jfieldID hdrCapabilities;
116     jfieldID autoLowLatencyModeSupported;
117     jfieldID gameContentTypeSupported;
118     jfieldID preferredBootDisplayMode;
119 } gDynamicDisplayInfoClassInfo;
120 
121 static struct {
122     jclass clazz;
123     jmethodID ctor;
124     jfieldID id;
125     jfieldID width;
126     jfieldID height;
127     jfieldID xDpi;
128     jfieldID yDpi;
129     jfieldID refreshRate;
130     jfieldID appVsyncOffsetNanos;
131     jfieldID presentationDeadlineNanos;
132     jfieldID group;
133     jfieldID supportedHdrTypes;
134 } gDisplayModeClassInfo;
135 
136 // Implements SkMallocPixelRef::ReleaseProc, to delete the screenshot on unref.
DeleteScreenshot(void * addr,void * context)137 void DeleteScreenshot(void* addr, void* context) {
138     delete ((ScreenshotClient*) context);
139 }
140 
141 static struct {
142     nsecs_t UNDEFINED_TIME_NANO;
143     jmethodID init;
144 } gWindowContentFrameStatsClassInfo;
145 
146 static struct {
147     nsecs_t UNDEFINED_TIME_NANO;
148     jmethodID init;
149 } gWindowAnimationFrameStatsClassInfo;
150 
151 static struct {
152     jclass clazz;
153     jmethodID ctor;
154 } gHdrCapabilitiesClassInfo;
155 
156 static struct {
157     jclass clazz;
158     jmethodID ctor;
159 } gDeviceProductInfoClassInfo;
160 
161 static struct {
162     jclass clazz;
163     jmethodID ctor;
164 } gDeviceProductInfoManufactureDateClassInfo;
165 
166 static struct {
167     jclass clazz;
168     jmethodID ctor;
169 } gDisplayedContentSampleClassInfo;
170 
171 static struct {
172     jclass clazz;
173     jmethodID ctor;
174 } gDisplayedContentSamplingAttributesClassInfo;
175 
176 static struct {
177     jclass clazz;
178     jmethodID ctor;
179     jfieldID X;
180     jfieldID Y;
181     jfieldID Z;
182 } gCieXyzClassInfo;
183 
184 static struct {
185     jclass clazz;
186     jmethodID ctor;
187     jfieldID red;
188     jfieldID green;
189     jfieldID blue;
190     jfieldID white;
191 } gDisplayPrimariesClassInfo;
192 
193 static struct {
194     jclass clazz;
195     jmethodID ctor;
196     jfieldID min;
197     jfieldID max;
198 } gRefreshRateRangeClassInfo;
199 
200 static struct {
201     jclass clazz;
202     jmethodID ctor;
203     jfieldID physical;
204     jfieldID render;
205 } gRefreshRateRangesClassInfo;
206 
207 static struct {
208     jclass clazz;
209     jmethodID ctor;
210     jfieldID defaultMode;
211     jfieldID allowGroupSwitching;
212     jfieldID primaryRanges;
213     jfieldID appRequestRanges;
214 } gDesiredDisplayModeSpecsClassInfo;
215 
216 static struct {
217     jclass clazz;
218     jmethodID onJankDataAvailable;
219 } gJankDataListenerClassInfo;
220 
221 static struct {
222     jclass clazz;
223     jmethodID ctor;
224 } gJankDataClassInfo;
225 
226 static struct {
227     jclass clazz;
228     jmethodID onTransactionCommitted;
229 } gTransactionCommittedListenerClassInfo;
230 
231 static struct {
232     jclass clazz;
233     jmethodID ctor;
234     jfieldID format;
235     jfieldID alphaInterpretation;
236 } gDisplayDecorationSupportInfo;
237 
238 static struct {
239     jclass clazz;
240     jfieldID mNativeObject;
241 } gTransactionClassInfo;
242 
243 static struct {
244     jclass clazz;
245     jfieldID mNativeObject;
246     jmethodID invokeReleaseCallback;
247 } gSurfaceControlClassInfo;
248 
249 static struct {
250     jclass clazz;
251     jfieldID mMinAlpha;
252     jfieldID mMinFractionRendered;
253     jfieldID mStabilityRequirementMs;
254 } gTrustedPresentationThresholdsClassInfo;
255 
256 static struct {
257     jmethodID onTrustedPresentationChanged;
258 } gTrustedPresentationCallbackClassInfo;
259 
260 static struct {
261     jclass clazz;
262     jmethodID ctor;
263     jfieldID layerName;
264     jfieldID bufferId;
265     jfieldID frameNumber;
266 } gStalledTransactionInfoClassInfo;
267 
pickDataspaceFromColorMode(const ui::ColorMode colorMode)268 constexpr ui::Dataspace pickDataspaceFromColorMode(const ui::ColorMode colorMode) {
269     switch (colorMode) {
270         case ui::ColorMode::DISPLAY_P3:
271         case ui::ColorMode::BT2100_PQ:
272         case ui::ColorMode::BT2100_HLG:
273         case ui::ColorMode::DISPLAY_BT2020:
274             return ui::Dataspace::DISPLAY_P3;
275         default:
276             return ui::Dataspace::V0_SRGB;
277     }
278 }
279 
280 class TransactionCommittedListenerWrapper {
281 public:
TransactionCommittedListenerWrapper(JNIEnv * env,jobject object)282     explicit TransactionCommittedListenerWrapper(JNIEnv* env, jobject object) {
283         env->GetJavaVM(&mVm);
284         mTransactionCommittedListenerObject = env->NewGlobalRef(object);
285         LOG_ALWAYS_FATAL_IF(!mTransactionCommittedListenerObject, "Failed to make global ref");
286     }
287 
~TransactionCommittedListenerWrapper()288     ~TransactionCommittedListenerWrapper() {
289         getenv()->DeleteGlobalRef(mTransactionCommittedListenerObject);
290     }
291 
callback()292     void callback() {
293         JNIEnv* env = getenv();
294         env->CallVoidMethod(mTransactionCommittedListenerObject,
295                             gTransactionCommittedListenerClassInfo.onTransactionCommitted);
296         DieIfException(env, "Uncaught exception in TransactionCommittedListener.");
297     }
298 
transactionCallbackThunk(void * context,nsecs_t,const sp<Fence> &,const std::vector<SurfaceControlStats> &)299     static void transactionCallbackThunk(void* context, nsecs_t /*latchTime*/,
300                                          const sp<Fence>& /*presentFence*/,
301                                          const std::vector<SurfaceControlStats>& /*stats*/) {
302         TransactionCommittedListenerWrapper* listener =
303                 reinterpret_cast<TransactionCommittedListenerWrapper*>(context);
304         listener->callback();
305         delete listener;
306     }
307 
308 private:
309     jobject mTransactionCommittedListenerObject;
310     JavaVM* mVm;
311 
getenv()312     JNIEnv* getenv() {
313         JNIEnv* env;
314         mVm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6);
315         return env;
316     }
317 };
318 
319 class WindowInfosReportedListenerWrapper : public gui::BnWindowInfosReportedListener {
320 public:
WindowInfosReportedListenerWrapper(JNIEnv * env,jobject listener)321     explicit WindowInfosReportedListenerWrapper(JNIEnv* env, jobject listener) {
322         env->GetJavaVM(&mVm);
323         mListener = env->NewGlobalRef(listener);
324         LOG_ALWAYS_FATAL_IF(!mListener, "Failed to make global ref");
325     }
326 
~WindowInfosReportedListenerWrapper()327     ~WindowInfosReportedListenerWrapper() {
328         if (mListener) {
329             getenv()->DeleteGlobalRef(mListener);
330             mListener = nullptr;
331         }
332     }
333 
onWindowInfosReported()334     binder::Status onWindowInfosReported() override {
335         JNIEnv* env = getenv();
336         env->CallVoidMethod(mListener, gRunnableClassInfo.run);
337         DieIfException(env, "Uncaught exception in WindowInfosReportedListener.");
338         return binder::Status::ok();
339     }
340 
341 private:
342     jobject mListener;
343     JavaVM* mVm;
344 
getenv()345     JNIEnv* getenv() {
346         JNIEnv* env;
347         mVm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6);
348         return env;
349     }
350 };
351 
352 class TrustedPresentationCallbackWrapper {
353 public:
TrustedPresentationCallbackWrapper(JNIEnv * env,jobject trustedPresentationListener)354     explicit TrustedPresentationCallbackWrapper(JNIEnv* env, jobject trustedPresentationListener) {
355         env->GetJavaVM(&mVm);
356         mTrustedPresentationCallback = env->NewGlobalRef(trustedPresentationListener);
357         LOG_ALWAYS_FATAL_IF(!mTrustedPresentationCallback, "Failed to make global ref");
358     }
359 
~TrustedPresentationCallbackWrapper()360     ~TrustedPresentationCallbackWrapper() {
361         getenv()->DeleteGlobalRef(mTrustedPresentationCallback);
362     }
363 
onTrustedPresentationChanged(bool inTrustedPresentationState)364     void onTrustedPresentationChanged(bool inTrustedPresentationState) {
365         JNIEnv* env = getenv();
366         env->CallVoidMethod(mTrustedPresentationCallback,
367                             gTrustedPresentationCallbackClassInfo.onTrustedPresentationChanged,
368                             inTrustedPresentationState);
369         DieIfException(env, "Uncaught exception in TrustedPresentationCallback.");
370     }
371 
addCallbackRef(const sp<SurfaceComposerClient::PresentationCallbackRAII> & callbackRef)372     void addCallbackRef(const sp<SurfaceComposerClient::PresentationCallbackRAII>& callbackRef) {
373         mCallbackRef = callbackRef;
374     }
375 
onTrustedPresentationChangedThunk(void * context,bool inTrustedPresentationState)376     static void onTrustedPresentationChangedThunk(void* context, bool inTrustedPresentationState) {
377         TrustedPresentationCallbackWrapper* listener =
378                 reinterpret_cast<TrustedPresentationCallbackWrapper*>(context);
379         listener->onTrustedPresentationChanged(inTrustedPresentationState);
380     }
381 
382 private:
383     jobject mTrustedPresentationCallback;
384     JavaVM* mVm;
385     sp<SurfaceComposerClient::PresentationCallbackRAII> mCallbackRef;
386 
getenv()387     JNIEnv* getenv() {
388         JNIEnv* env;
389         mVm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6);
390         return env;
391     }
392 };
393 
394 // ----------------------------------------------------------------------------
395 
nativeCreateTransaction(JNIEnv * env,jclass clazz)396 static jlong nativeCreateTransaction(JNIEnv* env, jclass clazz) {
397     return reinterpret_cast<jlong>(new SurfaceComposerClient::Transaction);
398 }
399 
releaseTransaction(SurfaceComposerClient::Transaction * t)400 static void releaseTransaction(SurfaceComposerClient::Transaction* t) {
401     delete t;
402 }
403 
nativeGetNativeTransactionFinalizer(JNIEnv * env,jclass clazz)404 static jlong nativeGetNativeTransactionFinalizer(JNIEnv* env, jclass clazz) {
405     return static_cast<jlong>(reinterpret_cast<uintptr_t>(&releaseTransaction));
406 }
407 
nativeCreate(JNIEnv * env,jclass clazz,jobject sessionObj,jstring nameStr,jint w,jint h,jint format,jint flags,jlong parentObject,jobject metadataParcel)408 static jlong nativeCreate(JNIEnv* env, jclass clazz, jobject sessionObj,
409         jstring nameStr, jint w, jint h, jint format, jint flags, jlong parentObject,
410         jobject metadataParcel) {
411     ScopedUtfChars name(env, nameStr);
412     sp<SurfaceComposerClient> client;
413     if (sessionObj != NULL) {
414         client = android_view_SurfaceSession_getClient(env, sessionObj);
415     } else {
416         client = SurfaceComposerClient::getDefault();
417     }
418     SurfaceControl *parent = reinterpret_cast<SurfaceControl*>(parentObject);
419     sp<SurfaceControl> surface;
420     LayerMetadata metadata;
421     Parcel* parcel = parcelForJavaObject(env, metadataParcel);
422     if (parcel && !parcel->objectsCount()) {
423         status_t err = metadata.readFromParcel(parcel);
424         if (err != NO_ERROR) {
425           jniThrowException(env, "java/lang/IllegalArgumentException",
426                             "Metadata parcel has wrong format");
427         }
428     }
429 
430     sp<IBinder> parentHandle;
431     if (parent != nullptr) {
432         parentHandle = parent->getHandle();
433     }
434 
435     status_t err = client->createSurfaceChecked(String8(name.c_str()), w, h, format, &surface,
436                                                 flags, parentHandle, std::move(metadata));
437     if (err == NAME_NOT_FOUND) {
438         jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
439         return 0;
440     } else if (err != NO_ERROR) {
441         jniThrowException(env, OutOfResourcesException, statusToString(err).c_str());
442         return 0;
443     }
444 
445     surface->incStrong((void *)nativeCreate);
446     return reinterpret_cast<jlong>(surface.get());
447 }
448 
release(SurfaceControl * ctrl)449 static void release(SurfaceControl* ctrl) {
450     ctrl->decStrong((void *)nativeCreate);
451 }
452 
nativeGetNativeSurfaceControlFinalizer(JNIEnv * env,jclass clazz)453 static jlong nativeGetNativeSurfaceControlFinalizer(JNIEnv* env, jclass clazz) {
454     return static_cast<jlong>(reinterpret_cast<uintptr_t>(&release));
455 }
456 
nativeDisconnect(JNIEnv * env,jclass clazz,jlong nativeObject)457 static void nativeDisconnect(JNIEnv* env, jclass clazz, jlong nativeObject) {
458     SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
459     if (ctrl != NULL) {
460         ctrl->disconnect();
461     }
462 }
463 
nativeSetDefaultBufferSize(JNIEnv * env,jclass clazz,jlong nativeObject,jint width,jint height)464 static void nativeSetDefaultBufferSize(JNIEnv* env, jclass clazz, jlong nativeObject,
465                                        jint width, jint height) {
466     SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
467     if (ctrl != NULL) {
468         ctrl->updateDefaultBufferSize(width, height);
469     }
470 }
471 
nativeApplyTransaction(JNIEnv * env,jclass clazz,jlong transactionObj,jboolean sync)472 static void nativeApplyTransaction(JNIEnv* env, jclass clazz, jlong transactionObj, jboolean sync) {
473     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
474     transaction->apply(sync);
475 }
476 
nativeMergeTransaction(JNIEnv * env,jclass clazz,jlong transactionObj,jlong otherTransactionObj)477 static void nativeMergeTransaction(JNIEnv* env, jclass clazz,
478         jlong transactionObj, jlong otherTransactionObj) {
479     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
480     auto otherTransaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(
481             otherTransactionObj);
482     transaction->merge(std::move(*otherTransaction));
483 }
484 
nativeSetAnimationTransaction(JNIEnv * env,jclass clazz,jlong transactionObj)485 static void nativeSetAnimationTransaction(JNIEnv* env, jclass clazz, jlong transactionObj) {
486     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
487     transaction->setAnimationTransaction();
488 }
489 
nativeSetEarlyWakeupStart(JNIEnv * env,jclass clazz,jlong transactionObj)490 static void nativeSetEarlyWakeupStart(JNIEnv* env, jclass clazz, jlong transactionObj) {
491     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
492     transaction->setEarlyWakeupStart();
493 }
494 
nativeSetEarlyWakeupEnd(JNIEnv * env,jclass clazz,jlong transactionObj)495 static void nativeSetEarlyWakeupEnd(JNIEnv* env, jclass clazz, jlong transactionObj) {
496     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
497     transaction->setEarlyWakeupEnd();
498 }
499 
nativeGetTransactionId(JNIEnv * env,jclass clazz,jlong transactionObj)500 static jlong nativeGetTransactionId(JNIEnv* env, jclass clazz, jlong transactionObj) {
501     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
502     return transaction->getId();
503 }
504 
nativeSetLayer(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jint zorder)505 static void nativeSetLayer(JNIEnv* env, jclass clazz, jlong transactionObj,
506         jlong nativeObject, jint zorder) {
507     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
508 
509     SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
510     transaction->setLayer(ctrl, zorder);
511 }
512 
nativeSetRelativeLayer(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jlong relativeToObject,jint zorder)513 static void nativeSetRelativeLayer(JNIEnv* env, jclass clazz, jlong transactionObj,
514         jlong nativeObject,
515         jlong relativeToObject, jint zorder) {
516 
517     auto ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
518     auto relative = reinterpret_cast<SurfaceControl *>(relativeToObject);
519     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
520     transaction->setRelativeLayer(ctrl, relative, zorder);
521 }
522 
nativeSetPosition(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jfloat x,jfloat y)523 static void nativeSetPosition(JNIEnv* env, jclass clazz, jlong transactionObj,
524         jlong nativeObject, jfloat x, jfloat y) {
525     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
526 
527     SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
528     transaction->setPosition(ctrl, x, y);
529 }
530 
nativeSetScale(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jfloat xScale,jfloat yScale)531 static void nativeSetScale(JNIEnv* env, jclass clazz, jlong transactionObj, jlong nativeObject,
532                            jfloat xScale, jfloat yScale) {
533     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
534 
535     SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl*>(nativeObject);
536     transaction->setMatrix(ctrl, xScale, 0, 0, yScale);
537 }
538 
nativeSetGeometry(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jobject sourceObj,jobject dstObj,jlong orientation)539 static void nativeSetGeometry(JNIEnv* env, jclass clazz, jlong transactionObj, jlong nativeObject,
540         jobject sourceObj, jobject dstObj, jlong orientation) {
541     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
542     SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
543 
544     Rect source, dst;
545     if (sourceObj != NULL) {
546         source = JNICommon::rectFromObj(env, sourceObj);
547     } else {
548         source.makeInvalid();
549     }
550     if (dstObj != NULL) {
551         dst = JNICommon::rectFromObj(env, dstObj);
552     } else {
553         dst.makeInvalid();
554     }
555     transaction->setGeometry(ctrl, source, dst, orientation);
556 }
557 
558 class JGlobalRefHolder {
559 public:
JGlobalRefHolder(JavaVM * vm,jobject object)560     JGlobalRefHolder(JavaVM* vm, jobject object) : mVm(vm), mObject(object) {}
561 
~JGlobalRefHolder()562     virtual ~JGlobalRefHolder() {
563         env()->DeleteGlobalRef(mObject);
564         mObject = nullptr;
565     }
566 
object()567     jobject object() { return mObject; }
vm()568     JavaVM* vm() { return mVm; }
569 
env()570     JNIEnv* env() {
571         JNIEnv* env = nullptr;
572         if (mVm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
573             if (mVm->AttachCurrentThreadAsDaemon(&env, nullptr) != JNI_OK) {
574                 LOG_ALWAYS_FATAL("Failed to AttachCurrentThread!");
575             }
576         }
577         return env;
578     }
579 
580 private:
581     JGlobalRefHolder(const JGlobalRefHolder&) = delete;
582     void operator=(const JGlobalRefHolder&) = delete;
583 
584     JavaVM* mVm;
585     jobject mObject;
586 };
587 
genReleaseCallback(JNIEnv * env,jobject releaseCallback)588 static ReleaseBufferCallback genReleaseCallback(JNIEnv* env, jobject releaseCallback) {
589     if (releaseCallback == nullptr) return nullptr;
590 
591     JavaVM* vm = nullptr;
592     LOG_ALWAYS_FATAL_IF(env->GetJavaVM(&vm) != JNI_OK, "Unable to get Java VM");
593     auto globalCallbackRef =
594             std::make_shared<JGlobalRefHolder>(vm, env->NewGlobalRef(releaseCallback));
595     return [globalCallbackRef](const ReleaseCallbackId&, const sp<Fence>& releaseFence,
596                                std::optional<uint32_t> currentMaxAcquiredBufferCount) {
597         Fence* fenceCopy = releaseFence.get();
598         // We need to grab an extra ref as Java's SyncFence takes ownership
599         if (fenceCopy) {
600             fenceCopy->incStrong(0);
601         }
602         globalCallbackRef->env()
603                 ->CallStaticVoidMethod(gSurfaceControlClassInfo.clazz,
604                                        gSurfaceControlClassInfo.invokeReleaseCallback,
605                                        globalCallbackRef->object(),
606                                        reinterpret_cast<jlong>(fenceCopy));
607     };
608 }
609 
nativeSetBuffer(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jobject bufferObject,jlong fencePtr,jobject releaseCallback)610 static void nativeSetBuffer(JNIEnv* env, jclass clazz, jlong transactionObj, jlong nativeObject,
611                             jobject bufferObject, jlong fencePtr, jobject releaseCallback) {
612     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
613     SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl*>(nativeObject);
614     sp<GraphicBuffer> graphicBuffer;
615     if (bufferObject != nullptr) {
616         graphicBuffer = GraphicBuffer::fromAHardwareBuffer(
617                 android_hardware_HardwareBuffer_getNativeHardwareBuffer(env, bufferObject));
618     }
619     std::optional<sp<Fence>> optFence = std::nullopt;
620     if (fencePtr != 0) {
621         optFence = sp<Fence>{reinterpret_cast<Fence*>(fencePtr)};
622     }
623     transaction->setBuffer(ctrl, graphicBuffer, optFence, std::nullopt, 0 /* producerId */,
624                            genReleaseCallback(env, releaseCallback));
625 }
626 
nativeUnsetBuffer(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject)627 static void nativeUnsetBuffer(JNIEnv* env, jclass clazz, jlong transactionObj, jlong nativeObject) {
628     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
629     SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl*>(nativeObject);
630     transaction->unsetBuffer(ctrl);
631 }
632 
nativeSetBufferTransform(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jint transform)633 static void nativeSetBufferTransform(JNIEnv* env, jclass clazz, jlong transactionObj,
634                                      jlong nativeObject, jint transform) {
635     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
636     SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl*>(nativeObject);
637     transaction->setTransform(ctrl, transform);
638     bool transformToInverseDisplay = (NATIVE_WINDOW_TRANSFORM_INVERSE_DISPLAY & transform) ==
639             NATIVE_WINDOW_TRANSFORM_INVERSE_DISPLAY;
640     transaction->setTransformToDisplayInverse(ctrl, transformToInverseDisplay);
641 }
642 
nativeSetDataSpace(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jint dataSpace)643 static void nativeSetDataSpace(JNIEnv* env, jclass clazz, jlong transactionObj, jlong nativeObject,
644                                jint dataSpace) {
645     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
646     SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl*>(nativeObject);
647     ui::Dataspace dataspace = static_cast<ui::Dataspace>(dataSpace);
648     transaction->setDataspace(ctrl, dataspace);
649 }
650 
nativeSetExtendedRangeBrightness(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,float currentBufferRatio,float desiredRatio)651 static void nativeSetExtendedRangeBrightness(JNIEnv* env, jclass clazz, jlong transactionObj,
652                                              jlong nativeObject, float currentBufferRatio,
653                                              float desiredRatio) {
654     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
655     SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl*>(nativeObject);
656     transaction->setExtendedRangeBrightness(ctrl, currentBufferRatio, desiredRatio);
657 }
658 
nativeSetCachingHint(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jint cachingHint)659 static void nativeSetCachingHint(JNIEnv* env, jclass clazz, jlong transactionObj,
660                                  jlong nativeObject, jint cachingHint) {
661     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
662     SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl*>(nativeObject);
663     transaction->setCachingHint(ctrl, static_cast<gui::CachingHint>(cachingHint));
664 }
665 
nativeSetBlurRegions(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jobjectArray regions,jint regionsLength)666 static void nativeSetBlurRegions(JNIEnv* env, jclass clazz, jlong transactionObj,
667                                  jlong nativeObject, jobjectArray regions, jint regionsLength) {
668     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
669     SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl*>(nativeObject);
670 
671     std::vector<BlurRegion> blurRegionVector;
672     const int size = regionsLength;
673     float region[10];
674     for (int i = 0; i < size; i++) {
675         jfloatArray regionArray = (jfloatArray)env->GetObjectArrayElement(regions, i);
676         env->GetFloatArrayRegion(regionArray, 0, 10, region);
677         float blurRadius = region[0];
678         float alpha = region[1];
679         float left = region[2];
680         float top = region[3];
681         float right = region[4];
682         float bottom = region[5];
683         float cornerRadiusTL = region[6];
684         float cornerRadiusTR = region[7];
685         float cornerRadiusBL = region[8];
686         float cornerRadiusBR = region[9];
687 
688         blurRegionVector.push_back(BlurRegion{.blurRadius = static_cast<uint32_t>(blurRadius),
689                                               .cornerRadiusTL = cornerRadiusTL,
690                                               .cornerRadiusTR = cornerRadiusTR,
691                                               .cornerRadiusBL = cornerRadiusBL,
692                                               .cornerRadiusBR = cornerRadiusBR,
693                                               .alpha = alpha,
694                                               .left = static_cast<int>(left),
695                                               .top = static_cast<int>(top),
696                                               .right = static_cast<int>(right),
697                                               .bottom = static_cast<int>(bottom)});
698     }
699 
700     transaction->setBlurRegions(ctrl, blurRegionVector);
701 }
702 
nativeSetStretchEffect(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jfloat width,jfloat height,jfloat vecX,jfloat vecY,jfloat maxStretchAmountX,jfloat maxStretchAmountY,jfloat childRelativeLeft,jfloat childRelativeTop,jfloat childRelativeRight,jfloat childRelativeBottom)703 static void nativeSetStretchEffect(JNIEnv* env, jclass clazz, jlong transactionObj,
704                                    jlong nativeObject, jfloat width, jfloat height,
705                                    jfloat vecX, jfloat vecY,
706                                    jfloat maxStretchAmountX, jfloat maxStretchAmountY,
707                                    jfloat childRelativeLeft, jfloat childRelativeTop,
708                                    jfloat childRelativeRight, jfloat childRelativeBottom) {
709     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
710     auto* const ctrl = reinterpret_cast<SurfaceControl*>(nativeObject);
711     auto stretch = StretchEffect{
712       .width = width,
713       .height = height,
714       .vectorX = vecX,
715       .vectorY = vecY,
716       .maxAmountX = maxStretchAmountX,
717       .maxAmountY = maxStretchAmountY,
718       .mappedChildBounds = FloatRect(
719           childRelativeLeft, childRelativeTop, childRelativeRight, childRelativeBottom)
720     };
721     transaction->setStretchEffect(ctrl, stretch);
722 }
723 
nativeSetFlags(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jint flags,jint mask)724 static void nativeSetFlags(JNIEnv* env, jclass clazz, jlong transactionObj,
725         jlong nativeObject, jint flags, jint mask) {
726     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
727 
728     SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
729     transaction->setFlags(ctrl, flags, mask);
730 }
731 
nativeSetFrameRateSelectionPriority(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jint priority)732 static void nativeSetFrameRateSelectionPriority(JNIEnv* env, jclass clazz, jlong transactionObj,
733         jlong nativeObject, jint priority) {
734     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
735 
736     SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
737     transaction->setFrameRateSelectionPriority(ctrl, priority);
738 }
739 
nativeSetTransparentRegionHint(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jobject regionObj)740 static void nativeSetTransparentRegionHint(JNIEnv* env, jclass clazz, jlong transactionObj,
741         jlong nativeObject, jobject regionObj) {
742     SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
743     graphics::RegionIterator iterator(env, regionObj);
744     if (!iterator.isValid()) {
745         doThrowIAE(env);
746         return;
747     }
748 
749     ARect bounds = iterator.getTotalBounds();
750     Region reg({bounds.left, bounds.top, bounds.right, bounds.bottom});
751     if (iterator.isComplex()) {
752         while (!iterator.isDone()) {
753             ARect rect = iterator.getRect();
754             reg.addRectUnchecked(rect.left, rect.top, rect.right, rect.bottom);
755             iterator.next();
756         }
757     }
758 
759     {
760         auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
761         transaction->setTransparentRegionHint(ctrl, reg);
762     }
763 }
764 
nativeSetDamageRegion(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jobject regionObj)765 static void nativeSetDamageRegion(JNIEnv* env, jclass clazz, jlong transactionObj,
766                                   jlong nativeObject, jobject regionObj) {
767     SurfaceControl* const surfaceControl = reinterpret_cast<SurfaceControl*>(nativeObject);
768     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
769 
770     if (regionObj == nullptr) {
771         transaction->setSurfaceDamageRegion(surfaceControl, Region::INVALID_REGION);
772         return;
773     }
774 
775     graphics::RegionIterator iterator(env, regionObj);
776     if (!iterator.isValid()) {
777         transaction->setSurfaceDamageRegion(surfaceControl, Region::INVALID_REGION);
778         return;
779     }
780 
781     Region region;
782     while (!iterator.isDone()) {
783         ARect rect = iterator.getRect();
784         region.orSelf(static_cast<const Rect&>(rect));
785         iterator.next();
786     }
787 
788     if (region.getBounds().isEmpty()) {
789         transaction->setSurfaceDamageRegion(surfaceControl, Region::INVALID_REGION);
790         return;
791     }
792 
793     transaction->setSurfaceDamageRegion(surfaceControl, region);
794 }
795 
nativeSetDimmingEnabled(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jboolean dimmingEnabled)796 static void nativeSetDimmingEnabled(JNIEnv* env, jclass clazz, jlong transactionObj,
797                                     jlong nativeObject, jboolean dimmingEnabled) {
798     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
799 
800     SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl*>(nativeObject);
801     transaction->setDimmingEnabled(ctrl, dimmingEnabled);
802 }
803 
nativeSetAlpha(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jfloat alpha)804 static void nativeSetAlpha(JNIEnv* env, jclass clazz, jlong transactionObj,
805         jlong nativeObject, jfloat alpha) {
806     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
807 
808     SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
809     transaction->setAlpha(ctrl, alpha);
810 }
811 
nativeSetInputWindowInfo(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jobject inputWindow)812 static void nativeSetInputWindowInfo(JNIEnv* env, jclass clazz, jlong transactionObj,
813         jlong nativeObject, jobject inputWindow) {
814     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
815 
816     sp<NativeInputWindowHandle> handle = android_view_InputWindowHandle_getHandle(
817             env, inputWindow);
818     handle->updateInfo();
819 
820     auto ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
821     transaction->setInputWindowInfo(ctrl, *handle->getInfo());
822 }
823 
nativeAddWindowInfosReportedListener(JNIEnv * env,jclass clazz,jlong transactionObj,jobject runnable)824 static void nativeAddWindowInfosReportedListener(JNIEnv* env, jclass clazz, jlong transactionObj,
825                                                  jobject runnable) {
826     auto listener = sp<WindowInfosReportedListenerWrapper>::make(env, runnable);
827     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
828     transaction->addWindowInfosReportedListener(listener);
829 }
830 
nativeSetMetadata(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jint id,jobject parcelObj)831 static void nativeSetMetadata(JNIEnv* env, jclass clazz, jlong transactionObj,
832         jlong nativeObject, jint id, jobject parcelObj) {
833     Parcel* parcel = parcelForJavaObject(env, parcelObj);
834     if (!parcel) {
835         jniThrowNullPointerException(env, "attribute data");
836         return;
837     }
838     if (parcel->objectsCount()) {
839         jniThrowException(env, "java/lang/RuntimeException",
840                 "Tried to marshall a Parcel that contained Binder objects.");
841         return;
842     }
843 
844     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
845 
846     SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl*>(nativeObject);
847     transaction->setMetadata(ctrl, id, *parcel);
848 }
849 
nativeSetColor(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jfloatArray fColor)850 static void nativeSetColor(JNIEnv* env, jclass clazz, jlong transactionObj,
851         jlong nativeObject, jfloatArray fColor) {
852     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
853     SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
854 
855     float* floatColors = env->GetFloatArrayElements(fColor, 0);
856     half3 color(floatColors[0], floatColors[1], floatColors[2]);
857     transaction->setColor(ctrl, color);
858     env->ReleaseFloatArrayElements(fColor, floatColors, 0);
859 }
860 
nativeSetMatrix(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jfloat dsdx,jfloat dtdx,jfloat dtdy,jfloat dsdy)861 static void nativeSetMatrix(JNIEnv* env, jclass clazz, jlong transactionObj,
862         jlong nativeObject,
863         jfloat dsdx, jfloat dtdx, jfloat dtdy, jfloat dsdy) {
864     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
865 
866     SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
867     transaction->setMatrix(ctrl, dsdx, dtdx, dtdy, dsdy);
868 }
869 
nativeSetColorTransform(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jfloatArray fMatrix,jfloatArray fTranslation)870 static void nativeSetColorTransform(JNIEnv* env, jclass clazz, jlong transactionObj,
871         jlong nativeObject, jfloatArray fMatrix, jfloatArray fTranslation) {
872     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
873     SurfaceControl* const surfaceControl = reinterpret_cast<SurfaceControl*>(nativeObject);
874     float* floatMatrix = env->GetFloatArrayElements(fMatrix, 0);
875     mat3 matrix(static_cast<float const*>(floatMatrix));
876     env->ReleaseFloatArrayElements(fMatrix, floatMatrix, 0);
877 
878     float* floatTranslation = env->GetFloatArrayElements(fTranslation, 0);
879     vec3 translation(floatTranslation[0], floatTranslation[1], floatTranslation[2]);
880     env->ReleaseFloatArrayElements(fTranslation, floatTranslation, 0);
881 
882     transaction->setColorTransform(surfaceControl, matrix, translation);
883 }
884 
nativeSetColorSpaceAgnostic(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jboolean agnostic)885 static void nativeSetColorSpaceAgnostic(JNIEnv* env, jclass clazz, jlong transactionObj,
886         jlong nativeObject, jboolean agnostic) {
887     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
888     SurfaceControl* const surfaceControl = reinterpret_cast<SurfaceControl*>(nativeObject);
889     transaction->setColorSpaceAgnostic(surfaceControl, agnostic);
890 }
891 
nativeSetWindowCrop(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jint l,jint t,jint r,jint b)892 static void nativeSetWindowCrop(JNIEnv* env, jclass clazz, jlong transactionObj,
893         jlong nativeObject,
894         jint l, jint t, jint r, jint b) {
895     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
896 
897     SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
898     Rect crop(l, t, r, b);
899     transaction->setCrop(ctrl, crop);
900 }
901 
nativeSetCornerRadius(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jfloat cornerRadius)902 static void nativeSetCornerRadius(JNIEnv* env, jclass clazz, jlong transactionObj,
903          jlong nativeObject, jfloat cornerRadius) {
904     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
905 
906     SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
907     transaction->setCornerRadius(ctrl, cornerRadius);
908 }
909 
nativeSetBackgroundBlurRadius(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jint blurRadius)910 static void nativeSetBackgroundBlurRadius(JNIEnv* env, jclass clazz, jlong transactionObj,
911          jlong nativeObject, jint blurRadius) {
912     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
913 
914     SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
915     transaction->setBackgroundBlurRadius(ctrl, blurRadius);
916 }
917 
nativeSetLayerStack(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jint layerStack)918 static void nativeSetLayerStack(JNIEnv* env, jclass clazz, jlong transactionObj,
919         jlong nativeObject, jint layerStack) {
920     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
921 
922     SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
923     transaction->setLayerStack(ctrl, ui::LayerStack::fromValue(layerStack));
924 }
925 
nativeSetShadowRadius(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jfloat shadowRadius)926 static void nativeSetShadowRadius(JNIEnv* env, jclass clazz, jlong transactionObj,
927          jlong nativeObject, jfloat shadowRadius) {
928     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
929 
930     const auto ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
931     transaction->setShadowRadius(ctrl, shadowRadius);
932 }
933 
nativeSetTrustedOverlay(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jboolean isTrustedOverlay)934 static void nativeSetTrustedOverlay(JNIEnv* env, jclass clazz, jlong transactionObj,
935                                     jlong nativeObject, jboolean isTrustedOverlay) {
936     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
937 
938     SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
939     transaction->setTrustedOverlay(ctrl, isTrustedOverlay);
940 }
941 
nativeSetFrameRate(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jfloat frameRate,jint compatibility,jint changeFrameRateStrategy)942 static void nativeSetFrameRate(JNIEnv* env, jclass clazz, jlong transactionObj, jlong nativeObject,
943                                jfloat frameRate, jint compatibility, jint changeFrameRateStrategy) {
944     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
945 
946     const auto ctrl = reinterpret_cast<SurfaceControl*>(nativeObject);
947     // Our compatibility is a Surface.FRAME_RATE_COMPATIBILITY_* value, and
948     // Transaction::setFrameRate() takes an ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_* value. The
949     // values are identical though, so no need to convert anything.
950     transaction->setFrameRate(ctrl, frameRate, static_cast<int8_t>(compatibility),
951                               static_cast<int8_t>(changeFrameRateStrategy));
952 }
953 
nativeSetDefaultFrameRateCompatibility(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jint compatibility)954 static void nativeSetDefaultFrameRateCompatibility(JNIEnv* env, jclass clazz, jlong transactionObj,
955                                                    jlong nativeObject, jint compatibility) {
956     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
957 
958     const auto ctrl = reinterpret_cast<SurfaceControl*>(nativeObject);
959 
960     transaction->setDefaultFrameRateCompatibility(ctrl, static_cast<int8_t>(compatibility));
961 }
962 
nativeSetFixedTransformHint(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jint transformHint)963 static void nativeSetFixedTransformHint(JNIEnv* env, jclass clazz, jlong transactionObj,
964                                         jlong nativeObject, jint transformHint) {
965     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
966 
967     SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl*>(nativeObject);
968     transaction->setFixedTransformHint(ctrl, transformHint);
969 }
970 
nativeSetDropInputMode(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jint mode)971 static void nativeSetDropInputMode(JNIEnv* env, jclass clazz, jlong transactionObj,
972                                    jlong nativeObject, jint mode) {
973     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
974     SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl*>(nativeObject);
975     transaction->setDropInputMode(ctrl, static_cast<gui::DropInputMode>(mode));
976 }
977 
nativeSurfaceFlushJankData(JNIEnv * env,jclass clazz,jlong nativeObject)978 static void nativeSurfaceFlushJankData(JNIEnv* env, jclass clazz, jlong nativeObject) {
979     SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl*>(nativeObject);
980     SurfaceComposerClient::Transaction::sendSurfaceFlushJankDataTransaction(ctrl);
981 }
982 
nativeSanitize(JNIEnv * env,jclass clazz,jlong transactionObj,jint pid,jint uid)983 static void nativeSanitize(JNIEnv* env, jclass clazz, jlong transactionObj, jint pid, jint uid) {
984     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
985     transaction->sanitize(pid, uid);
986 }
987 
nativeSetDestinationFrame(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jint l,jint t,jint r,jint b)988 static void nativeSetDestinationFrame(JNIEnv* env, jclass clazz, jlong transactionObj,
989                                       jlong nativeObject, jint l, jint t, jint r, jint b) {
990     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
991     SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl*>(nativeObject);
992     Rect crop(l, t, r, b);
993     transaction->setDestinationFrame(ctrl, crop);
994 }
995 
nativeGetDisplayedContentSamplingAttributes(JNIEnv * env,jclass clazz,jobject tokenObj)996 static jobject nativeGetDisplayedContentSamplingAttributes(JNIEnv* env, jclass clazz,
997         jobject tokenObj) {
998     sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
999 
1000     ui::PixelFormat format;
1001     ui::Dataspace dataspace;
1002     uint8_t componentMask;
1003     status_t err = SurfaceComposerClient::getDisplayedContentSamplingAttributes(
1004             token, &format, &dataspace, &componentMask);
1005     if (err != OK) {
1006         return nullptr;
1007     }
1008     return env->NewObject(gDisplayedContentSamplingAttributesClassInfo.clazz,
1009                           gDisplayedContentSamplingAttributesClassInfo.ctor,
1010                           format, dataspace, componentMask);
1011 }
1012 
nativeSetDisplayedContentSamplingEnabled(JNIEnv * env,jclass clazz,jobject tokenObj,jboolean enable,jint componentMask,jint maxFrames)1013 static jboolean nativeSetDisplayedContentSamplingEnabled(JNIEnv* env, jclass clazz,
1014         jobject tokenObj, jboolean enable, jint componentMask, jint maxFrames) {
1015     sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
1016     status_t rc = SurfaceComposerClient::setDisplayContentSamplingEnabled(
1017             token, enable, componentMask, maxFrames);
1018     return rc == OK;
1019 }
1020 
nativeGetDisplayedContentSample(JNIEnv * env,jclass clazz,jobject tokenObj,jlong maxFrames,jlong timestamp)1021 static jobject nativeGetDisplayedContentSample(JNIEnv* env, jclass clazz, jobject tokenObj,
1022     jlong maxFrames, jlong timestamp) {
1023     sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
1024 
1025     DisplayedFrameStats stats;
1026     status_t err = SurfaceComposerClient::getDisplayedContentSample(
1027             token, maxFrames, timestamp, &stats);
1028     if (err != OK) {
1029         return nullptr;
1030     }
1031 
1032     jlongArray histogramComponent0 = env->NewLongArray(stats.component_0_sample.size());
1033     jlongArray histogramComponent1 = env->NewLongArray(stats.component_1_sample.size());
1034     jlongArray histogramComponent2 = env->NewLongArray(stats.component_2_sample.size());
1035     jlongArray histogramComponent3 = env->NewLongArray(stats.component_3_sample.size());
1036     if ((histogramComponent0 == nullptr) ||
1037         (histogramComponent1 == nullptr) ||
1038         (histogramComponent2 == nullptr) ||
1039         (histogramComponent3 == nullptr)) {
1040         return JNI_FALSE;
1041     }
1042 
1043     env->SetLongArrayRegion(histogramComponent0, 0,
1044             stats.component_0_sample.size(),
1045             reinterpret_cast<jlong*>(stats.component_0_sample.data()));
1046     env->SetLongArrayRegion(histogramComponent1, 0,
1047             stats.component_1_sample.size(),
1048             reinterpret_cast<jlong*>(stats.component_1_sample.data()));
1049     env->SetLongArrayRegion(histogramComponent2, 0,
1050             stats.component_2_sample.size(),
1051             reinterpret_cast<jlong*>(stats.component_2_sample.data()));
1052     env->SetLongArrayRegion(histogramComponent3, 0,
1053             stats.component_3_sample.size(),
1054             reinterpret_cast<jlong*>(stats.component_3_sample.data()));
1055     return env->NewObject(gDisplayedContentSampleClassInfo.clazz,
1056                           gDisplayedContentSampleClassInfo.ctor,
1057                           stats.numFrames,
1058                           histogramComponent0,
1059                           histogramComponent1,
1060                           histogramComponent2,
1061                           histogramComponent3);
1062 }
1063 
nativeSetDisplaySurface(JNIEnv * env,jclass clazz,jlong transactionObj,jobject tokenObj,jlong nativeSurfaceObject)1064 static void nativeSetDisplaySurface(JNIEnv* env, jclass clazz,
1065         jlong transactionObj,
1066         jobject tokenObj, jlong nativeSurfaceObject) {
1067     sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
1068     if (token == NULL) return;
1069     sp<IGraphicBufferProducer> bufferProducer;
1070     sp<Surface> sur(reinterpret_cast<Surface *>(nativeSurfaceObject));
1071     if (sur != NULL) {
1072         bufferProducer = sur->getIGraphicBufferProducer();
1073     }
1074 
1075 
1076     status_t err = NO_ERROR;
1077     {
1078         auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
1079         err = transaction->setDisplaySurface(token,
1080                 bufferProducer);
1081     }
1082     if (err != NO_ERROR) {
1083         doThrowIAE(env, "Illegal Surface, could not enable async mode. Was this"
1084                 " Surface created with singleBufferMode?");
1085     }
1086 }
1087 
nativeSetDisplayLayerStack(JNIEnv * env,jclass clazz,jlong transactionObj,jobject tokenObj,jint layerStack)1088 static void nativeSetDisplayLayerStack(JNIEnv* env, jclass clazz,
1089         jlong transactionObj,
1090         jobject tokenObj, jint layerStack) {
1091 
1092     sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
1093     if (token == NULL) return;
1094 
1095     {
1096         auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
1097         transaction->setDisplayLayerStack(token, ui::LayerStack::fromValue(layerStack));
1098     }
1099 }
1100 
nativeSetDisplayFlags(JNIEnv * env,jclass clazz,jlong transactionObj,jobject tokenObj,jint flags)1101 static void nativeSetDisplayFlags(JNIEnv* env, jclass clazz, jlong transactionObj, jobject tokenObj,
1102                                   jint flags) {
1103     sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
1104     if (token == NULL) return;
1105 
1106     {
1107         auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
1108         transaction->setDisplayFlags(token, flags);
1109     }
1110 }
1111 
nativeSetDisplayProjection(JNIEnv * env,jclass clazz,jlong transactionObj,jobject tokenObj,jint orientation,jint layerStackRect_left,jint layerStackRect_top,jint layerStackRect_right,jint layerStackRect_bottom,jint displayRect_left,jint displayRect_top,jint displayRect_right,jint displayRect_bottom)1112 static void nativeSetDisplayProjection(JNIEnv* env, jclass clazz,
1113         jlong transactionObj,
1114         jobject tokenObj, jint orientation,
1115         jint layerStackRect_left, jint layerStackRect_top, jint layerStackRect_right, jint layerStackRect_bottom,
1116         jint displayRect_left, jint displayRect_top, jint displayRect_right, jint displayRect_bottom) {
1117     sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
1118     if (token == NULL) return;
1119     Rect layerStackRect(layerStackRect_left, layerStackRect_top, layerStackRect_right, layerStackRect_bottom);
1120     Rect displayRect(displayRect_left, displayRect_top, displayRect_right, displayRect_bottom);
1121 
1122     {
1123         auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
1124         transaction->setDisplayProjection(token, static_cast<ui::Rotation>(orientation),
1125                                           layerStackRect, displayRect);
1126     }
1127 }
1128 
nativeSetDisplaySize(JNIEnv * env,jclass clazz,jlong transactionObj,jobject tokenObj,jint width,jint height)1129 static void nativeSetDisplaySize(JNIEnv* env, jclass clazz,
1130         jlong transactionObj,
1131         jobject tokenObj, jint width, jint height) {
1132     sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
1133     if (token == NULL) return;
1134 
1135     {
1136         auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
1137         transaction->setDisplaySize(token, width, height);
1138     }
1139 }
1140 
convertDeviceProductInfoToJavaObject(JNIEnv * env,const std::optional<DeviceProductInfo> & info)1141 static jobject convertDeviceProductInfoToJavaObject(
1142         JNIEnv* env, const std::optional<DeviceProductInfo>& info) {
1143     using ModelYear = android::DeviceProductInfo::ModelYear;
1144     using ManufactureYear = android::DeviceProductInfo::ManufactureYear;
1145     using ManufactureWeekAndYear = android::DeviceProductInfo::ManufactureWeekAndYear;
1146 
1147     if (!info) return nullptr;
1148     jstring name = env->NewStringUTF(info->name.data());
1149     jstring manufacturerPnpId = env->NewStringUTF(info->manufacturerPnpId.data());
1150     jobject productId = env->NewStringUTF(info->productId.data());
1151     const auto& date = info->manufactureOrModelDate;
1152     jobject modelYear, manufactureDate;
1153     if (const auto* model = std::get_if<ModelYear>(&date)) {
1154         modelYear = toInteger(env, model->year);
1155         manufactureDate = nullptr;
1156     } else if (const auto* manufactureWeekAndYear = std::get_if<ManufactureWeekAndYear>(&date)) {
1157         modelYear = nullptr;
1158         manufactureDate = env->NewObject(gDeviceProductInfoManufactureDateClassInfo.clazz,
1159                                                gDeviceProductInfoManufactureDateClassInfo.ctor,
1160                                                toInteger(env, manufactureWeekAndYear->week),
1161                                                toInteger(env, manufactureWeekAndYear->year));
1162     } else if (const auto* manufactureYear = std::get_if<ManufactureYear>(&date)) {
1163         modelYear = nullptr;
1164         manufactureDate = env->NewObject(gDeviceProductInfoManufactureDateClassInfo.clazz,
1165                                        gDeviceProductInfoManufactureDateClassInfo.ctor,
1166                                        nullptr,
1167                                        toInteger(env, manufactureYear->year));
1168     } else {
1169         LOG_FATAL("Unknown alternative for variant DeviceProductInfo::ManufactureOrModelDate");
1170     }
1171     jint connectionToSinkType;
1172     // Relative address maps to HDMI physical address. All addresses are 4 digits long allowing
1173     // for a 5–device-deep hierarchy. For more information, refer:
1174     // Section 8.7 - Physical Address of HDMI Specification Version 1.3a
1175     using android::hardware::display::IDeviceProductInfoConstants;
1176     if (info->relativeAddress.size() != 4) {
1177         connectionToSinkType = IDeviceProductInfoConstants::CONNECTION_TO_SINK_UNKNOWN;
1178     } else if (info->relativeAddress[0] == 0) {
1179         connectionToSinkType = IDeviceProductInfoConstants::CONNECTION_TO_SINK_BUILT_IN;
1180     } else if (info->relativeAddress[1] == 0) {
1181         connectionToSinkType = IDeviceProductInfoConstants::CONNECTION_TO_SINK_DIRECT;
1182     } else {
1183         connectionToSinkType = IDeviceProductInfoConstants::CONNECTION_TO_SINK_TRANSITIVE;
1184     }
1185 
1186     return env->NewObject(gDeviceProductInfoClassInfo.clazz, gDeviceProductInfoClassInfo.ctor, name,
1187                           manufacturerPnpId, productId, modelYear, manufactureDate,
1188                           connectionToSinkType);
1189 }
1190 
nativeGetStaticDisplayInfo(JNIEnv * env,jclass clazz,jlong id)1191 static jobject nativeGetStaticDisplayInfo(JNIEnv* env, jclass clazz, jlong id) {
1192     ui::StaticDisplayInfo info;
1193     if (SurfaceComposerClient::getStaticDisplayInfo(id, &info) != NO_ERROR) {
1194         return nullptr;
1195     }
1196 
1197     jobject object =
1198             env->NewObject(gStaticDisplayInfoClassInfo.clazz, gStaticDisplayInfoClassInfo.ctor);
1199     env->SetBooleanField(object, gStaticDisplayInfoClassInfo.isInternal,
1200                          info.connectionType == ui::DisplayConnectionType::Internal);
1201     env->SetFloatField(object, gStaticDisplayInfoClassInfo.density, info.density);
1202     env->SetBooleanField(object, gStaticDisplayInfoClassInfo.secure, info.secure);
1203     env->SetObjectField(object, gStaticDisplayInfoClassInfo.deviceProductInfo,
1204                         convertDeviceProductInfoToJavaObject(env, info.deviceProductInfo));
1205     env->SetIntField(object, gStaticDisplayInfoClassInfo.installOrientation,
1206                      static_cast<uint32_t>(info.installOrientation));
1207     return object;
1208 }
1209 
convertDisplayModeToJavaObject(JNIEnv * env,const ui::DisplayMode & config)1210 static jobject convertDisplayModeToJavaObject(JNIEnv* env, const ui::DisplayMode& config) {
1211     jobject object = env->NewObject(gDisplayModeClassInfo.clazz, gDisplayModeClassInfo.ctor);
1212     env->SetIntField(object, gDisplayModeClassInfo.id, config.id);
1213     env->SetIntField(object, gDisplayModeClassInfo.width, config.resolution.getWidth());
1214     env->SetIntField(object, gDisplayModeClassInfo.height, config.resolution.getHeight());
1215     env->SetFloatField(object, gDisplayModeClassInfo.xDpi, config.xDpi);
1216     env->SetFloatField(object, gDisplayModeClassInfo.yDpi, config.yDpi);
1217 
1218     env->SetFloatField(object, gDisplayModeClassInfo.refreshRate, config.refreshRate);
1219     env->SetLongField(object, gDisplayModeClassInfo.appVsyncOffsetNanos, config.appVsyncOffset);
1220     env->SetLongField(object, gDisplayModeClassInfo.presentationDeadlineNanos,
1221                       config.presentationDeadline);
1222     env->SetIntField(object, gDisplayModeClassInfo.group, config.group);
1223 
1224     const auto& types = config.supportedHdrTypes;
1225     std::vector<jint> intTypes;
1226     for (auto type : types) {
1227         intTypes.push_back(static_cast<jint>(type));
1228     }
1229     auto typesArray = env->NewIntArray(types.size());
1230     env->SetIntArrayRegion(typesArray, 0, intTypes.size(), intTypes.data());
1231     env->SetObjectField(object, gDisplayModeClassInfo.supportedHdrTypes, typesArray);
1232 
1233     return object;
1234 }
1235 
convertHdrCapabilitiesToJavaObject(JNIEnv * env,const HdrCapabilities & capabilities)1236 jobject convertHdrCapabilitiesToJavaObject(JNIEnv* env, const HdrCapabilities& capabilities) {
1237     const auto& types = capabilities.getSupportedHdrTypes();
1238     std::vector<int32_t> intTypes;
1239     for (auto type : types) {
1240         intTypes.push_back(static_cast<int32_t>(type));
1241     }
1242     auto typesArray = env->NewIntArray(types.size());
1243     env->SetIntArrayRegion(typesArray, 0, intTypes.size(), intTypes.data());
1244 
1245     return env->NewObject(gHdrCapabilitiesClassInfo.clazz, gHdrCapabilitiesClassInfo.ctor,
1246                           typesArray, capabilities.getDesiredMaxLuminance(),
1247                           capabilities.getDesiredMaxAverageLuminance(),
1248                           capabilities.getDesiredMinLuminance());
1249 }
1250 
nativeGetDynamicDisplayInfo(JNIEnv * env,jclass clazz,jlong displayId)1251 static jobject nativeGetDynamicDisplayInfo(JNIEnv* env, jclass clazz, jlong displayId) {
1252     ui::DynamicDisplayInfo info;
1253     if (SurfaceComposerClient::getDynamicDisplayInfoFromId(displayId, &info) != NO_ERROR) {
1254         return nullptr;
1255     }
1256 
1257     jobject object =
1258             env->NewObject(gDynamicDisplayInfoClassInfo.clazz, gDynamicDisplayInfoClassInfo.ctor);
1259     if (object == NULL) {
1260         jniThrowException(env, "java/lang/OutOfMemoryError", NULL);
1261         return NULL;
1262     }
1263 
1264     const auto numModes = info.supportedDisplayModes.size();
1265     jobjectArray modesArray = env->NewObjectArray(numModes, gDisplayModeClassInfo.clazz, nullptr);
1266     for (size_t i = 0; i < numModes; i++) {
1267         const ui::DisplayMode& mode = info.supportedDisplayModes[i];
1268         jobject displayModeObj = convertDisplayModeToJavaObject(env, mode);
1269         env->SetObjectArrayElement(modesArray, static_cast<jsize>(i), displayModeObj);
1270         env->DeleteLocalRef(displayModeObj);
1271     }
1272     env->SetObjectField(object, gDynamicDisplayInfoClassInfo.supportedDisplayModes, modesArray);
1273     env->SetIntField(object, gDynamicDisplayInfoClassInfo.activeDisplayModeId,
1274                      info.activeDisplayModeId);
1275     env->SetFloatField(object, gDynamicDisplayInfoClassInfo.renderFrameRate, info.renderFrameRate);
1276 
1277     jintArray colorModesArray = env->NewIntArray(info.supportedColorModes.size());
1278     if (colorModesArray == NULL) {
1279         jniThrowException(env, "java/lang/OutOfMemoryError", NULL);
1280         return NULL;
1281     }
1282     jint* colorModesArrayValues = env->GetIntArrayElements(colorModesArray, 0);
1283     for (size_t i = 0; i < info.supportedColorModes.size(); i++) {
1284         colorModesArrayValues[i] = static_cast<jint>(info.supportedColorModes[i]);
1285     }
1286     env->ReleaseIntArrayElements(colorModesArray, colorModesArrayValues, 0);
1287     env->SetObjectField(object, gDynamicDisplayInfoClassInfo.supportedColorModes, colorModesArray);
1288 
1289     env->SetIntField(object, gDynamicDisplayInfoClassInfo.activeColorMode,
1290                      static_cast<jint>(info.activeColorMode));
1291 
1292     env->SetObjectField(object, gDynamicDisplayInfoClassInfo.hdrCapabilities,
1293                         convertHdrCapabilitiesToJavaObject(env, info.hdrCapabilities));
1294 
1295     env->SetBooleanField(object, gDynamicDisplayInfoClassInfo.autoLowLatencyModeSupported,
1296                          info.autoLowLatencyModeSupported);
1297 
1298     env->SetBooleanField(object, gDynamicDisplayInfoClassInfo.gameContentTypeSupported,
1299                          info.gameContentTypeSupported);
1300 
1301     env->SetIntField(object, gDynamicDisplayInfoClassInfo.preferredBootDisplayMode,
1302                      info.preferredBootDisplayMode);
1303     return object;
1304 }
1305 
nativeSetDesiredDisplayModeSpecs(JNIEnv * env,jclass clazz,jobject tokenObj,jobject DesiredDisplayModeSpecs)1306 static jboolean nativeSetDesiredDisplayModeSpecs(JNIEnv* env, jclass clazz, jobject tokenObj,
1307                                                  jobject DesiredDisplayModeSpecs) {
1308     sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
1309     if (token == nullptr) return JNI_FALSE;
1310 
1311     const auto makeRanges = [env](jobject obj) {
1312         const auto makeRange = [env](jobject obj) {
1313             gui::DisplayModeSpecs::RefreshRateRanges::RefreshRateRange range;
1314             range.min = env->GetFloatField(obj, gRefreshRateRangeClassInfo.min);
1315             range.max = env->GetFloatField(obj, gRefreshRateRangeClassInfo.max);
1316             return range;
1317         };
1318 
1319         gui::DisplayModeSpecs::RefreshRateRanges ranges;
1320         ranges.physical = makeRange(env->GetObjectField(obj, gRefreshRateRangesClassInfo.physical));
1321         ranges.render = makeRange(env->GetObjectField(obj, gRefreshRateRangesClassInfo.render));
1322         return ranges;
1323     };
1324 
1325     gui::DisplayModeSpecs specs;
1326     specs.defaultMode = env->GetIntField(DesiredDisplayModeSpecs,
1327                                          gDesiredDisplayModeSpecsClassInfo.defaultMode);
1328     specs.allowGroupSwitching =
1329             env->GetBooleanField(DesiredDisplayModeSpecs,
1330                                  gDesiredDisplayModeSpecsClassInfo.allowGroupSwitching);
1331 
1332     specs.primaryRanges =
1333             makeRanges(env->GetObjectField(DesiredDisplayModeSpecs,
1334                                            gDesiredDisplayModeSpecsClassInfo.primaryRanges));
1335     specs.appRequestRanges =
1336             makeRanges(env->GetObjectField(DesiredDisplayModeSpecs,
1337                                            gDesiredDisplayModeSpecsClassInfo.appRequestRanges));
1338 
1339     size_t result = SurfaceComposerClient::setDesiredDisplayModeSpecs(token, specs);
1340     return result == NO_ERROR ? JNI_TRUE : JNI_FALSE;
1341 }
1342 
nativeGetDesiredDisplayModeSpecs(JNIEnv * env,jclass clazz,jobject tokenObj)1343 static jobject nativeGetDesiredDisplayModeSpecs(JNIEnv* env, jclass clazz, jobject tokenObj) {
1344     sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
1345     if (token == nullptr) return nullptr;
1346 
1347     const auto rangesToJava = [env](const gui::DisplayModeSpecs::RefreshRateRanges& ranges) {
1348         const auto rangeToJava =
1349                 [env](const gui::DisplayModeSpecs::RefreshRateRanges::RefreshRateRange& range) {
1350                     return env->NewObject(gRefreshRateRangeClassInfo.clazz,
1351                                           gRefreshRateRangeClassInfo.ctor, range.min, range.max);
1352                 };
1353 
1354         return env->NewObject(gRefreshRateRangesClassInfo.clazz, gRefreshRateRangesClassInfo.ctor,
1355                               rangeToJava(ranges.physical), rangeToJava(ranges.render));
1356     };
1357 
1358     gui::DisplayModeSpecs specs;
1359     if (SurfaceComposerClient::getDesiredDisplayModeSpecs(token, &specs) != NO_ERROR) {
1360         return nullptr;
1361     }
1362 
1363     return env->NewObject(gDesiredDisplayModeSpecsClassInfo.clazz,
1364                           gDesiredDisplayModeSpecsClassInfo.ctor, specs.defaultMode,
1365                           specs.allowGroupSwitching, rangesToJava(specs.primaryRanges),
1366                           rangesToJava(specs.appRequestRanges));
1367 }
1368 
nativeGetDisplayNativePrimaries(JNIEnv * env,jclass,jobject tokenObj)1369 static jobject nativeGetDisplayNativePrimaries(JNIEnv* env, jclass, jobject tokenObj) {
1370     sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
1371     if (token == NULL) return NULL;
1372 
1373     ui::DisplayPrimaries primaries;
1374     if (SurfaceComposerClient::getDisplayNativePrimaries(token, primaries) != NO_ERROR) {
1375         return NULL;
1376     }
1377 
1378     jobject jred = env->NewObject(gCieXyzClassInfo.clazz, gCieXyzClassInfo.ctor);
1379     if (jred == NULL) {
1380         jniThrowException(env, "java/lang/OutOfMemoryError", NULL);
1381         return NULL;
1382     }
1383 
1384     jobject jgreen = env->NewObject(gCieXyzClassInfo.clazz, gCieXyzClassInfo.ctor);
1385     if (jgreen == NULL) {
1386         jniThrowException(env, "java/lang/OutOfMemoryError", NULL);
1387         return NULL;
1388     }
1389 
1390     jobject jblue = env->NewObject(gCieXyzClassInfo.clazz, gCieXyzClassInfo.ctor);
1391     if (jblue == NULL) {
1392         jniThrowException(env, "java/lang/OutOfMemoryError", NULL);
1393         return NULL;
1394     }
1395 
1396     jobject jwhite = env->NewObject(gCieXyzClassInfo.clazz, gCieXyzClassInfo.ctor);
1397     if (jwhite == NULL) {
1398         jniThrowException(env, "java/lang/OutOfMemoryError", NULL);
1399         return NULL;
1400     }
1401 
1402     jobject jprimaries = env->NewObject(gDisplayPrimariesClassInfo.clazz,
1403             gDisplayPrimariesClassInfo.ctor);
1404     if (jprimaries == NULL) {
1405         jniThrowException(env, "java/lang/OutOfMemoryError", NULL);
1406         return NULL;
1407     }
1408 
1409     env->SetFloatField(jred, gCieXyzClassInfo.X, primaries.red.X);
1410     env->SetFloatField(jred, gCieXyzClassInfo.Y, primaries.red.Y);
1411     env->SetFloatField(jred, gCieXyzClassInfo.Z, primaries.red.Z);
1412     env->SetFloatField(jgreen, gCieXyzClassInfo.X, primaries.green.X);
1413     env->SetFloatField(jgreen, gCieXyzClassInfo.Y, primaries.green.Y);
1414     env->SetFloatField(jgreen, gCieXyzClassInfo.Z, primaries.green.Z);
1415     env->SetFloatField(jblue, gCieXyzClassInfo.X, primaries.blue.X);
1416     env->SetFloatField(jblue, gCieXyzClassInfo.Y, primaries.blue.Y);
1417     env->SetFloatField(jblue, gCieXyzClassInfo.Z, primaries.blue.Z);
1418     env->SetFloatField(jwhite, gCieXyzClassInfo.X, primaries.white.X);
1419     env->SetFloatField(jwhite, gCieXyzClassInfo.Y, primaries.white.Y);
1420     env->SetFloatField(jwhite, gCieXyzClassInfo.Z, primaries.white.Z);
1421     env->SetObjectField(jprimaries, gDisplayPrimariesClassInfo.red, jred);
1422     env->SetObjectField(jprimaries, gDisplayPrimariesClassInfo.green, jgreen);
1423     env->SetObjectField(jprimaries, gDisplayPrimariesClassInfo.blue, jblue);
1424     env->SetObjectField(jprimaries, gDisplayPrimariesClassInfo.white, jwhite);
1425 
1426     return jprimaries;
1427 }
1428 
nativeGetCompositionDataspaces(JNIEnv * env,jclass)1429 static jintArray nativeGetCompositionDataspaces(JNIEnv* env, jclass) {
1430     ui::Dataspace defaultDataspace, wcgDataspace;
1431     ui::PixelFormat defaultPixelFormat, wcgPixelFormat;
1432     if (SurfaceComposerClient::getCompositionPreference(&defaultDataspace,
1433                                                         &defaultPixelFormat,
1434                                                         &wcgDataspace,
1435                                                         &wcgPixelFormat) != NO_ERROR) {
1436         return nullptr;
1437     }
1438     jintArray array = env->NewIntArray(2);
1439     if (array == nullptr) {
1440         jniThrowException(env, "java/lang/OutOfMemoryError", nullptr);
1441         return nullptr;
1442     }
1443     jint* arrayValues = env->GetIntArrayElements(array, 0);
1444     arrayValues[0] = static_cast<jint>(defaultDataspace);
1445     arrayValues[1] = static_cast<jint>(wcgDataspace);
1446     env->ReleaseIntArrayElements(array, arrayValues, 0);
1447     return array;
1448 }
1449 
nativeGetOverlaySupport(JNIEnv * env,jclass)1450 static jobject nativeGetOverlaySupport(JNIEnv* env, jclass) {
1451     gui::OverlayProperties* overlayProperties = new gui::OverlayProperties;
1452     if (SurfaceComposerClient::getOverlaySupport(overlayProperties) != NO_ERROR) {
1453         delete overlayProperties;
1454         return nullptr;
1455     }
1456     return android_hardware_OverlayProperties_convertToJavaObject(env, overlayProperties);
1457 }
1458 
nativeSetActiveColorMode(JNIEnv * env,jclass,jobject tokenObj,jint colorMode)1459 static jboolean nativeSetActiveColorMode(JNIEnv* env, jclass,
1460         jobject tokenObj, jint colorMode) {
1461     sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
1462     if (token == NULL) return JNI_FALSE;
1463     status_t err = SurfaceComposerClient::setActiveColorMode(token,
1464             static_cast<ui::ColorMode>(colorMode));
1465     return err == NO_ERROR ? JNI_TRUE : JNI_FALSE;
1466 }
1467 
nativeSetDisplayPowerMode(JNIEnv * env,jclass clazz,jobject tokenObj,jint mode)1468 static void nativeSetDisplayPowerMode(JNIEnv* env, jclass clazz, jobject tokenObj, jint mode) {
1469     sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
1470     if (token == NULL) return;
1471 
1472     android::base::Timer t;
1473     SurfaceComposerClient::setDisplayPowerMode(token, mode);
1474     if (t.duration() > 100ms) ALOGD("Excessive delay in setPowerMode()");
1475 }
1476 
nativeGetProtectedContentSupport(JNIEnv * env,jclass)1477 static jboolean nativeGetProtectedContentSupport(JNIEnv* env, jclass) {
1478     return static_cast<jboolean>(SurfaceComposerClient::getProtectedContentSupport());
1479 }
1480 
nativeClearContentFrameStats(JNIEnv * env,jclass clazz,jlong nativeObject)1481 static jboolean nativeClearContentFrameStats(JNIEnv* env, jclass clazz, jlong nativeObject) {
1482     SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
1483     status_t err = ctrl->clearLayerFrameStats();
1484 
1485     if (err < 0 && err != NO_INIT) {
1486         doThrowIAE(env);
1487     }
1488 
1489     // The other end is not ready, just report we failed.
1490     if (err == NO_INIT) {
1491         return JNI_FALSE;
1492     }
1493 
1494     return JNI_TRUE;
1495 }
1496 
nativeGetContentFrameStats(JNIEnv * env,jclass clazz,jlong nativeObject,jobject outStats)1497 static jboolean nativeGetContentFrameStats(JNIEnv* env, jclass clazz, jlong nativeObject,
1498     jobject outStats) {
1499     FrameStats stats;
1500 
1501     SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
1502     status_t err = ctrl->getLayerFrameStats(&stats);
1503     if (err < 0 && err != NO_INIT) {
1504         doThrowIAE(env);
1505     }
1506 
1507     // The other end is not ready, fine just return empty stats.
1508     if (err == NO_INIT) {
1509         return JNI_FALSE;
1510     }
1511 
1512     jlong refreshPeriodNano = static_cast<jlong>(stats.refreshPeriodNano);
1513     size_t frameCount = stats.desiredPresentTimesNano.size();
1514 
1515     jlongArray postedTimesNanoDst = env->NewLongArray(frameCount);
1516     if (postedTimesNanoDst == NULL) {
1517         return JNI_FALSE;
1518     }
1519 
1520     jlongArray presentedTimesNanoDst = env->NewLongArray(frameCount);
1521     if (presentedTimesNanoDst == NULL) {
1522         return JNI_FALSE;
1523     }
1524 
1525     jlongArray readyTimesNanoDst = env->NewLongArray(frameCount);
1526     if (readyTimesNanoDst == NULL) {
1527         return JNI_FALSE;
1528     }
1529 
1530     nsecs_t postedTimesNanoSrc[frameCount];
1531     nsecs_t presentedTimesNanoSrc[frameCount];
1532     nsecs_t readyTimesNanoSrc[frameCount];
1533 
1534     for (size_t i = 0; i < frameCount; i++) {
1535         nsecs_t postedTimeNano = stats.desiredPresentTimesNano[i];
1536         if (postedTimeNano == INT64_MAX) {
1537             postedTimeNano = gWindowContentFrameStatsClassInfo.UNDEFINED_TIME_NANO;
1538         }
1539         postedTimesNanoSrc[i] = postedTimeNano;
1540 
1541         nsecs_t presentedTimeNano = stats.actualPresentTimesNano[i];
1542         if (presentedTimeNano == INT64_MAX) {
1543             presentedTimeNano = gWindowContentFrameStatsClassInfo.UNDEFINED_TIME_NANO;
1544         }
1545         presentedTimesNanoSrc[i] = presentedTimeNano;
1546 
1547         nsecs_t readyTimeNano = stats.frameReadyTimesNano[i];
1548         if (readyTimeNano == INT64_MAX) {
1549             readyTimeNano = gWindowContentFrameStatsClassInfo.UNDEFINED_TIME_NANO;
1550         }
1551         readyTimesNanoSrc[i] = readyTimeNano;
1552     }
1553 
1554     env->SetLongArrayRegion(postedTimesNanoDst, 0, frameCount, postedTimesNanoSrc);
1555     env->SetLongArrayRegion(presentedTimesNanoDst, 0, frameCount, presentedTimesNanoSrc);
1556     env->SetLongArrayRegion(readyTimesNanoDst, 0, frameCount, readyTimesNanoSrc);
1557 
1558     env->CallVoidMethod(outStats, gWindowContentFrameStatsClassInfo.init, refreshPeriodNano,
1559             postedTimesNanoDst, presentedTimesNanoDst, readyTimesNanoDst);
1560 
1561     if (env->ExceptionCheck()) {
1562         return JNI_FALSE;
1563     }
1564 
1565     return JNI_TRUE;
1566 }
1567 
nativeClearAnimationFrameStats(JNIEnv * env,jclass clazz)1568 static jboolean nativeClearAnimationFrameStats(JNIEnv* env, jclass clazz) {
1569     status_t err = SurfaceComposerClient::clearAnimationFrameStats();
1570 
1571     if (err < 0 && err != NO_INIT) {
1572         doThrowIAE(env);
1573     }
1574 
1575     // The other end is not ready, just report we failed.
1576     if (err == NO_INIT) {
1577         return JNI_FALSE;
1578     }
1579 
1580     return JNI_TRUE;
1581 }
1582 
nativeGetAnimationFrameStats(JNIEnv * env,jclass clazz,jobject outStats)1583 static jboolean nativeGetAnimationFrameStats(JNIEnv* env, jclass clazz, jobject outStats) {
1584     FrameStats stats;
1585 
1586     status_t err = SurfaceComposerClient::getAnimationFrameStats(&stats);
1587     if (err < 0 && err != NO_INIT) {
1588         doThrowIAE(env);
1589     }
1590 
1591     // The other end is not ready, fine just return empty stats.
1592     if (err == NO_INIT) {
1593         return JNI_FALSE;
1594     }
1595 
1596     jlong refreshPeriodNano = static_cast<jlong>(stats.refreshPeriodNano);
1597     size_t frameCount = stats.desiredPresentTimesNano.size();
1598 
1599     jlongArray presentedTimesNanoDst = env->NewLongArray(frameCount);
1600     if (presentedTimesNanoDst == NULL) {
1601         return JNI_FALSE;
1602     }
1603 
1604     nsecs_t presentedTimesNanoSrc[frameCount];
1605 
1606     for (size_t i = 0; i < frameCount; i++) {
1607         nsecs_t presentedTimeNano = stats.actualPresentTimesNano[i];
1608         if (presentedTimeNano == INT64_MAX) {
1609             presentedTimeNano = gWindowContentFrameStatsClassInfo.UNDEFINED_TIME_NANO;
1610         }
1611         presentedTimesNanoSrc[i] = presentedTimeNano;
1612     }
1613 
1614     env->SetLongArrayRegion(presentedTimesNanoDst, 0, frameCount, presentedTimesNanoSrc);
1615 
1616     env->CallVoidMethod(outStats, gWindowAnimationFrameStatsClassInfo.init, refreshPeriodNano,
1617             presentedTimesNanoDst);
1618 
1619     if (env->ExceptionCheck()) {
1620         return JNI_FALSE;
1621     }
1622 
1623     return JNI_TRUE;
1624 }
1625 
nativeReparent(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jlong newParentObject)1626 static void nativeReparent(JNIEnv* env, jclass clazz, jlong transactionObj,
1627         jlong nativeObject,
1628         jlong newParentObject) {
1629     auto ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
1630     auto newParent = reinterpret_cast<SurfaceControl *>(newParentObject);
1631     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
1632     transaction->reparent(ctrl, newParent);
1633 }
1634 
nativeGetBootDisplayModeSupport(JNIEnv * env,jclass clazz)1635 static jboolean nativeGetBootDisplayModeSupport(JNIEnv* env, jclass clazz) {
1636     bool isBootDisplayModeSupported = false;
1637     SurfaceComposerClient::getBootDisplayModeSupport(&isBootDisplayModeSupported);
1638     return static_cast<jboolean>(isBootDisplayModeSupported);
1639 }
1640 
nativeSetBootDisplayMode(JNIEnv * env,jclass clazz,jobject tokenObject,jint displayModId)1641 static void nativeSetBootDisplayMode(JNIEnv* env, jclass clazz, jobject tokenObject,
1642                                      jint displayModId) {
1643     sp<IBinder> token(ibinderForJavaObject(env, tokenObject));
1644     if (token == NULL) return;
1645 
1646     SurfaceComposerClient::setBootDisplayMode(token, displayModId);
1647 }
1648 
nativeClearBootDisplayMode(JNIEnv * env,jclass clazz,jobject tokenObject)1649 static void nativeClearBootDisplayMode(JNIEnv* env, jclass clazz, jobject tokenObject) {
1650     sp<IBinder> token(ibinderForJavaObject(env, tokenObject));
1651     if (token == NULL) return;
1652 
1653     SurfaceComposerClient::clearBootDisplayMode(token);
1654 }
1655 
nativeSetAutoLowLatencyMode(JNIEnv * env,jclass clazz,jobject tokenObject,jboolean on)1656 static void nativeSetAutoLowLatencyMode(JNIEnv* env, jclass clazz, jobject tokenObject, jboolean on) {
1657     sp<IBinder> token(ibinderForJavaObject(env, tokenObject));
1658     if (token == NULL) return;
1659 
1660     SurfaceComposerClient::setAutoLowLatencyMode(token, on);
1661 }
1662 
nativeSetGameContentType(JNIEnv * env,jclass clazz,jobject tokenObject,jboolean on)1663 static void nativeSetGameContentType(JNIEnv* env, jclass clazz, jobject tokenObject, jboolean on) {
1664     sp<IBinder> token(ibinderForJavaObject(env, tokenObject));
1665     if (token == NULL) return;
1666 
1667     SurfaceComposerClient::setGameContentType(token, on);
1668 }
1669 
nativeReadFromParcel(JNIEnv * env,jclass clazz,jobject parcelObj)1670 static jlong nativeReadFromParcel(JNIEnv* env, jclass clazz, jobject parcelObj) {
1671     Parcel* parcel = parcelForJavaObject(env, parcelObj);
1672     if (parcel == NULL) {
1673         doThrowNPE(env);
1674         return 0;
1675     }
1676     sp<SurfaceControl> surface;
1677     SurfaceControl::readFromParcel(*parcel, &surface);
1678     if (surface == nullptr) {
1679         return 0;
1680     }
1681     surface->incStrong((void *)nativeCreate);
1682     return reinterpret_cast<jlong>(surface.get());
1683 }
1684 
nativeCopyFromSurfaceControl(JNIEnv * env,jclass clazz,jlong surfaceControlNativeObj)1685 static jlong nativeCopyFromSurfaceControl(JNIEnv* env, jclass clazz, jlong surfaceControlNativeObj) {
1686     sp<SurfaceControl> surface(reinterpret_cast<SurfaceControl *>(surfaceControlNativeObj));
1687     if (surface == nullptr) {
1688         return 0;
1689     }
1690 
1691     sp<SurfaceControl> newSurface = new SurfaceControl(surface);
1692     newSurface->incStrong((void *)nativeCreate);
1693     return reinterpret_cast<jlong>(newSurface.get());
1694 }
1695 
nativeWriteToParcel(JNIEnv * env,jclass clazz,jlong nativeObject,jobject parcelObj)1696 static void nativeWriteToParcel(JNIEnv* env, jclass clazz,
1697         jlong nativeObject, jobject parcelObj) {
1698     Parcel* parcel = parcelForJavaObject(env, parcelObj);
1699     if (parcel == NULL) {
1700         doThrowNPE(env);
1701         return;
1702     }
1703     SurfaceControl* const self = reinterpret_cast<SurfaceControl *>(nativeObject);
1704     if (self != nullptr) {
1705         self->writeToParcel(*parcel);
1706     }
1707 }
1708 
nativeGetDisplayBrightnessSupport(JNIEnv * env,jclass clazz,jobject displayTokenObject)1709 static jboolean nativeGetDisplayBrightnessSupport(JNIEnv* env, jclass clazz,
1710         jobject displayTokenObject) {
1711     sp<IBinder> displayToken(ibinderForJavaObject(env, displayTokenObject));
1712     if (displayToken == nullptr) {
1713         return JNI_FALSE;
1714     }
1715     return static_cast<jboolean>(SurfaceComposerClient::getDisplayBrightnessSupport(displayToken));
1716 }
1717 
nativeSetDisplayBrightness(JNIEnv * env,jclass clazz,jobject displayTokenObject,jfloat sdrBrightness,jfloat sdrBrightnessNits,jfloat displayBrightness,jfloat displayBrightnessNits)1718 static jboolean nativeSetDisplayBrightness(JNIEnv* env, jclass clazz, jobject displayTokenObject,
1719                                            jfloat sdrBrightness, jfloat sdrBrightnessNits,
1720                                            jfloat displayBrightness, jfloat displayBrightnessNits) {
1721     sp<IBinder> displayToken(ibinderForJavaObject(env, displayTokenObject));
1722     if (displayToken == nullptr) {
1723         return JNI_FALSE;
1724     }
1725     gui::DisplayBrightness brightness;
1726     brightness.sdrWhitePoint = sdrBrightness;
1727     brightness.sdrWhitePointNits = sdrBrightnessNits;
1728     brightness.displayBrightness = displayBrightness;
1729     brightness.displayBrightnessNits = displayBrightnessNits;
1730     status_t error = SurfaceComposerClient::setDisplayBrightness(displayToken, brightness);
1731     return error == OK ? JNI_TRUE : JNI_FALSE;
1732 }
1733 
nativeWriteTransactionToParcel(JNIEnv * env,jclass clazz,jlong nativeObject,jobject parcelObj)1734 static void nativeWriteTransactionToParcel(JNIEnv* env, jclass clazz, jlong nativeObject,
1735         jobject parcelObj) {
1736     Parcel* parcel = parcelForJavaObject(env, parcelObj);
1737     if (parcel == NULL) {
1738         doThrowNPE(env);
1739         return;
1740     }
1741     SurfaceComposerClient::Transaction* const self =
1742             reinterpret_cast<SurfaceComposerClient::Transaction *>(nativeObject);
1743     if (self != nullptr) {
1744         self->writeToParcel(parcel);
1745     }
1746 }
1747 
nativeClearTransaction(JNIEnv * env,jclass clazz,jlong nativeObject)1748 static void nativeClearTransaction(JNIEnv* env, jclass clazz, jlong nativeObject) {
1749     SurfaceComposerClient::Transaction* const self =
1750             reinterpret_cast<SurfaceComposerClient::Transaction*>(nativeObject);
1751     if (self != nullptr) {
1752         self->clear();
1753     }
1754 }
1755 
nativeReadTransactionFromParcel(JNIEnv * env,jclass clazz,jobject parcelObj)1756 static jlong nativeReadTransactionFromParcel(JNIEnv* env, jclass clazz, jobject parcelObj) {
1757     Parcel* parcel = parcelForJavaObject(env, parcelObj);
1758     if (parcel == NULL) {
1759         doThrowNPE(env);
1760         return 0;
1761     }
1762     std::unique_ptr<SurfaceComposerClient::Transaction> transaction =
1763             SurfaceComposerClient::Transaction::createFromParcel(parcel);
1764 
1765     return reinterpret_cast<jlong>(transaction.release());
1766 }
1767 
nativeMirrorSurface(JNIEnv * env,jclass clazz,jlong mirrorOfObj)1768 static jlong nativeMirrorSurface(JNIEnv* env, jclass clazz, jlong mirrorOfObj) {
1769     sp<SurfaceComposerClient> client = SurfaceComposerClient::getDefault();
1770     SurfaceControl *mirrorOf = reinterpret_cast<SurfaceControl*>(mirrorOfObj);
1771     sp<SurfaceControl> surface = client->mirrorSurface(mirrorOf);
1772 
1773     surface->incStrong((void *)nativeCreate);
1774     return reinterpret_cast<jlong>(surface.get());
1775 }
1776 
nativeSetGlobalShadowSettings(JNIEnv * env,jclass clazz,jfloatArray jAmbientColor,jfloatArray jSpotColor,jfloat lightPosY,jfloat lightPosZ,jfloat lightRadius)1777 static void nativeSetGlobalShadowSettings(JNIEnv* env, jclass clazz, jfloatArray jAmbientColor,
1778         jfloatArray jSpotColor, jfloat lightPosY, jfloat lightPosZ, jfloat lightRadius) {
1779     sp<SurfaceComposerClient> client = SurfaceComposerClient::getDefault();
1780 
1781     float* floatAmbientColor = env->GetFloatArrayElements(jAmbientColor, 0);
1782     half4 ambientColor = half4(floatAmbientColor[0], floatAmbientColor[1], floatAmbientColor[2],
1783             floatAmbientColor[3]);
1784     env->ReleaseFloatArrayElements(jAmbientColor, floatAmbientColor, 0);
1785 
1786     float* floatSpotColor = env->GetFloatArrayElements(jSpotColor, 0);
1787     half4 spotColor = half4(floatSpotColor[0], floatSpotColor[1], floatSpotColor[2],
1788             floatSpotColor[3]);
1789     env->ReleaseFloatArrayElements(jSpotColor, floatSpotColor, 0);
1790 
1791     client->setGlobalShadowSettings(ambientColor, spotColor, lightPosY, lightPosZ, lightRadius);
1792 }
1793 
nativeGetDisplayDecorationSupport(JNIEnv * env,jclass clazz,jobject displayTokenObject)1794 static jobject nativeGetDisplayDecorationSupport(JNIEnv* env, jclass clazz,
1795                                                  jobject displayTokenObject) {
1796     sp<IBinder> displayToken(ibinderForJavaObject(env, displayTokenObject));
1797     if (displayToken == nullptr) {
1798         return nullptr;
1799     }
1800     const auto support = SurfaceComposerClient::getDisplayDecorationSupport(displayToken);
1801     if (!support) {
1802         return nullptr;
1803     }
1804 
1805     using aidl::android::hardware::graphics::common::PixelFormat;
1806     if (support.value().format == PixelFormat::R_8 && !hwui_uses_vulkan()) {
1807         return nullptr;
1808     }
1809 
1810     jobject jDisplayDecorationSupport =
1811             env->NewObject(gDisplayDecorationSupportInfo.clazz, gDisplayDecorationSupportInfo.ctor);
1812     if (jDisplayDecorationSupport == nullptr) {
1813         jniThrowException(env, "java/lang/OutOfMemoryError", nullptr);
1814         return nullptr;
1815     }
1816 
1817     env->SetIntField(jDisplayDecorationSupport, gDisplayDecorationSupportInfo.format,
1818                      static_cast<jint>(support.value().format));
1819     env->SetIntField(jDisplayDecorationSupport, gDisplayDecorationSupportInfo.alphaInterpretation,
1820                      static_cast<jint>(support.value().alphaInterpretation));
1821     return jDisplayDecorationSupport;
1822 }
1823 
nativeGetHandle(JNIEnv * env,jclass clazz,jlong nativeObject)1824 static jlong nativeGetHandle(JNIEnv* env, jclass clazz, jlong nativeObject) {
1825     SurfaceControl *surfaceControl = reinterpret_cast<SurfaceControl*>(nativeObject);
1826     return reinterpret_cast<jlong>(surfaceControl->getHandle().get());
1827 }
1828 
nativeRemoveCurrentInputFocus(JNIEnv * env,jclass clazz,jlong transactionObj,jint displayId)1829 static void nativeRemoveCurrentInputFocus(JNIEnv* env, jclass clazz, jlong transactionObj,
1830                                           jint displayId) {
1831     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
1832     FocusRequest request;
1833     request.timestamp = systemTime(SYSTEM_TIME_MONOTONIC);
1834     request.displayId = displayId;
1835     request.windowName = "<null>";
1836     transaction->setFocusedWindow(request);
1837 }
1838 
nativeSetFocusedWindow(JNIEnv * env,jclass clazz,jlong transactionObj,jobject toTokenObj,jstring windowNameJstr,jint displayId)1839 static void nativeSetFocusedWindow(JNIEnv* env, jclass clazz, jlong transactionObj,
1840                                    jobject toTokenObj, jstring windowNameJstr, jint displayId) {
1841     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
1842     if (toTokenObj == NULL) return;
1843 
1844     sp<IBinder> toToken(ibinderForJavaObject(env, toTokenObj));
1845 
1846     FocusRequest request;
1847     request.token = toToken;
1848     if (windowNameJstr != NULL) {
1849         ScopedUtfChars windowName(env, windowNameJstr);
1850         request.windowName = windowName.c_str();
1851     }
1852 
1853     request.timestamp = systemTime(SYSTEM_TIME_MONOTONIC);
1854     request.displayId = displayId;
1855     transaction->setFocusedWindow(request);
1856 }
1857 
nativeSetFrameTimelineVsync(JNIEnv * env,jclass clazz,jlong transactionObj,jlong frameTimelineVsyncId)1858 static void nativeSetFrameTimelineVsync(JNIEnv* env, jclass clazz, jlong transactionObj,
1859                                         jlong frameTimelineVsyncId) {
1860     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
1861 
1862     FrameTimelineInfo ftInfo;
1863     ftInfo.vsyncId = frameTimelineVsyncId;
1864     ftInfo.inputEventId = android::os::IInputConstants::INVALID_INPUT_EVENT_ID;
1865     transaction->setFrameTimelineInfo(ftInfo);
1866 }
1867 
nativeAddTransactionCommittedListener(JNIEnv * env,jclass clazz,jlong transactionObj,jobject transactionCommittedListenerObject)1868 static void nativeAddTransactionCommittedListener(JNIEnv* env, jclass clazz, jlong transactionObj,
1869                                                   jobject transactionCommittedListenerObject) {
1870     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
1871 
1872     void* context =
1873             new TransactionCommittedListenerWrapper(env, transactionCommittedListenerObject);
1874     transaction->addTransactionCommittedCallback(TransactionCommittedListenerWrapper::
1875                                                          transactionCallbackThunk,
1876                                                  context);
1877 }
1878 
nativeSetTrustedPresentationCallback(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jlong trustedPresentationCallbackObject,jobject trustedPresentationThresholds)1879 static void nativeSetTrustedPresentationCallback(JNIEnv* env, jclass clazz, jlong transactionObj,
1880                                                  jlong nativeObject,
1881                                                  jlong trustedPresentationCallbackObject,
1882                                                  jobject trustedPresentationThresholds) {
1883     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
1884     auto ctrl = reinterpret_cast<SurfaceControl*>(nativeObject);
1885 
1886     TrustedPresentationThresholds thresholds;
1887     thresholds.minAlpha = env->GetFloatField(trustedPresentationThresholds,
1888                                              gTrustedPresentationThresholdsClassInfo.mMinAlpha);
1889     thresholds.minFractionRendered =
1890             env->GetFloatField(trustedPresentationThresholds,
1891                                gTrustedPresentationThresholdsClassInfo.mMinFractionRendered);
1892     thresholds.stabilityRequirementMs =
1893             env->GetIntField(trustedPresentationThresholds,
1894                              gTrustedPresentationThresholdsClassInfo.mStabilityRequirementMs);
1895 
1896     sp<SurfaceComposerClient::PresentationCallbackRAII> callbackRef;
1897     TrustedPresentationCallbackWrapper* wrapper =
1898             reinterpret_cast<TrustedPresentationCallbackWrapper*>(
1899                     trustedPresentationCallbackObject);
1900     transaction->setTrustedPresentationCallback(ctrl,
1901                                                 TrustedPresentationCallbackWrapper::
1902                                                         onTrustedPresentationChangedThunk,
1903                                                 thresholds, wrapper, callbackRef);
1904     wrapper->addCallbackRef(callbackRef);
1905 }
1906 
nativeClearTrustedPresentationCallback(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject)1907 static void nativeClearTrustedPresentationCallback(JNIEnv* env, jclass clazz, jlong transactionObj,
1908                                                    jlong nativeObject) {
1909     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
1910     auto ctrl = reinterpret_cast<SurfaceControl*>(nativeObject);
1911 
1912     transaction->clearTrustedPresentationCallback(ctrl);
1913 }
1914 
1915 class JankDataListenerWrapper : public JankDataListener {
1916 public:
JankDataListenerWrapper(JNIEnv * env,jobject onJankDataListenerObject)1917     JankDataListenerWrapper(JNIEnv* env, jobject onJankDataListenerObject) {
1918         mOnJankDataListenerWeak = env->NewWeakGlobalRef(onJankDataListenerObject);
1919         env->GetJavaVM(&mVm);
1920     }
1921 
~JankDataListenerWrapper()1922     ~JankDataListenerWrapper() {
1923         JNIEnv* env = getEnv();
1924         env->DeleteWeakGlobalRef(mOnJankDataListenerWeak);
1925     }
1926 
onJankDataAvailable(const std::vector<JankData> & jankData)1927     void onJankDataAvailable(const std::vector<JankData>& jankData) {
1928         JNIEnv* env = getEnv();
1929 
1930         jobject target = env->NewLocalRef(mOnJankDataListenerWeak);
1931         if (target == nullptr) return;
1932 
1933         jobjectArray jJankDataArray = env->NewObjectArray(jankData.size(),
1934                 gJankDataClassInfo.clazz, nullptr);
1935         for (int i = 0; i < jankData.size(); i++) {
1936             jobject jJankData = env->NewObject(gJankDataClassInfo.clazz,
1937                     gJankDataClassInfo.ctor, jankData[i].frameVsyncId, jankData[i].jankType);
1938             env->SetObjectArrayElement(jJankDataArray, i, jJankData);
1939             env->DeleteLocalRef(jJankData);
1940         }
1941         env->CallVoidMethod(target,
1942                 gJankDataListenerClassInfo.onJankDataAvailable,
1943                 jJankDataArray);
1944         env->DeleteLocalRef(jJankDataArray);
1945         env->DeleteLocalRef(target);
1946     }
1947 
1948 private:
1949 
getEnv()1950     JNIEnv* getEnv() {
1951         JNIEnv* env;
1952         mVm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6);
1953         return env;
1954     }
1955 
1956     JavaVM* mVm;
1957     jobject mOnJankDataListenerWeak;
1958 };
1959 
nativeAddJankDataListener(JNIEnv * env,jclass clazz,jlong jankDataCallbackListenerPtr,jlong nativeSurfaceControl)1960 static void nativeAddJankDataListener(JNIEnv* env, jclass clazz,
1961                                        jlong jankDataCallbackListenerPtr,
1962                                        jlong nativeSurfaceControl) {
1963     sp<SurfaceControl> surface(reinterpret_cast<SurfaceControl *>(nativeSurfaceControl));
1964     if (surface == nullptr) {
1965         return;
1966     }
1967     sp<JankDataListenerWrapper> wrapper =
1968             reinterpret_cast<JankDataListenerWrapper*>(jankDataCallbackListenerPtr);
1969     TransactionCompletedListener::getInstance()->addJankListener(wrapper, surface);
1970 }
1971 
nativeRemoveJankDataListener(JNIEnv * env,jclass clazz,jlong jankDataCallbackListenerPtr)1972 static void nativeRemoveJankDataListener(JNIEnv* env, jclass clazz,
1973                                           jlong jankDataCallbackListenerPtr) {
1974     sp<JankDataListenerWrapper> wrapper =
1975             reinterpret_cast<JankDataListenerWrapper*>(jankDataCallbackListenerPtr);
1976     TransactionCompletedListener::getInstance()->removeJankListener(wrapper);
1977 }
1978 
nativeCreateJankDataListenerWrapper(JNIEnv * env,jclass clazz,jobject jankDataListenerObject)1979 static jlong nativeCreateJankDataListenerWrapper(JNIEnv* env, jclass clazz,
1980                                                  jobject jankDataListenerObject) {
1981     return reinterpret_cast<jlong>(
1982             new JankDataListenerWrapper(env, jankDataListenerObject));
1983 }
1984 
nativeGetGPUContextPriority(JNIEnv * env,jclass clazz)1985 static jint nativeGetGPUContextPriority(JNIEnv* env, jclass clazz) {
1986     return static_cast<jint>(SurfaceComposerClient::getGpuContextPriority());
1987 }
1988 
nativeSetTransformHint(JNIEnv * env,jclass clazz,jlong nativeSurfaceControl,jint transformHint)1989 static void nativeSetTransformHint(JNIEnv* env, jclass clazz, jlong nativeSurfaceControl,
1990                                    jint transformHint) {
1991     sp<SurfaceControl> surface(reinterpret_cast<SurfaceControl*>(nativeSurfaceControl));
1992     if (surface == nullptr) {
1993         return;
1994     }
1995     surface->setTransformHint(transformHint);
1996 }
1997 
nativeGetTransformHint(JNIEnv * env,jclass clazz,jlong nativeSurfaceControl)1998 static jint nativeGetTransformHint(JNIEnv* env, jclass clazz, jlong nativeSurfaceControl) {
1999     sp<SurfaceControl> surface(reinterpret_cast<SurfaceControl*>(nativeSurfaceControl));
2000     return surface->getTransformHint();
2001 }
2002 
nativeGetLayerId(JNIEnv * env,jclass clazz,jlong nativeSurfaceControl)2003 static jint nativeGetLayerId(JNIEnv* env, jclass clazz, jlong nativeSurfaceControl) {
2004     sp<SurfaceControl> surface(reinterpret_cast<SurfaceControl*>(nativeSurfaceControl));
2005 
2006     return surface->getLayerId();
2007 }
2008 
nativeSetDefaultApplyToken(JNIEnv * env,jclass clazz,jobject applyToken)2009 static void nativeSetDefaultApplyToken(JNIEnv* env, jclass clazz, jobject applyToken) {
2010     sp<IBinder> token(ibinderForJavaObject(env, applyToken));
2011     if (token == nullptr) {
2012         ALOGE("Null apply token provided.");
2013         return;
2014     }
2015     SurfaceComposerClient::Transaction::setDefaultApplyToken(token);
2016 }
2017 
nativeGetDefaultApplyToken(JNIEnv * env,jclass clazz)2018 static jobject nativeGetDefaultApplyToken(JNIEnv* env, jclass clazz) {
2019     sp<IBinder> token = SurfaceComposerClient::Transaction::getDefaultApplyToken();
2020     return javaObjectForIBinder(env, token);
2021 }
2022 
nativeBootFinished(JNIEnv * env,jclass clazz)2023 static jboolean nativeBootFinished(JNIEnv* env, jclass clazz) {
2024     status_t error = SurfaceComposerClient::bootFinished();
2025     return error == OK ? JNI_TRUE : JNI_FALSE;
2026 }
2027 
nativeCreateTpc(JNIEnv * env,jclass clazz,jobject trustedPresentationCallback)2028 jlong nativeCreateTpc(JNIEnv* env, jclass clazz, jobject trustedPresentationCallback) {
2029     return reinterpret_cast<jlong>(
2030             new TrustedPresentationCallbackWrapper(env, trustedPresentationCallback));
2031 }
2032 
destroyNativeTpc(void * ptr)2033 void destroyNativeTpc(void* ptr) {
2034     TrustedPresentationCallbackWrapper* callback =
2035             reinterpret_cast<TrustedPresentationCallbackWrapper*>(ptr);
2036     delete callback;
2037 }
2038 
getNativeTrustedPresentationCallbackFinalizer(JNIEnv * env,jclass clazz)2039 static jlong getNativeTrustedPresentationCallbackFinalizer(JNIEnv* env, jclass clazz) {
2040     return static_cast<jlong>(reinterpret_cast<uintptr_t>(&destroyNativeTpc));
2041 }
2042 
nativeGetStalledTransactionInfo(JNIEnv * env,jclass clazz,jint pid)2043 static jobject nativeGetStalledTransactionInfo(JNIEnv* env, jclass clazz, jint pid) {
2044     std::optional<gui::StalledTransactionInfo> stalledTransactionInfo =
2045             SurfaceComposerClient::getStalledTransactionInfo(pid);
2046     if (!stalledTransactionInfo) {
2047         return nullptr;
2048     }
2049 
2050     jobject jStalledTransactionInfo = env->NewObject(gStalledTransactionInfoClassInfo.clazz,
2051                                                      gStalledTransactionInfoClassInfo.ctor);
2052     if (!jStalledTransactionInfo) {
2053         jniThrowException(env, "java/lang/OutOfMemoryError", nullptr);
2054         return nullptr;
2055     }
2056 
2057     env->SetObjectField(jStalledTransactionInfo, gStalledTransactionInfoClassInfo.layerName,
2058                         env->NewStringUTF(String8{stalledTransactionInfo->layerName}));
2059     env->SetLongField(jStalledTransactionInfo, gStalledTransactionInfoClassInfo.bufferId,
2060                       static_cast<jlong>(stalledTransactionInfo->bufferId));
2061     env->SetLongField(jStalledTransactionInfo, gStalledTransactionInfoClassInfo.frameNumber,
2062                       static_cast<jlong>(stalledTransactionInfo->frameNumber));
2063     return jStalledTransactionInfo;
2064 }
2065 
2066 // ----------------------------------------------------------------------------
2067 
android_view_SurfaceControl_getNativeSurfaceControl(JNIEnv * env,jobject surfaceControlObj)2068 SurfaceControl* android_view_SurfaceControl_getNativeSurfaceControl(JNIEnv* env,
2069                                                                     jobject surfaceControlObj) {
2070     if (!!surfaceControlObj &&
2071         env->IsInstanceOf(surfaceControlObj, gSurfaceControlClassInfo.clazz)) {
2072         return reinterpret_cast<SurfaceControl*>(
2073                 env->GetLongField(surfaceControlObj, gSurfaceControlClassInfo.mNativeObject));
2074     } else {
2075         return nullptr;
2076     }
2077 }
2078 
android_view_SurfaceTransaction_getNativeSurfaceTransaction(JNIEnv * env,jobject surfaceTransactionObj)2079 SurfaceComposerClient::Transaction* android_view_SurfaceTransaction_getNativeSurfaceTransaction(
2080         JNIEnv* env, jobject surfaceTransactionObj) {
2081     if (!!surfaceTransactionObj &&
2082         env->IsInstanceOf(surfaceTransactionObj, gTransactionClassInfo.clazz)) {
2083         return reinterpret_cast<SurfaceComposerClient::Transaction*>(
2084                 env->GetLongField(surfaceTransactionObj, gTransactionClassInfo.mNativeObject));
2085     } else {
2086         return nullptr;
2087     }
2088 }
2089 
2090 static const JNINativeMethod sSurfaceControlMethods[] = {
2091         // clang-format off
2092     {"nativeCreate", "(Landroid/view/SurfaceSession;Ljava/lang/String;IIIIJLandroid/os/Parcel;)J",
2093             (void*)nativeCreate },
2094     {"nativeReadFromParcel", "(Landroid/os/Parcel;)J",
2095             (void*)nativeReadFromParcel },
2096     {"nativeCopyFromSurfaceControl", "(J)J" ,
2097             (void*)nativeCopyFromSurfaceControl },
2098     {"nativeWriteToParcel", "(JLandroid/os/Parcel;)V",
2099             (void*)nativeWriteToParcel },
2100     {"nativeGetNativeSurfaceControlFinalizer", "()J",
2101             (void*) nativeGetNativeSurfaceControlFinalizer },
2102     {"nativeDisconnect", "(J)V",
2103             (void*)nativeDisconnect },
2104     {"nativeUpdateDefaultBufferSize", "(JII)V",
2105             (void*)nativeSetDefaultBufferSize},
2106     {"nativeCreateTransaction", "()J",
2107             (void*)nativeCreateTransaction },
2108     {"nativeApplyTransaction", "(JZ)V",
2109             (void*)nativeApplyTransaction },
2110     {"nativeGetNativeTransactionFinalizer", "()J",
2111             (void*)nativeGetNativeTransactionFinalizer },
2112     {"nativeMergeTransaction", "(JJ)V",
2113             (void*)nativeMergeTransaction },
2114     {"nativeSetAnimationTransaction", "(J)V",
2115             (void*)nativeSetAnimationTransaction },
2116     {"nativeSetEarlyWakeupStart", "(J)V",
2117             (void*)nativeSetEarlyWakeupStart },
2118     {"nativeSetEarlyWakeupEnd", "(J)V",
2119             (void*)nativeSetEarlyWakeupEnd },
2120     {"nativeGetTransactionId", "(J)J",
2121                 (void*)nativeGetTransactionId },
2122     {"nativeSetLayer", "(JJI)V",
2123             (void*)nativeSetLayer },
2124     {"nativeSetRelativeLayer", "(JJJI)V",
2125             (void*)nativeSetRelativeLayer },
2126     {"nativeSetPosition", "(JJFF)V",
2127             (void*)nativeSetPosition },
2128     {"nativeSetScale", "(JJFF)V",
2129             (void*)nativeSetScale },
2130     {"nativeSetTransparentRegionHint", "(JJLandroid/graphics/Region;)V",
2131             (void*)nativeSetTransparentRegionHint },
2132     {"nativeSetDamageRegion", "(JJLandroid/graphics/Region;)V",
2133             (void*)nativeSetDamageRegion },
2134     {"nativeSetDimmingEnabled", "(JJZ)V", (void*)nativeSetDimmingEnabled },
2135     {"nativeSetAlpha", "(JJF)V",
2136             (void*)nativeSetAlpha },
2137     {"nativeSetColor", "(JJ[F)V",
2138             (void*)nativeSetColor },
2139     {"nativeSetMatrix", "(JJFFFF)V",
2140             (void*)nativeSetMatrix },
2141     {"nativeSetColorTransform", "(JJ[F[F)V",
2142             (void*)nativeSetColorTransform },
2143     {"nativeSetColorSpaceAgnostic", "(JJZ)V",
2144             (void*)nativeSetColorSpaceAgnostic },
2145     {"nativeSetFlags", "(JJII)V",
2146             (void*)nativeSetFlags },
2147     {"nativeSetFrameRateSelectionPriority", "(JJI)V",
2148             (void*)nativeSetFrameRateSelectionPriority },
2149     {"nativeSetWindowCrop", "(JJIIII)V",
2150             (void*)nativeSetWindowCrop },
2151     {"nativeSetCornerRadius", "(JJF)V",
2152             (void*)nativeSetCornerRadius },
2153     {"nativeSetBackgroundBlurRadius", "(JJI)V",
2154             (void*)nativeSetBackgroundBlurRadius },
2155     {"nativeSetLayerStack", "(JJI)V",
2156             (void*)nativeSetLayerStack },
2157     {"nativeSetBlurRegions", "(JJ[[FI)V",
2158             (void*)nativeSetBlurRegions },
2159     {"nativeSetStretchEffect", "(JJFFFFFFFFFF)V",
2160             (void*) nativeSetStretchEffect },
2161     {"nativeSetShadowRadius", "(JJF)V",
2162             (void*)nativeSetShadowRadius },
2163     {"nativeSetFrameRate", "(JJFII)V",
2164             (void*)nativeSetFrameRate },
2165     {"nativeSetDefaultFrameRateCompatibility", "(JJI)V",
2166             (void*)nativeSetDefaultFrameRateCompatibility},
2167     {"nativeSetDisplaySurface", "(JLandroid/os/IBinder;J)V",
2168             (void*)nativeSetDisplaySurface },
2169     {"nativeSetDisplayLayerStack", "(JLandroid/os/IBinder;I)V",
2170             (void*)nativeSetDisplayLayerStack },
2171     {"nativeSetDisplayFlags", "(JLandroid/os/IBinder;I)V",
2172             (void*)nativeSetDisplayFlags },
2173     {"nativeSetDisplayProjection", "(JLandroid/os/IBinder;IIIIIIIII)V",
2174             (void*)nativeSetDisplayProjection },
2175     {"nativeSetDisplaySize", "(JLandroid/os/IBinder;II)V",
2176             (void*)nativeSetDisplaySize },
2177     {"nativeGetStaticDisplayInfo",
2178             "(J)Landroid/view/SurfaceControl$StaticDisplayInfo;",
2179             (void*)nativeGetStaticDisplayInfo },
2180     {"nativeGetDynamicDisplayInfo",
2181             "(J)Landroid/view/SurfaceControl$DynamicDisplayInfo;",
2182             (void*)nativeGetDynamicDisplayInfo },
2183     {"nativeSetDesiredDisplayModeSpecs",
2184             "(Landroid/os/IBinder;Landroid/view/SurfaceControl$DesiredDisplayModeSpecs;)Z",
2185             (void*)nativeSetDesiredDisplayModeSpecs },
2186     {"nativeGetDesiredDisplayModeSpecs",
2187             "(Landroid/os/IBinder;)Landroid/view/SurfaceControl$DesiredDisplayModeSpecs;",
2188             (void*)nativeGetDesiredDisplayModeSpecs },
2189     {"nativeGetDisplayNativePrimaries",
2190             "(Landroid/os/IBinder;)Landroid/view/SurfaceControl$DisplayPrimaries;",
2191             (void*)nativeGetDisplayNativePrimaries },
2192     {"nativeSetActiveColorMode", "(Landroid/os/IBinder;I)Z",
2193             (void*)nativeSetActiveColorMode},
2194      {"nativeGetBootDisplayModeSupport", "()Z",
2195                 (void*)nativeGetBootDisplayModeSupport },
2196     {"nativeSetBootDisplayMode", "(Landroid/os/IBinder;I)V",
2197             (void*)nativeSetBootDisplayMode },
2198     {"nativeClearBootDisplayMode", "(Landroid/os/IBinder;)V",
2199             (void*)nativeClearBootDisplayMode },
2200     {"nativeSetAutoLowLatencyMode", "(Landroid/os/IBinder;Z)V",
2201             (void*)nativeSetAutoLowLatencyMode },
2202     {"nativeSetGameContentType", "(Landroid/os/IBinder;Z)V",
2203             (void*)nativeSetGameContentType },
2204     {"nativeGetCompositionDataspaces", "()[I",
2205             (void*)nativeGetCompositionDataspaces},
2206     {"nativeGetOverlaySupport", "()Landroid/hardware/OverlayProperties;",
2207             (void*) nativeGetOverlaySupport},
2208     {"nativeClearContentFrameStats", "(J)Z",
2209             (void*)nativeClearContentFrameStats },
2210     {"nativeGetContentFrameStats", "(JLandroid/view/WindowContentFrameStats;)Z",
2211             (void*)nativeGetContentFrameStats },
2212     {"nativeClearAnimationFrameStats", "()Z",
2213             (void*)nativeClearAnimationFrameStats },
2214     {"nativeGetAnimationFrameStats", "(Landroid/view/WindowAnimationFrameStats;)Z",
2215             (void*)nativeGetAnimationFrameStats },
2216     {"nativeSetDisplayPowerMode", "(Landroid/os/IBinder;I)V",
2217             (void*)nativeSetDisplayPowerMode },
2218     {"nativeGetProtectedContentSupport", "()Z",
2219             (void*)nativeGetProtectedContentSupport },
2220     {"nativeReparent", "(JJJ)V",
2221             (void*)nativeReparent },
2222     {"nativeSetInputWindowInfo", "(JJLandroid/view/InputWindowHandle;)V",
2223             (void*)nativeSetInputWindowInfo },
2224     {"nativeSetMetadata", "(JJILandroid/os/Parcel;)V",
2225             (void*)nativeSetMetadata },
2226     {"nativeGetDisplayedContentSamplingAttributes",
2227             "(Landroid/os/IBinder;)Landroid/hardware/display/DisplayedContentSamplingAttributes;",
2228             (void*)nativeGetDisplayedContentSamplingAttributes },
2229     {"nativeSetDisplayedContentSamplingEnabled", "(Landroid/os/IBinder;ZII)Z",
2230             (void*)nativeSetDisplayedContentSamplingEnabled },
2231     {"nativeGetDisplayedContentSample",
2232             "(Landroid/os/IBinder;JJ)Landroid/hardware/display/DisplayedContentSample;",
2233             (void*)nativeGetDisplayedContentSample },
2234     {"nativeSetGeometry", "(JJLandroid/graphics/Rect;Landroid/graphics/Rect;J)V",
2235             (void*)nativeSetGeometry },
2236     {"nativeSetBuffer", "(JJLandroid/hardware/HardwareBuffer;JLjava/util/function/Consumer;)V",
2237             (void*)nativeSetBuffer },
2238     {"nativeUnsetBuffer", "(JJ)V", (void*)nativeUnsetBuffer },
2239 
2240     {"nativeSetBufferTransform", "(JJI)V", (void*) nativeSetBufferTransform},
2241     {"nativeSetDataSpace", "(JJI)V",
2242             (void*)nativeSetDataSpace },
2243     {"nativeSetExtendedRangeBrightness", "(JJFF)V",
2244             (void*)nativeSetExtendedRangeBrightness },
2245             {"nativeSetCachingHint", "(JJI)V",
2246             (void*)nativeSetCachingHint },
2247     {"nativeAddWindowInfosReportedListener", "(JLjava/lang/Runnable;)V",
2248             (void*)nativeAddWindowInfosReportedListener },
2249     {"nativeGetDisplayBrightnessSupport", "(Landroid/os/IBinder;)Z",
2250             (void*)nativeGetDisplayBrightnessSupport },
2251     {"nativeSetDisplayBrightness", "(Landroid/os/IBinder;FFFF)Z",
2252             (void*)nativeSetDisplayBrightness },
2253     {"nativeReadTransactionFromParcel", "(Landroid/os/Parcel;)J",
2254             (void*)nativeReadTransactionFromParcel },
2255     {"nativeWriteTransactionToParcel", "(JLandroid/os/Parcel;)V",
2256             (void*)nativeWriteTransactionToParcel },
2257     {"nativeClearTransaction", "(J)V",
2258             (void*)nativeClearTransaction },
2259     {"nativeMirrorSurface", "(J)J",
2260             (void*)nativeMirrorSurface },
2261     {"nativeSetGlobalShadowSettings", "([F[FFFF)V",
2262             (void*)nativeSetGlobalShadowSettings },
2263     {"nativeGetDisplayDecorationSupport",
2264             "(Landroid/os/IBinder;)Landroid/hardware/graphics/common/DisplayDecorationSupport;",
2265             (void*)nativeGetDisplayDecorationSupport},
2266     {"nativeGetHandle", "(J)J",
2267             (void*)nativeGetHandle },
2268     {"nativeSetFixedTransformHint", "(JJI)V",
2269             (void*)nativeSetFixedTransformHint},
2270     {"nativeSetFocusedWindow", "(JLandroid/os/IBinder;Ljava/lang/String;I)V",
2271             (void*)nativeSetFocusedWindow},
2272     {"nativeRemoveCurrentInputFocus", "(JI)V",
2273             (void*)nativeRemoveCurrentInputFocus},
2274     {"nativeSetFrameTimelineVsync", "(JJ)V",
2275             (void*)nativeSetFrameTimelineVsync },
2276     {"nativeAddJankDataListener", "(JJ)V",
2277             (void*)nativeAddJankDataListener },
2278     {"nativeRemoveJankDataListener", "(J)V",
2279             (void*)nativeRemoveJankDataListener },
2280     {"nativeCreateJankDataListenerWrapper", "(Landroid/view/SurfaceControl$OnJankDataListener;)J",
2281             (void*)nativeCreateJankDataListenerWrapper },
2282     {"nativeGetGPUContextPriority", "()I",
2283             (void*)nativeGetGPUContextPriority },
2284     {"nativeSetTransformHint", "(JI)V",
2285             (void*)nativeSetTransformHint },
2286     {"nativeGetTransformHint", "(J)I",
2287             (void*)nativeGetTransformHint },
2288     {"nativeSetTrustedOverlay", "(JJZ)V",
2289             (void*)nativeSetTrustedOverlay },
2290     {"nativeGetLayerId", "(J)I",
2291             (void*)nativeGetLayerId },
2292     {"nativeSetDropInputMode", "(JJI)V",
2293              (void*)nativeSetDropInputMode },
2294     {"nativeSurfaceFlushJankData", "(J)V",
2295             (void*)nativeSurfaceFlushJankData },
2296     {"nativeAddTransactionCommittedListener", "(JLandroid/view/SurfaceControl$TransactionCommittedListener;)V",
2297             (void*) nativeAddTransactionCommittedListener },
2298     {"nativeSetTrustedPresentationCallback", "(JJJLandroid/view/SurfaceControl$TrustedPresentationThresholds;)V",
2299             (void*) nativeSetTrustedPresentationCallback },
2300     {"nativeClearTrustedPresentationCallback", "(JJ)V",
2301             (void*) nativeClearTrustedPresentationCallback },
2302     {"nativeSanitize", "(JII)V",
2303             (void*) nativeSanitize },
2304     {"nativeSetDestinationFrame", "(JJIIII)V",
2305                 (void*)nativeSetDestinationFrame },
2306     {"nativeSetDefaultApplyToken", "(Landroid/os/IBinder;)V",
2307                 (void*)nativeSetDefaultApplyToken },
2308     {"nativeGetDefaultApplyToken", "()Landroid/os/IBinder;",
2309                 (void*)nativeGetDefaultApplyToken },
2310     {"nativeBootFinished", "()Z",
2311             (void*)nativeBootFinished },
2312     {"nativeCreateTpc", "(Landroid/view/SurfaceControl$TrustedPresentationCallback;)J",
2313             (void*)nativeCreateTpc},
2314     {"getNativeTrustedPresentationCallbackFinalizer", "()J", (void*)getNativeTrustedPresentationCallbackFinalizer },
2315     {"nativeGetStalledTransactionInfo", "(I)Landroid/gui/StalledTransactionInfo;",
2316             (void*) nativeGetStalledTransactionInfo },
2317         // clang-format on
2318 };
2319 
register_android_view_SurfaceControl(JNIEnv * env)2320 int register_android_view_SurfaceControl(JNIEnv* env)
2321 {
2322     int err = RegisterMethodsOrDie(env, "android/view/SurfaceControl",
2323             sSurfaceControlMethods, NELEM(sSurfaceControlMethods));
2324 
2325     jclass integerClass = FindClassOrDie(env, "java/lang/Integer");
2326     gIntegerClassInfo.clazz = MakeGlobalRefOrDie(env, integerClass);
2327     gIntegerClassInfo.ctor = GetMethodIDOrDie(env, gIntegerClassInfo.clazz, "<init>", "(I)V");
2328 
2329     jclass runnableClazz = FindClassOrDie(env, "java/lang/Runnable");
2330     gRunnableClassInfo.clazz = MakeGlobalRefOrDie(env, runnableClazz);
2331     gRunnableClassInfo.run = GetMethodIDOrDie(env, runnableClazz, "run", "()V");
2332 
2333     jclass infoClazz = FindClassOrDie(env, "android/view/SurfaceControl$StaticDisplayInfo");
2334     gStaticDisplayInfoClassInfo.clazz = MakeGlobalRefOrDie(env, infoClazz);
2335     gStaticDisplayInfoClassInfo.ctor = GetMethodIDOrDie(env, infoClazz, "<init>", "()V");
2336     gStaticDisplayInfoClassInfo.isInternal = GetFieldIDOrDie(env, infoClazz, "isInternal", "Z");
2337     gStaticDisplayInfoClassInfo.density = GetFieldIDOrDie(env, infoClazz, "density", "F");
2338     gStaticDisplayInfoClassInfo.secure = GetFieldIDOrDie(env, infoClazz, "secure", "Z");
2339     gStaticDisplayInfoClassInfo.deviceProductInfo =
2340             GetFieldIDOrDie(env, infoClazz, "deviceProductInfo",
2341                             "Landroid/hardware/display/DeviceProductInfo;");
2342     gStaticDisplayInfoClassInfo.installOrientation =
2343             GetFieldIDOrDie(env, infoClazz, "installOrientation", "I");
2344 
2345     jclass dynamicInfoClazz = FindClassOrDie(env, "android/view/SurfaceControl$DynamicDisplayInfo");
2346     gDynamicDisplayInfoClassInfo.clazz = MakeGlobalRefOrDie(env, dynamicInfoClazz);
2347     gDynamicDisplayInfoClassInfo.ctor = GetMethodIDOrDie(env, dynamicInfoClazz, "<init>", "()V");
2348     gDynamicDisplayInfoClassInfo.supportedDisplayModes =
2349             GetFieldIDOrDie(env, dynamicInfoClazz, "supportedDisplayModes",
2350                             "[Landroid/view/SurfaceControl$DisplayMode;");
2351     gDynamicDisplayInfoClassInfo.activeDisplayModeId =
2352             GetFieldIDOrDie(env, dynamicInfoClazz, "activeDisplayModeId", "I");
2353     gDynamicDisplayInfoClassInfo.renderFrameRate =
2354             GetFieldIDOrDie(env, dynamicInfoClazz, "renderFrameRate", "F");
2355     gDynamicDisplayInfoClassInfo.supportedColorModes =
2356             GetFieldIDOrDie(env, dynamicInfoClazz, "supportedColorModes", "[I");
2357     gDynamicDisplayInfoClassInfo.activeColorMode =
2358             GetFieldIDOrDie(env, dynamicInfoClazz, "activeColorMode", "I");
2359     gDynamicDisplayInfoClassInfo.hdrCapabilities =
2360             GetFieldIDOrDie(env, dynamicInfoClazz, "hdrCapabilities",
2361                             "Landroid/view/Display$HdrCapabilities;");
2362     gDynamicDisplayInfoClassInfo.autoLowLatencyModeSupported =
2363             GetFieldIDOrDie(env, dynamicInfoClazz, "autoLowLatencyModeSupported", "Z");
2364     gDynamicDisplayInfoClassInfo.gameContentTypeSupported =
2365             GetFieldIDOrDie(env, dynamicInfoClazz, "gameContentTypeSupported", "Z");
2366     gDynamicDisplayInfoClassInfo.preferredBootDisplayMode =
2367             GetFieldIDOrDie(env, dynamicInfoClazz, "preferredBootDisplayMode", "I");
2368 
2369     jclass modeClazz = FindClassOrDie(env, "android/view/SurfaceControl$DisplayMode");
2370     gDisplayModeClassInfo.clazz = MakeGlobalRefOrDie(env, modeClazz);
2371     gDisplayModeClassInfo.ctor = GetMethodIDOrDie(env, modeClazz, "<init>", "()V");
2372     gDisplayModeClassInfo.id = GetFieldIDOrDie(env, modeClazz, "id", "I");
2373     gDisplayModeClassInfo.width = GetFieldIDOrDie(env, modeClazz, "width", "I");
2374     gDisplayModeClassInfo.height = GetFieldIDOrDie(env, modeClazz, "height", "I");
2375     gDisplayModeClassInfo.xDpi = GetFieldIDOrDie(env, modeClazz, "xDpi", "F");
2376     gDisplayModeClassInfo.yDpi = GetFieldIDOrDie(env, modeClazz, "yDpi", "F");
2377     gDisplayModeClassInfo.refreshRate = GetFieldIDOrDie(env, modeClazz, "refreshRate", "F");
2378     gDisplayModeClassInfo.appVsyncOffsetNanos =
2379             GetFieldIDOrDie(env, modeClazz, "appVsyncOffsetNanos", "J");
2380     gDisplayModeClassInfo.presentationDeadlineNanos =
2381             GetFieldIDOrDie(env, modeClazz, "presentationDeadlineNanos", "J");
2382     gDisplayModeClassInfo.group = GetFieldIDOrDie(env, modeClazz, "group", "I");
2383     gDisplayModeClassInfo.supportedHdrTypes =
2384             GetFieldIDOrDie(env, modeClazz, "supportedHdrTypes", "[I");
2385 
2386     jclass frameStatsClazz = FindClassOrDie(env, "android/view/FrameStats");
2387     jfieldID undefined_time_nano_field = GetStaticFieldIDOrDie(env,
2388             frameStatsClazz, "UNDEFINED_TIME_NANO", "J");
2389     nsecs_t undefined_time_nano = env->GetStaticLongField(frameStatsClazz, undefined_time_nano_field);
2390 
2391     jclass contFrameStatsClazz = FindClassOrDie(env, "android/view/WindowContentFrameStats");
2392     gWindowContentFrameStatsClassInfo.init = GetMethodIDOrDie(env,
2393             contFrameStatsClazz, "init", "(J[J[J[J)V");
2394     gWindowContentFrameStatsClassInfo.UNDEFINED_TIME_NANO = undefined_time_nano;
2395 
2396     jclass animFrameStatsClazz = FindClassOrDie(env, "android/view/WindowAnimationFrameStats");
2397     gWindowAnimationFrameStatsClassInfo.init =  GetMethodIDOrDie(env,
2398             animFrameStatsClazz, "init", "(J[J)V");
2399     gWindowAnimationFrameStatsClassInfo.UNDEFINED_TIME_NANO = undefined_time_nano;
2400 
2401     jclass hdrCapabilitiesClazz = FindClassOrDie(env, "android/view/Display$HdrCapabilities");
2402     gHdrCapabilitiesClassInfo.clazz = MakeGlobalRefOrDie(env, hdrCapabilitiesClazz);
2403     gHdrCapabilitiesClassInfo.ctor = GetMethodIDOrDie(env, hdrCapabilitiesClazz, "<init>",
2404             "([IFFF)V");
2405 
2406     jclass deviceProductInfoClazz =
2407             FindClassOrDie(env, "android/hardware/display/DeviceProductInfo");
2408     gDeviceProductInfoClassInfo.clazz = MakeGlobalRefOrDie(env, deviceProductInfoClazz);
2409     gDeviceProductInfoClassInfo.ctor =
2410             GetMethodIDOrDie(env, deviceProductInfoClazz, "<init>",
2411                              "(Ljava/lang/String;"
2412                              "Ljava/lang/String;"
2413                              "Ljava/lang/String;"
2414                              "Ljava/lang/Integer;"
2415                              "Landroid/hardware/display/DeviceProductInfo$ManufactureDate;"
2416                              "I)V");
2417 
2418     jclass deviceProductInfoManufactureDateClazz =
2419             FindClassOrDie(env, "android/hardware/display/DeviceProductInfo$ManufactureDate");
2420     gDeviceProductInfoManufactureDateClassInfo.clazz =
2421             MakeGlobalRefOrDie(env, deviceProductInfoManufactureDateClazz);
2422     gDeviceProductInfoManufactureDateClassInfo.ctor =
2423             GetMethodIDOrDie(env, deviceProductInfoManufactureDateClazz, "<init>",
2424                              "(Ljava/lang/Integer;Ljava/lang/Integer;)V");
2425 
2426     jclass displayedContentSampleClazz = FindClassOrDie(env,
2427             "android/hardware/display/DisplayedContentSample");
2428     gDisplayedContentSampleClassInfo.clazz = MakeGlobalRefOrDie(env, displayedContentSampleClazz);
2429     gDisplayedContentSampleClassInfo.ctor = GetMethodIDOrDie(env,
2430             displayedContentSampleClazz, "<init>", "(J[J[J[J[J)V");
2431 
2432     jclass displayedContentSamplingAttributesClazz = FindClassOrDie(env,
2433             "android/hardware/display/DisplayedContentSamplingAttributes");
2434     gDisplayedContentSamplingAttributesClassInfo.clazz = MakeGlobalRefOrDie(env,
2435             displayedContentSamplingAttributesClazz);
2436     gDisplayedContentSamplingAttributesClassInfo.ctor = GetMethodIDOrDie(env,
2437             displayedContentSamplingAttributesClazz, "<init>", "(III)V");
2438 
2439     jclass cieXyzClazz = FindClassOrDie(env, "android/view/SurfaceControl$CieXyz");
2440     gCieXyzClassInfo.clazz = MakeGlobalRefOrDie(env, cieXyzClazz);
2441     gCieXyzClassInfo.ctor = GetMethodIDOrDie(env, gCieXyzClassInfo.clazz, "<init>", "()V");
2442     gCieXyzClassInfo.X = GetFieldIDOrDie(env, cieXyzClazz, "X", "F");
2443     gCieXyzClassInfo.Y = GetFieldIDOrDie(env, cieXyzClazz, "Y", "F");
2444     gCieXyzClassInfo.Z = GetFieldIDOrDie(env, cieXyzClazz, "Z", "F");
2445 
2446     jclass displayPrimariesClazz = FindClassOrDie(env,
2447             "android/view/SurfaceControl$DisplayPrimaries");
2448     gDisplayPrimariesClassInfo.clazz = MakeGlobalRefOrDie(env, displayPrimariesClazz);
2449     gDisplayPrimariesClassInfo.ctor = GetMethodIDOrDie(env, gDisplayPrimariesClassInfo.clazz,
2450             "<init>", "()V");
2451     gDisplayPrimariesClassInfo.red = GetFieldIDOrDie(env, displayPrimariesClazz, "red",
2452             "Landroid/view/SurfaceControl$CieXyz;");
2453     gDisplayPrimariesClassInfo.green = GetFieldIDOrDie(env, displayPrimariesClazz, "green",
2454             "Landroid/view/SurfaceControl$CieXyz;");
2455     gDisplayPrimariesClassInfo.blue = GetFieldIDOrDie(env, displayPrimariesClazz, "blue",
2456             "Landroid/view/SurfaceControl$CieXyz;");
2457     gDisplayPrimariesClassInfo.white = GetFieldIDOrDie(env, displayPrimariesClazz, "white",
2458             "Landroid/view/SurfaceControl$CieXyz;");
2459 
2460     jclass RefreshRateRangeClazz =
2461             FindClassOrDie(env, "android/view/SurfaceControl$RefreshRateRange");
2462     gRefreshRateRangeClassInfo.clazz = MakeGlobalRefOrDie(env, RefreshRateRangeClazz);
2463     gRefreshRateRangeClassInfo.ctor =
2464             GetMethodIDOrDie(env, gRefreshRateRangeClassInfo.clazz, "<init>", "(FF)V");
2465     gRefreshRateRangeClassInfo.min = GetFieldIDOrDie(env, RefreshRateRangeClazz, "min", "F");
2466     gRefreshRateRangeClassInfo.max = GetFieldIDOrDie(env, RefreshRateRangeClazz, "max", "F");
2467 
2468     jclass RefreshRateRangesClazz =
2469             FindClassOrDie(env, "android/view/SurfaceControl$RefreshRateRanges");
2470     gRefreshRateRangesClassInfo.clazz = MakeGlobalRefOrDie(env, RefreshRateRangesClazz);
2471     gRefreshRateRangesClassInfo.ctor =
2472             GetMethodIDOrDie(env, gRefreshRateRangesClassInfo.clazz, "<init>",
2473                              "(Landroid/view/SurfaceControl$RefreshRateRange;Landroid/view/"
2474                              "SurfaceControl$RefreshRateRange;)V");
2475     gRefreshRateRangesClassInfo.physical =
2476             GetFieldIDOrDie(env, RefreshRateRangesClazz, "physical",
2477                             "Landroid/view/SurfaceControl$RefreshRateRange;");
2478     gRefreshRateRangesClassInfo.render =
2479             GetFieldIDOrDie(env, RefreshRateRangesClazz, "render",
2480                             "Landroid/view/SurfaceControl$RefreshRateRange;");
2481 
2482     jclass DesiredDisplayModeSpecsClazz =
2483             FindClassOrDie(env, "android/view/SurfaceControl$DesiredDisplayModeSpecs");
2484     gDesiredDisplayModeSpecsClassInfo.clazz = MakeGlobalRefOrDie(env, DesiredDisplayModeSpecsClazz);
2485     gDesiredDisplayModeSpecsClassInfo.ctor =
2486             GetMethodIDOrDie(env, gDesiredDisplayModeSpecsClassInfo.clazz, "<init>",
2487                              "(IZLandroid/view/SurfaceControl$RefreshRateRanges;Landroid/view/"
2488                              "SurfaceControl$RefreshRateRanges;)V");
2489     gDesiredDisplayModeSpecsClassInfo.defaultMode =
2490             GetFieldIDOrDie(env, DesiredDisplayModeSpecsClazz, "defaultMode", "I");
2491     gDesiredDisplayModeSpecsClassInfo.allowGroupSwitching =
2492             GetFieldIDOrDie(env, DesiredDisplayModeSpecsClazz, "allowGroupSwitching", "Z");
2493     gDesiredDisplayModeSpecsClassInfo.primaryRanges =
2494             GetFieldIDOrDie(env, DesiredDisplayModeSpecsClazz, "primaryRanges",
2495                             "Landroid/view/SurfaceControl$RefreshRateRanges;");
2496     gDesiredDisplayModeSpecsClassInfo.appRequestRanges =
2497             GetFieldIDOrDie(env, DesiredDisplayModeSpecsClazz, "appRequestRanges",
2498                             "Landroid/view/SurfaceControl$RefreshRateRanges;");
2499 
2500     jclass jankDataClazz =
2501                 FindClassOrDie(env, "android/view/SurfaceControl$JankData");
2502     gJankDataClassInfo.clazz = MakeGlobalRefOrDie(env, jankDataClazz);
2503     gJankDataClassInfo.ctor =
2504             GetMethodIDOrDie(env, gJankDataClassInfo.clazz, "<init>", "(JI)V");
2505     jclass onJankDataListenerClazz =
2506             FindClassOrDie(env, "android/view/SurfaceControl$OnJankDataListener");
2507     gJankDataListenerClassInfo.clazz = MakeGlobalRefOrDie(env, onJankDataListenerClazz);
2508     gJankDataListenerClassInfo.onJankDataAvailable =
2509             GetMethodIDOrDie(env, onJankDataListenerClazz, "onJankDataAvailable",
2510                              "([Landroid/view/SurfaceControl$JankData;)V");
2511 
2512     jclass transactionCommittedListenerClazz =
2513             FindClassOrDie(env, "android/view/SurfaceControl$TransactionCommittedListener");
2514     gTransactionCommittedListenerClassInfo.clazz =
2515             MakeGlobalRefOrDie(env, transactionCommittedListenerClazz);
2516     gTransactionCommittedListenerClassInfo.onTransactionCommitted =
2517             GetMethodIDOrDie(env, transactionCommittedListenerClazz, "onTransactionCommitted",
2518                              "()V");
2519 
2520     jclass displayDecorationSupportClazz =
2521             FindClassOrDie(env, "android/hardware/graphics/common/DisplayDecorationSupport");
2522     gDisplayDecorationSupportInfo.clazz = MakeGlobalRefOrDie(env, displayDecorationSupportClazz);
2523     gDisplayDecorationSupportInfo.ctor =
2524             GetMethodIDOrDie(env, displayDecorationSupportClazz, "<init>", "()V");
2525     gDisplayDecorationSupportInfo.format =
2526             GetFieldIDOrDie(env, displayDecorationSupportClazz, "format", "I");
2527     gDisplayDecorationSupportInfo.alphaInterpretation =
2528             GetFieldIDOrDie(env, displayDecorationSupportClazz, "alphaInterpretation", "I");
2529 
2530     jclass surfaceControlClazz = FindClassOrDie(env, "android/view/SurfaceControl");
2531     gSurfaceControlClassInfo.clazz = MakeGlobalRefOrDie(env, surfaceControlClazz);
2532     gSurfaceControlClassInfo.mNativeObject =
2533             GetFieldIDOrDie(env, gSurfaceControlClassInfo.clazz, "mNativeObject", "J");
2534     gSurfaceControlClassInfo.invokeReleaseCallback =
2535             GetStaticMethodIDOrDie(env, surfaceControlClazz, "invokeReleaseCallback",
2536                                    "(Ljava/util/function/Consumer;J)V");
2537 
2538     jclass surfaceTransactionClazz = FindClassOrDie(env, "android/view/SurfaceControl$Transaction");
2539     gTransactionClassInfo.clazz = MakeGlobalRefOrDie(env, surfaceTransactionClazz);
2540     gTransactionClassInfo.mNativeObject =
2541             GetFieldIDOrDie(env, gTransactionClassInfo.clazz, "mNativeObject", "J");
2542 
2543     jclass trustedPresentationThresholdsClazz =
2544             FindClassOrDie(env, "android/view/SurfaceControl$TrustedPresentationThresholds");
2545     gTrustedPresentationThresholdsClassInfo.clazz =
2546             MakeGlobalRefOrDie(env, trustedPresentationThresholdsClazz);
2547     gTrustedPresentationThresholdsClassInfo.mMinAlpha =
2548             GetFieldIDOrDie(env, trustedPresentationThresholdsClazz, "mMinAlpha", "F");
2549     gTrustedPresentationThresholdsClassInfo.mMinFractionRendered =
2550             GetFieldIDOrDie(env, trustedPresentationThresholdsClazz, "mMinFractionRendered", "F");
2551     gTrustedPresentationThresholdsClassInfo.mStabilityRequirementMs =
2552             GetFieldIDOrDie(env, trustedPresentationThresholdsClazz, "mStabilityRequirementMs",
2553                             "I");
2554 
2555     jclass trustedPresentationCallbackClazz =
2556             FindClassOrDie(env, "android/view/SurfaceControl$TrustedPresentationCallback");
2557     gTrustedPresentationCallbackClassInfo.onTrustedPresentationChanged =
2558             GetMethodIDOrDie(env, trustedPresentationCallbackClazz, "onTrustedPresentationChanged",
2559                              "(Z)V");
2560 
2561     jclass stalledTransactionInfoClazz = FindClassOrDie(env, "android/gui/StalledTransactionInfo");
2562     gStalledTransactionInfoClassInfo.clazz = MakeGlobalRefOrDie(env, stalledTransactionInfoClazz);
2563     gStalledTransactionInfoClassInfo.ctor =
2564             GetMethodIDOrDie(env, stalledTransactionInfoClazz, "<init>", "()V");
2565     gStalledTransactionInfoClassInfo.layerName =
2566             GetFieldIDOrDie(env, stalledTransactionInfoClazz, "layerName", "Ljava/lang/String;");
2567     gStalledTransactionInfoClassInfo.bufferId =
2568             GetFieldIDOrDie(env, stalledTransactionInfoClazz, "bufferId", "J");
2569     gStalledTransactionInfoClassInfo.frameNumber =
2570             GetFieldIDOrDie(env, stalledTransactionInfoClazz, "frameNumber", "J");
2571 
2572     return err;
2573 }
2574 
2575 } // namespace android
2576