1ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez/*
2ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez * Copyright (C) 2016 The Android Open Source Project
3ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez *
4ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez * Licensed under the Apache License, Version 2.0 (the "License");
5ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez * you may not use this file except in compliance with the License.
6ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez * You may obtain a copy of the License at
7ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez *
8ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez *      http://www.apache.org/licenses/LICENSE-2.0
9ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez *
10ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez * Unless required by applicable law or agreed to in writing, software
11ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez * distributed under the License is distributed on an "AS IS" BASIS,
12ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez * See the License for the specific language governing permissions and
14ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez * limitations under the License.
15ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez */
16ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez
17ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perezpackage com.android.internal.view.animation;
18ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez
19ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perezimport com.android.layoutlib.bridge.impl.DelegateManager;
20ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perezimport com.android.tools.layoutlib.annotations.LayoutlibDelegate;
21ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez
22d4a724a24f1aef905b6938c50ff14553c13083c0Jerome Gaillardimport android.graphics.Path;
23ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perezimport android.util.MathUtils;
24ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perezimport android.view.animation.AccelerateDecelerateInterpolator;
25ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perezimport android.view.animation.AccelerateInterpolator;
26ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perezimport android.view.animation.AnticipateInterpolator;
27ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perezimport android.view.animation.AnticipateOvershootInterpolator;
28ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perezimport android.view.animation.BaseInterpolator;
29ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perezimport android.view.animation.BounceInterpolator;
30ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perezimport android.view.animation.CycleInterpolator;
31ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perezimport android.view.animation.DecelerateInterpolator;
32ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perezimport android.view.animation.Interpolator;
33ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perezimport android.view.animation.LinearInterpolator;
34ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perezimport android.view.animation.OvershootInterpolator;
35d4a724a24f1aef905b6938c50ff14553c13083c0Jerome Gaillardimport android.view.animation.PathInterpolator;
36ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez
37ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez/**
38ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez * Delegate used to provide new implementation of a select few methods of {@link
39ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez * NativeInterpolatorFactoryHelper}
40ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez * <p>
41ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez * Through the layoutlib_create tool, the original  methods of NativeInterpolatorFactoryHelper have
42ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez * been replaced by calls to methods of the same name in this delegate class.
43ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez */
44ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez@SuppressWarnings("unused")
45ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perezpublic class NativeInterpolatorFactoryHelper_Delegate {
46ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    private static final DelegateManager<Interpolator> sManager = new DelegateManager<>
47ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez            (Interpolator.class);
48ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez
49ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    public static Interpolator getDelegate(long nativePtr) {
50ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez        return sManager.getDelegate(nativePtr);
51ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    }
52ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez
53ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    @LayoutlibDelegate
54ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    /*package*/ static long createAccelerateDecelerateInterpolator() {
55ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez        return sManager.addNewDelegate(new AccelerateDecelerateInterpolator());
56ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    }
57ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez
58ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    @LayoutlibDelegate
59ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    /*package*/ static long createAccelerateInterpolator(float factor) {
60ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez        return sManager.addNewDelegate(new AccelerateInterpolator(factor));
61ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    }
62ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez
63ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    @LayoutlibDelegate
64ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    /*package*/ static long createAnticipateInterpolator(float tension) {
65ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez        return sManager.addNewDelegate(new AnticipateInterpolator(tension));
66ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    }
67ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez
68ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    @LayoutlibDelegate
69ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    /*package*/ static long createAnticipateOvershootInterpolator(float tension) {
70ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez        return sManager.addNewDelegate(new AnticipateOvershootInterpolator(tension));
71ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    }
72ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez
73ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    @LayoutlibDelegate
74ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    /*package*/ static long createBounceInterpolator() {
75ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez        return sManager.addNewDelegate(new BounceInterpolator());
76ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    }
77ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez
78ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    @LayoutlibDelegate
79ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    /*package*/ static long createCycleInterpolator(float cycles) {
80ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez        return sManager.addNewDelegate(new CycleInterpolator(cycles));
81ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    }
82ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez
83ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    @LayoutlibDelegate
84ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    /*package*/ static long createDecelerateInterpolator(float factor) {
85ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez        return sManager.addNewDelegate(new DecelerateInterpolator(factor));
86ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    }
87ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez
88ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    @LayoutlibDelegate
89ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    /*package*/ static long createLinearInterpolator() {
90ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez        return sManager.addNewDelegate(new LinearInterpolator());
91ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    }
92ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez
93ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    @LayoutlibDelegate
94ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    /*package*/ static long createOvershootInterpolator(float tension) {
95ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez        return sManager.addNewDelegate(new OvershootInterpolator(tension));
96ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    }
97ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez
98d4a724a24f1aef905b6938c50ff14553c13083c0Jerome Gaillard    @LayoutlibDelegate
99d4a724a24f1aef905b6938c50ff14553c13083c0Jerome Gaillard    /*package*/ static long createPathInterpolator(float[] x, float[] y) {
100d4a724a24f1aef905b6938c50ff14553c13083c0Jerome Gaillard        Path path = new Path();
101d4a724a24f1aef905b6938c50ff14553c13083c0Jerome Gaillard        path.moveTo(x[0], y[0]);
102d4a724a24f1aef905b6938c50ff14553c13083c0Jerome Gaillard        for (int i = 1; i < x.length; i++) {
103d4a724a24f1aef905b6938c50ff14553c13083c0Jerome Gaillard            path.lineTo(x[i], y[i]);
104d4a724a24f1aef905b6938c50ff14553c13083c0Jerome Gaillard        }
105d4a724a24f1aef905b6938c50ff14553c13083c0Jerome Gaillard        return sManager.addNewDelegate(new PathInterpolator(path));
106d4a724a24f1aef905b6938c50ff14553c13083c0Jerome Gaillard    }
107d4a724a24f1aef905b6938c50ff14553c13083c0Jerome Gaillard
108ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    private static class LutInterpolator extends BaseInterpolator {
109ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez        private final float[] mValues;
110ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez        private final int mSize;
111ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez
112ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez        private LutInterpolator(float[] values) {
113ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez            mValues = values;
114ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez            mSize = mValues.length;
115ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez        }
116ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez
117ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez        @Override
118ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez        public float getInterpolation(float input) {
119d9335203787401aa894544a1dd275fefa37535ecDoris Liu            float lutpos = input * (mSize - 1);
120ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez            if (lutpos >= (mSize - 1)) {
121ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez                return mValues[mSize - 1];
122ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez            }
123ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez
124ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez            int ipart = (int) lutpos;
125ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez            float weight = lutpos - ipart;
126ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez
127ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez            int i1 = ipart;
128ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez            int i2 = Math.min(i1 + 1, mSize - 1);
129ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez
130ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez            assert i1 >= 0 && i2 >= 0 : "Negatives in the interpolation";
131ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez
132ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez            return MathUtils.lerp(mValues[i1], mValues[i2], weight);
133ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez        }
134ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    }
135ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez
136ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    @LayoutlibDelegate
137ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    /*package*/ static long createLutInterpolator(float[] values) {
138ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez        return sManager.addNewDelegate(new LutInterpolator(values));
139ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    }
140ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez}
141