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