1e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck/* 2e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * Copyright (C) 2013 The Android Open Source Project 3e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * 4e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * Licensed under the Apache License, Version 2.0 (the "License"); 5e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * you may not use this file except in compliance with the License. 6e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * You may obtain a copy of the License at 7e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * 8e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * http://www.apache.org/licenses/LICENSE-2.0 9e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * 10e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * Unless required by applicable law or agreed to in writing, software 11e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * distributed under the License is distributed on an "AS IS" BASIS, 12e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * See the License for the specific language governing permissions and 14e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * limitations under the License. 15e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck */ 16e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 17e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#define LOG_TAG "OpenGLRenderer" 18e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 19e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include "jni.h" 20e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include "GraphicsJNI.h" 21e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include <nativehelper/JNIHelp.h> 22e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include <android_runtime/AndroidRuntime.h> 23e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 24e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include <Animator.h> 25e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include <Interpolator.h> 26e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include <RenderProperties.h> 27e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 28987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe#include "core_jni_helpers.h" 29987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe 30e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Recknamespace android { 31e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 32e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckusing namespace uirenderer; 33e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 34e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckstatic struct { 35e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck jclass clazz; 36e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 37e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck jmethodID callOnFinished; 38e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} gRenderNodeAnimatorClassInfo; 39e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 40e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckstatic JNIEnv* getEnv(JavaVM* vm) { 41e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck JNIEnv* env; 42e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) { 43e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck return 0; 44e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck } 45e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck return env; 46e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} 47e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 4872d6e4facb1abd81809fdaddbe42f41ad885189cJohn Reckclass AnimationListenerLifecycleChecker : public AnimationListener { 4972d6e4facb1abd81809fdaddbe42f41ad885189cJohn Reckpublic: 5072d6e4facb1abd81809fdaddbe42f41ad885189cJohn Reck virtual void onAnimationFinished(BaseRenderNodeAnimator* animator) { 5172d6e4facb1abd81809fdaddbe42f41ad885189cJohn Reck LOG_ALWAYS_FATAL("Lifecycle failure, nStart(%p) wasn't called", animator); 5272d6e4facb1abd81809fdaddbe42f41ad885189cJohn Reck } 5372d6e4facb1abd81809fdaddbe42f41ad885189cJohn Reck}; 5472d6e4facb1abd81809fdaddbe42f41ad885189cJohn Reck 5572d6e4facb1abd81809fdaddbe42f41ad885189cJohn Reckstatic AnimationListenerLifecycleChecker sLifecycleChecker; 5672d6e4facb1abd81809fdaddbe42f41ad885189cJohn Reck 5752244fff29042926e21fa897ef5ab11148e35299John Reckclass AnimationListenerBridge : public AnimationListener { 5852244fff29042926e21fa897ef5ab11148e35299John Reckpublic: 5952244fff29042926e21fa897ef5ab11148e35299John Reck // This holds a strong reference to a Java WeakReference<T> object. This avoids 6052244fff29042926e21fa897ef5ab11148e35299John Reck // cyclic-references-of-doom. If you think "I know, just use NewWeakGlobalRef!" 6152244fff29042926e21fa897ef5ab11148e35299John Reck // then you end up with basically a PhantomReference, which is totally not 6252244fff29042926e21fa897ef5ab11148e35299John Reck // what we want. 63119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck AnimationListenerBridge(JNIEnv* env, jobject finishListener) { 64119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck mFinishListener = env->NewGlobalRef(finishListener); 6552244fff29042926e21fa897ef5ab11148e35299John Reck env->GetJavaVM(&mJvm); 6652244fff29042926e21fa897ef5ab11148e35299John Reck } 67e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 6852244fff29042926e21fa897ef5ab11148e35299John Reck virtual ~AnimationListenerBridge() { 69119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck if (mFinishListener) { 70119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck onAnimationFinished(NULL); 71119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck } 7252244fff29042926e21fa897ef5ab11148e35299John Reck } 73e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 74ff941dcd815021bb20d6504eb486acb1e50592c3John Reck virtual void onAnimationFinished(BaseRenderNodeAnimator*) { 75119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck LOG_ALWAYS_FATAL_IF(!mFinishListener, "Finished listener twice?"); 7652244fff29042926e21fa897ef5ab11148e35299John Reck JNIEnv* env = getEnv(mJvm); 7752244fff29042926e21fa897ef5ab11148e35299John Reck env->CallStaticVoidMethod( 7852244fff29042926e21fa897ef5ab11148e35299John Reck gRenderNodeAnimatorClassInfo.clazz, 7952244fff29042926e21fa897ef5ab11148e35299John Reck gRenderNodeAnimatorClassInfo.callOnFinished, 80119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck mFinishListener); 81119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck releaseJavaObject(); 8252244fff29042926e21fa897ef5ab11148e35299John Reck } 83e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 8452244fff29042926e21fa897ef5ab11148e35299John Reckprivate: 85119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck void releaseJavaObject() { 86119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck JNIEnv* env = getEnv(mJvm); 87119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck env->DeleteGlobalRef(mFinishListener); 88119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck mFinishListener = NULL; 89119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck } 90119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 9152244fff29042926e21fa897ef5ab11148e35299John Reck JavaVM* mJvm; 92119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck jobject mFinishListener; 9352244fff29042926e21fa897ef5ab11148e35299John Reck}; 9452244fff29042926e21fa897ef5ab11148e35299John Reck 9552244fff29042926e21fa897ef5ab11148e35299John Reckstatic inline RenderPropertyAnimator::RenderProperty toRenderProperty(jint property) { 9652244fff29042926e21fa897ef5ab11148e35299John Reck LOG_ALWAYS_FATAL_IF(property < 0 || property > RenderPropertyAnimator::ALPHA, 97e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck "Invalid property %d", property); 9852244fff29042926e21fa897ef5ab11148e35299John Reck return static_cast<RenderPropertyAnimator::RenderProperty>(property); 9952244fff29042926e21fa897ef5ab11148e35299John Reck} 10052244fff29042926e21fa897ef5ab11148e35299John Reck 10152244fff29042926e21fa897ef5ab11148e35299John Reckstatic inline CanvasPropertyPaintAnimator::PaintField toPaintField(jint field) { 10252244fff29042926e21fa897ef5ab11148e35299John Reck LOG_ALWAYS_FATAL_IF(field < 0 10352244fff29042926e21fa897ef5ab11148e35299John Reck || field > CanvasPropertyPaintAnimator::ALPHA, 10452244fff29042926e21fa897ef5ab11148e35299John Reck "Invalid paint field %d", field); 10552244fff29042926e21fa897ef5ab11148e35299John Reck return static_cast<CanvasPropertyPaintAnimator::PaintField>(field); 10652244fff29042926e21fa897ef5ab11148e35299John Reck} 10752244fff29042926e21fa897ef5ab11148e35299John Reck 108119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckstatic jlong createAnimator(JNIEnv* env, jobject clazz, 109ff941dcd815021bb20d6504eb486acb1e50592c3John Reck jint propertyRaw, jfloat finalValue) { 11052244fff29042926e21fa897ef5ab11148e35299John Reck RenderPropertyAnimator::RenderProperty property = toRenderProperty(propertyRaw); 111ff941dcd815021bb20d6504eb486acb1e50592c3John Reck BaseRenderNodeAnimator* animator = new RenderPropertyAnimator(property, finalValue); 11272d6e4facb1abd81809fdaddbe42f41ad885189cJohn Reck animator->setListener(&sLifecycleChecker); 11352244fff29042926e21fa897ef5ab11148e35299John Reck return reinterpret_cast<jlong>( animator ); 11452244fff29042926e21fa897ef5ab11148e35299John Reck} 11552244fff29042926e21fa897ef5ab11148e35299John Reck 11652244fff29042926e21fa897ef5ab11148e35299John Reckstatic jlong createCanvasPropertyFloatAnimator(JNIEnv* env, jobject clazz, 117119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck jlong canvasPropertyPtr, jfloat finalValue) { 11852244fff29042926e21fa897ef5ab11148e35299John Reck CanvasPropertyPrimitive* canvasProperty = reinterpret_cast<CanvasPropertyPrimitive*>(canvasPropertyPtr); 119ff941dcd815021bb20d6504eb486acb1e50592c3John Reck BaseRenderNodeAnimator* animator = new CanvasPropertyPrimitiveAnimator(canvasProperty, finalValue); 12072d6e4facb1abd81809fdaddbe42f41ad885189cJohn Reck animator->setListener(&sLifecycleChecker); 12152244fff29042926e21fa897ef5ab11148e35299John Reck return reinterpret_cast<jlong>( animator ); 12252244fff29042926e21fa897ef5ab11148e35299John Reck} 123e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 12452244fff29042926e21fa897ef5ab11148e35299John Reckstatic jlong createCanvasPropertyPaintAnimator(JNIEnv* env, jobject clazz, 125119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck jlong canvasPropertyPtr, jint paintFieldRaw, 126ff941dcd815021bb20d6504eb486acb1e50592c3John Reck jfloat finalValue) { 12752244fff29042926e21fa897ef5ab11148e35299John Reck CanvasPropertyPaint* canvasProperty = reinterpret_cast<CanvasPropertyPaint*>(canvasPropertyPtr); 12852244fff29042926e21fa897ef5ab11148e35299John Reck CanvasPropertyPaintAnimator::PaintField paintField = toPaintField(paintFieldRaw); 129ff941dcd815021bb20d6504eb486acb1e50592c3John Reck BaseRenderNodeAnimator* animator = new CanvasPropertyPaintAnimator( 130ff941dcd815021bb20d6504eb486acb1e50592c3John Reck canvasProperty, paintField, finalValue); 13172d6e4facb1abd81809fdaddbe42f41ad885189cJohn Reck animator->setListener(&sLifecycleChecker); 132e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck return reinterpret_cast<jlong>( animator ); 133e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} 134e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 135119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckstatic jlong createRevealAnimator(JNIEnv* env, jobject clazz, 136af4d04cab6d48ae0d6a5e79bd30f679af87abaadChris Craik jint centerX, jint centerY, jfloat startRadius, jfloat endRadius) { 137af4d04cab6d48ae0d6a5e79bd30f679af87abaadChris Craik BaseRenderNodeAnimator* animator = new RevealAnimator(centerX, centerY, startRadius, endRadius); 13872d6e4facb1abd81809fdaddbe42f41ad885189cJohn Reck animator->setListener(&sLifecycleChecker); 139d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck return reinterpret_cast<jlong>( animator ); 140d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck} 141d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck 142c6b3264e16f1d2b72e7f9508559981ce9970157cJohn Reckstatic void setStartValue(JNIEnv* env, jobject clazz, jlong animatorPtr, jfloat startValue) { 143c6b3264e16f1d2b72e7f9508559981ce9970157cJohn Reck BaseRenderNodeAnimator* animator = reinterpret_cast<BaseRenderNodeAnimator*>(animatorPtr); 144c6b3264e16f1d2b72e7f9508559981ce9970157cJohn Reck animator->setStartValue(startValue); 145c6b3264e16f1d2b72e7f9508559981ce9970157cJohn Reck} 146c6b3264e16f1d2b72e7f9508559981ce9970157cJohn Reck 147ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverettestatic void setDuration(JNIEnv* env, jobject clazz, jlong animatorPtr, jlong duration) { 148e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck LOG_ALWAYS_FATAL_IF(duration < 0, "Duration cannot be negative"); 149ff941dcd815021bb20d6504eb486acb1e50592c3John Reck BaseRenderNodeAnimator* animator = reinterpret_cast<BaseRenderNodeAnimator*>(animatorPtr); 150e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck animator->setDuration(duration); 151e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} 152e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 153ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverettestatic jlong getDuration(JNIEnv* env, jobject clazz, jlong animatorPtr) { 154ff941dcd815021bb20d6504eb486acb1e50592c3John Reck BaseRenderNodeAnimator* animator = reinterpret_cast<BaseRenderNodeAnimator*>(animatorPtr); 155ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette return static_cast<jlong>(animator->duration()); 156ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette} 157ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette 158ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverettestatic void setStartDelay(JNIEnv* env, jobject clazz, jlong animatorPtr, jlong startDelay) { 159ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette LOG_ALWAYS_FATAL_IF(startDelay < 0, "Start delay cannot be negative"); 160ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette BaseRenderNodeAnimator* animator = reinterpret_cast<BaseRenderNodeAnimator*>(animatorPtr); 161ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette animator->setStartDelay(startDelay); 162ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette} 163ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette 164315c329544d7c593d1072b071cbb92d9afe74021John Reckstatic void setInterpolator(JNIEnv* env, jobject clazz, jlong animatorPtr, jlong interpolatorPtr) { 165ff941dcd815021bb20d6504eb486acb1e50592c3John Reck BaseRenderNodeAnimator* animator = reinterpret_cast<BaseRenderNodeAnimator*>(animatorPtr); 166315c329544d7c593d1072b071cbb92d9afe74021John Reck Interpolator* interpolator = reinterpret_cast<Interpolator*>(interpolatorPtr); 167315c329544d7c593d1072b071cbb92d9afe74021John Reck animator->setInterpolator(interpolator); 168315c329544d7c593d1072b071cbb92d9afe74021John Reck} 169315c329544d7c593d1072b071cbb92d9afe74021John Reck 170f5945a0c8bb868f978d9d0d22043a8b44464a86eJohn Reckstatic void setAllowRunningAsync(JNIEnv* env, jobject clazz, jlong animatorPtr, jboolean mayRunAsync) { 171f5945a0c8bb868f978d9d0d22043a8b44464a86eJohn Reck BaseRenderNodeAnimator* animator = reinterpret_cast<BaseRenderNodeAnimator*>(animatorPtr); 172f5945a0c8bb868f978d9d0d22043a8b44464a86eJohn Reck animator->setAllowRunningAsync(mayRunAsync); 173f5945a0c8bb868f978d9d0d22043a8b44464a86eJohn Reck} 174f5945a0c8bb868f978d9d0d22043a8b44464a86eJohn Reck 175c47c98be04d602f331e0ea9704d2c11f8c53852dJohn Reckstatic void setListener(JNIEnv* env, jobject clazz, jlong animatorPtr, jobject finishListener) { 1768d8af3c1b768d590754d657a7d1242dcb462454bJohn Reck BaseRenderNodeAnimator* animator = reinterpret_cast<BaseRenderNodeAnimator*>(animatorPtr); 17772d6e4facb1abd81809fdaddbe42f41ad885189cJohn Reck animator->setListener(new AnimationListenerBridge(env, finishListener)); 178c47c98be04d602f331e0ea9704d2c11f8c53852dJohn Reck} 179c47c98be04d602f331e0ea9704d2c11f8c53852dJohn Reck 180c47c98be04d602f331e0ea9704d2c11f8c53852dJohn Reckstatic void start(JNIEnv* env, jobject clazz, jlong animatorPtr) { 181c47c98be04d602f331e0ea9704d2c11f8c53852dJohn Reck BaseRenderNodeAnimator* animator = reinterpret_cast<BaseRenderNodeAnimator*>(animatorPtr); 1828d8af3c1b768d590754d657a7d1242dcb462454bJohn Reck animator->start(); 1838d8af3c1b768d590754d657a7d1242dcb462454bJohn Reck} 1848d8af3c1b768d590754d657a7d1242dcb462454bJohn Reck 185d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reckstatic void end(JNIEnv* env, jobject clazz, jlong animatorPtr) { 18668bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck BaseRenderNodeAnimator* animator = reinterpret_cast<BaseRenderNodeAnimator*>(animatorPtr); 187c4bb185d41cfb960ed9a3178a4f8974c351abdb0Doris Liu animator->cancel(); 18868bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck} 18968bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck 190e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck// ---------------------------------------------------------------------------- 191e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck// JNI Glue 192e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck// ---------------------------------------------------------------------------- 193e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 194e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckconst char* const kClassPathName = "android/view/RenderNodeAnimator"; 195e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 19676f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod gMethods[] = { 197119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck { "nCreateAnimator", "(IF)J", (void*) createAnimator }, 198119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck { "nCreateCanvasPropertyFloatAnimator", "(JF)J", (void*) createCanvasPropertyFloatAnimator }, 199119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck { "nCreateCanvasPropertyPaintAnimator", "(JIF)J", (void*) createCanvasPropertyPaintAnimator }, 200119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck { "nCreateRevealAnimator", "(IIFF)J", (void*) createRevealAnimator }, 201c6b3264e16f1d2b72e7f9508559981ce9970157cJohn Reck { "nSetStartValue", "(JF)V", (void*) setStartValue }, 202ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette { "nSetDuration", "(JJ)V", (void*) setDuration }, 203ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette { "nGetDuration", "(J)J", (void*) getDuration }, 204ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette { "nSetStartDelay", "(JJ)V", (void*) setStartDelay }, 205315c329544d7c593d1072b071cbb92d9afe74021John Reck { "nSetInterpolator", "(JJ)V", (void*) setInterpolator }, 206f5945a0c8bb868f978d9d0d22043a8b44464a86eJohn Reck { "nSetAllowRunningAsync", "(JZ)V", (void*) setAllowRunningAsync }, 207c47c98be04d602f331e0ea9704d2c11f8c53852dJohn Reck { "nSetListener", "(JLandroid/view/RenderNodeAnimator;)V", (void*) setListener}, 208c47c98be04d602f331e0ea9704d2c11f8c53852dJohn Reck { "nStart", "(J)V", (void*) start}, 209d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck { "nEnd", "(J)V", (void*) end }, 210e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}; 211e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 212e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckint register_android_view_RenderNodeAnimator(JNIEnv* env) { 21372d6e4facb1abd81809fdaddbe42f41ad885189cJohn Reck sLifecycleChecker.incStrong(0); 214987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gRenderNodeAnimatorClassInfo.clazz = FindClassOrDie(env, kClassPathName); 215987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gRenderNodeAnimatorClassInfo.clazz = MakeGlobalRefOrDie(env, 216987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gRenderNodeAnimatorClassInfo.clazz); 217e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 218987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gRenderNodeAnimatorClassInfo.callOnFinished = GetStaticMethodIDOrDie( 219987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe env, gRenderNodeAnimatorClassInfo.clazz, "callOnFinished", 220987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe "(Landroid/view/RenderNodeAnimator;)V"); 221e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 222987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe return RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods)); 223e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} 224e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 225e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 226e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} // namespace android 227