18a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez/*
28a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez * Copyright (C) 2016 The Android Open Source Project
38a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez *
48a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez * Licensed under the Apache License, Version 2.0 (the "License");
58a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez * you may not use this file except in compliance with the License.
68a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez * You may obtain a copy of the License at
78a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez *
88a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez *      http://www.apache.org/licenses/LICENSE-2.0
98a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez *
108a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez * Unless required by applicable law or agreed to in writing, software
118a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez * distributed under the License is distributed on an "AS IS" BASIS,
128a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez * See the License for the specific language governing permissions and
148a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez * limitations under the License.
158a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez */
168a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez
178a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perezpackage com.android.internal.view.animation;
188a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez
198a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perezimport com.android.layoutlib.bridge.impl.DelegateManager;
208a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perezimport com.android.tools.layoutlib.annotations.LayoutlibDelegate;
218a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez
228a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perezimport android.util.MathUtils;
238a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perezimport android.view.animation.AccelerateDecelerateInterpolator;
248a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perezimport android.view.animation.AccelerateInterpolator;
258a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perezimport android.view.animation.AnticipateInterpolator;
268a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perezimport android.view.animation.AnticipateOvershootInterpolator;
278a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perezimport android.view.animation.BaseInterpolator;
288a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perezimport android.view.animation.BounceInterpolator;
298a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perezimport android.view.animation.CycleInterpolator;
308a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perezimport android.view.animation.DecelerateInterpolator;
318a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perezimport android.view.animation.Interpolator;
328a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perezimport android.view.animation.LinearInterpolator;
338a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perezimport android.view.animation.OvershootInterpolator;
348a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez
358a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez/**
368a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez * Delegate used to provide new implementation of a select few methods of {@link
378a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez * NativeInterpolatorFactoryHelper}
388a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez * <p>
398a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez * Through the layoutlib_create tool, the original  methods of NativeInterpolatorFactoryHelper have
408a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez * been replaced by calls to methods of the same name in this delegate class.
418a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez */
428a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez@SuppressWarnings("unused")
438a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perezpublic class NativeInterpolatorFactoryHelper_Delegate {
448a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez    private static final DelegateManager<Interpolator> sManager = new DelegateManager<>
458a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez            (Interpolator.class);
468a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez
478a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez    public static Interpolator getDelegate(long nativePtr) {
488a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez        return sManager.getDelegate(nativePtr);
498a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez    }
508a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez
518a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez    @LayoutlibDelegate
528a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez    /*package*/ static long createAccelerateDecelerateInterpolator() {
538a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez        return sManager.addNewDelegate(new AccelerateDecelerateInterpolator());
548a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez    }
558a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez
568a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez    @LayoutlibDelegate
578a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez    /*package*/ static long createAccelerateInterpolator(float factor) {
588a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez        return sManager.addNewDelegate(new AccelerateInterpolator(factor));
598a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez    }
608a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez
618a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez    @LayoutlibDelegate
628a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez    /*package*/ static long createAnticipateInterpolator(float tension) {
638a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez        return sManager.addNewDelegate(new AnticipateInterpolator(tension));
648a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez    }
658a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez
668a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez    @LayoutlibDelegate
678a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez    /*package*/ static long createAnticipateOvershootInterpolator(float tension) {
688a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez        return sManager.addNewDelegate(new AnticipateOvershootInterpolator(tension));
698a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez    }
708a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez
718a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez    @LayoutlibDelegate
728a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez    /*package*/ static long createBounceInterpolator() {
738a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez        return sManager.addNewDelegate(new BounceInterpolator());
748a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez    }
758a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez
768a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez    @LayoutlibDelegate
778a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez    /*package*/ static long createCycleInterpolator(float cycles) {
788a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez        return sManager.addNewDelegate(new CycleInterpolator(cycles));
798a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez    }
808a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez
818a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez    @LayoutlibDelegate
828a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez    /*package*/ static long createDecelerateInterpolator(float factor) {
838a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez        return sManager.addNewDelegate(new DecelerateInterpolator(factor));
848a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez    }
858a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez
868a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez    @LayoutlibDelegate
878a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez    /*package*/ static long createLinearInterpolator() {
888a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez        return sManager.addNewDelegate(new LinearInterpolator());
898a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez    }
908a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez
918a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez    @LayoutlibDelegate
928a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez    /*package*/ static long createOvershootInterpolator(float tension) {
938a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez        return sManager.addNewDelegate(new OvershootInterpolator(tension));
948a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez    }
958a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez
968a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez    private static class LutInterpolator extends BaseInterpolator {
978a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez        private final float[] mValues;
988a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez        private final int mSize;
998a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez
1008a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez        private LutInterpolator(float[] values) {
1018a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez            mValues = values;
1028a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez            mSize = mValues.length;
1038a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez        }
1048a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez
1058a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez        @Override
1068a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez        public float getInterpolation(float input) {
1070940834c8cc024985f20bbdd19fb32c73ccb25f2Doris Liu            float lutpos = input * (mSize - 1);
1088a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez            if (lutpos >= (mSize - 1)) {
1098a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez                return mValues[mSize - 1];
1108a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez            }
1118a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez
1128a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez            int ipart = (int) lutpos;
1138a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez            float weight = lutpos - ipart;
1148a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez
1158a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez            int i1 = ipart;
1168a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez            int i2 = Math.min(i1 + 1, mSize - 1);
1178a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez
1188a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez            assert i1 >= 0 && i2 >= 0 : "Negatives in the interpolation";
1198a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez
1208a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez            return MathUtils.lerp(mValues[i1], mValues[i2], weight);
1218a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez        }
1228a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez    }
1238a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez
1248a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez    @LayoutlibDelegate
1258a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez    /*package*/ static long createLutInterpolator(float[] values) {
1268a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez        return sManager.addNewDelegate(new LutInterpolator(values));
1278a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez    }
1288a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez}
129