1b77813a5dbce67e7ecb457e39900b82f04def8beztenghui/*
2b77813a5dbce67e7ecb457e39900b82f04def8beztenghui * Copyright (C) 2017 The Android Open Source Project
3b77813a5dbce67e7ecb457e39900b82f04def8beztenghui *
4b77813a5dbce67e7ecb457e39900b82f04def8beztenghui * Licensed under the Apache License, Version 2.0 (the "License");
5b77813a5dbce67e7ecb457e39900b82f04def8beztenghui * you may not use this file except in compliance with the License.
6b77813a5dbce67e7ecb457e39900b82f04def8beztenghui * You may obtain a copy of the License at
7b77813a5dbce67e7ecb457e39900b82f04def8beztenghui *
8b77813a5dbce67e7ecb457e39900b82f04def8beztenghui *      http://www.apache.org/licenses/LICENSE-2.0
9b77813a5dbce67e7ecb457e39900b82f04def8beztenghui *
10b77813a5dbce67e7ecb457e39900b82f04def8beztenghui * Unless required by applicable law or agreed to in writing, software
11b77813a5dbce67e7ecb457e39900b82f04def8beztenghui * distributed under the License is distributed on an "AS IS" BASIS,
12b77813a5dbce67e7ecb457e39900b82f04def8beztenghui * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b77813a5dbce67e7ecb457e39900b82f04def8beztenghui * See the License for the specific language governing permissions and
14b77813a5dbce67e7ecb457e39900b82f04def8beztenghui * limitations under the License.
15b77813a5dbce67e7ecb457e39900b82f04def8beztenghui */
16b77813a5dbce67e7ecb457e39900b82f04def8beztenghui
17b77813a5dbce67e7ecb457e39900b82f04def8beztenghuipackage android.support.graphics.drawable;
18b77813a5dbce67e7ecb457e39900b82f04def8beztenghui
19b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
20b77813a5dbce67e7ecb457e39900b82f04def8beztenghui
21b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport android.content.Context;
22b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport android.content.res.Resources;
23b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport android.content.res.Resources.NotFoundException;
24b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport android.content.res.Resources.Theme;
25b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport android.content.res.XmlResourceParser;
26b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport android.os.Build;
27b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport android.support.annotation.RestrictTo;
28b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport android.support.v4.view.animation.FastOutLinearInInterpolator;
29b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport android.support.v4.view.animation.FastOutSlowInInterpolator;
30b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport android.support.v4.view.animation.LinearOutSlowInInterpolator;
31b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport android.util.AttributeSet;
32b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport android.util.Xml;
33b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport android.view.animation.AccelerateDecelerateInterpolator;
34b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport android.view.animation.AccelerateInterpolator;
35b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport android.view.animation.AnimationUtils;
36b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport android.view.animation.AnticipateInterpolator;
37b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport android.view.animation.AnticipateOvershootInterpolator;
38b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport android.view.animation.BounceInterpolator;
39b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport android.view.animation.CycleInterpolator;
40b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport android.view.animation.DecelerateInterpolator;
41b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport android.view.animation.Interpolator;
42b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport android.view.animation.LinearInterpolator;
43b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport android.view.animation.OvershootInterpolator;
44b77813a5dbce67e7ecb457e39900b82f04def8beztenghui
45b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport org.xmlpull.v1.XmlPullParser;
46b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport org.xmlpull.v1.XmlPullParserException;
47b77813a5dbce67e7ecb457e39900b82f04def8beztenghui
48b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport java.io.IOException;
49b77813a5dbce67e7ecb457e39900b82f04def8beztenghui
50b77813a5dbce67e7ecb457e39900b82f04def8beztenghui/**
51b77813a5dbce67e7ecb457e39900b82f04def8beztenghui * Defines common utilities for working with animations.
52b77813a5dbce67e7ecb457e39900b82f04def8beztenghui * @hide
53b77813a5dbce67e7ecb457e39900b82f04def8beztenghui */
54b77813a5dbce67e7ecb457e39900b82f04def8beztenghui@RestrictTo(LIBRARY_GROUP)
55b77813a5dbce67e7ecb457e39900b82f04def8beztenghuipublic class AnimationUtilsCompat {
56b77813a5dbce67e7ecb457e39900b82f04def8beztenghui    /**
57b77813a5dbce67e7ecb457e39900b82f04def8beztenghui     * Loads an {@link Interpolator} object from a resource
58b77813a5dbce67e7ecb457e39900b82f04def8beztenghui     *
59b77813a5dbce67e7ecb457e39900b82f04def8beztenghui     * @param context Application context used to access resources
60b77813a5dbce67e7ecb457e39900b82f04def8beztenghui     * @param id      The resource id of the animation to load
61b77813a5dbce67e7ecb457e39900b82f04def8beztenghui     * @return The animation object reference by the specified id
62b77813a5dbce67e7ecb457e39900b82f04def8beztenghui     */
63b77813a5dbce67e7ecb457e39900b82f04def8beztenghui    public static Interpolator loadInterpolator(Context context, int id)
64b77813a5dbce67e7ecb457e39900b82f04def8beztenghui            throws NotFoundException {
65b77813a5dbce67e7ecb457e39900b82f04def8beztenghui        // From API 21, we added path Interpolator .
66b77813a5dbce67e7ecb457e39900b82f04def8beztenghui        if (Build.VERSION.SDK_INT >= 21) {
67b77813a5dbce67e7ecb457e39900b82f04def8beztenghui            return AnimationUtils.loadInterpolator(context, id);
68b77813a5dbce67e7ecb457e39900b82f04def8beztenghui        }
69b77813a5dbce67e7ecb457e39900b82f04def8beztenghui
70b77813a5dbce67e7ecb457e39900b82f04def8beztenghui        XmlResourceParser parser = null;
71b77813a5dbce67e7ecb457e39900b82f04def8beztenghui        try {
72b77813a5dbce67e7ecb457e39900b82f04def8beztenghui            // Special treatment for the interpolator introduced at API 21.
73b77813a5dbce67e7ecb457e39900b82f04def8beztenghui            if (id == AndroidResources.FAST_OUT_LINEAR_IN) {
74b77813a5dbce67e7ecb457e39900b82f04def8beztenghui                return new FastOutLinearInInterpolator();
75b77813a5dbce67e7ecb457e39900b82f04def8beztenghui            } else if (id == AndroidResources.FAST_OUT_SLOW_IN) {
76b77813a5dbce67e7ecb457e39900b82f04def8beztenghui                return new FastOutSlowInInterpolator();
77b77813a5dbce67e7ecb457e39900b82f04def8beztenghui            } else if (id == AndroidResources.LINEAR_OUT_SLOW_IN) {
78b77813a5dbce67e7ecb457e39900b82f04def8beztenghui                return new LinearOutSlowInInterpolator();
79b77813a5dbce67e7ecb457e39900b82f04def8beztenghui            }
80b77813a5dbce67e7ecb457e39900b82f04def8beztenghui            parser = context.getResources().getAnimation(id);
81b77813a5dbce67e7ecb457e39900b82f04def8beztenghui            return createInterpolatorFromXml(context, context.getResources(), context.getTheme(),
82b77813a5dbce67e7ecb457e39900b82f04def8beztenghui                    parser);
83b77813a5dbce67e7ecb457e39900b82f04def8beztenghui        } catch (XmlPullParserException ex) {
84b77813a5dbce67e7ecb457e39900b82f04def8beztenghui            NotFoundException rnf = new NotFoundException("Can't load animation resource ID #0x"
85b77813a5dbce67e7ecb457e39900b82f04def8beztenghui                    + Integer.toHexString(id));
86b77813a5dbce67e7ecb457e39900b82f04def8beztenghui            rnf.initCause(ex);
87b77813a5dbce67e7ecb457e39900b82f04def8beztenghui            throw rnf;
88b77813a5dbce67e7ecb457e39900b82f04def8beztenghui        } catch (IOException ex) {
89b77813a5dbce67e7ecb457e39900b82f04def8beztenghui            NotFoundException rnf = new NotFoundException("Can't load animation resource ID #0x"
90b77813a5dbce67e7ecb457e39900b82f04def8beztenghui                    + Integer.toHexString(id));
91b77813a5dbce67e7ecb457e39900b82f04def8beztenghui            rnf.initCause(ex);
92b77813a5dbce67e7ecb457e39900b82f04def8beztenghui            throw rnf;
93b77813a5dbce67e7ecb457e39900b82f04def8beztenghui        } finally {
94b77813a5dbce67e7ecb457e39900b82f04def8beztenghui            if (parser != null) parser.close();
95b77813a5dbce67e7ecb457e39900b82f04def8beztenghui        }
96b77813a5dbce67e7ecb457e39900b82f04def8beztenghui
97b77813a5dbce67e7ecb457e39900b82f04def8beztenghui    }
98b77813a5dbce67e7ecb457e39900b82f04def8beztenghui
99b77813a5dbce67e7ecb457e39900b82f04def8beztenghui    private static Interpolator createInterpolatorFromXml(Context context, Resources res,
100b77813a5dbce67e7ecb457e39900b82f04def8beztenghui            Theme theme,
101b77813a5dbce67e7ecb457e39900b82f04def8beztenghui            XmlPullParser parser)
102b77813a5dbce67e7ecb457e39900b82f04def8beztenghui            throws XmlPullParserException, IOException {
103b77813a5dbce67e7ecb457e39900b82f04def8beztenghui
104b77813a5dbce67e7ecb457e39900b82f04def8beztenghui        Interpolator interpolator = null;
105b77813a5dbce67e7ecb457e39900b82f04def8beztenghui
106b77813a5dbce67e7ecb457e39900b82f04def8beztenghui        // Make sure we are on a start tag.
107b77813a5dbce67e7ecb457e39900b82f04def8beztenghui        int type;
108b77813a5dbce67e7ecb457e39900b82f04def8beztenghui        int depth = parser.getDepth();
109b77813a5dbce67e7ecb457e39900b82f04def8beztenghui
110b77813a5dbce67e7ecb457e39900b82f04def8beztenghui        while (((type = parser.next()) != XmlPullParser.END_TAG || parser.getDepth() > depth)
111b77813a5dbce67e7ecb457e39900b82f04def8beztenghui                && type != XmlPullParser.END_DOCUMENT) {
112b77813a5dbce67e7ecb457e39900b82f04def8beztenghui
113b77813a5dbce67e7ecb457e39900b82f04def8beztenghui            if (type != XmlPullParser.START_TAG) {
114b77813a5dbce67e7ecb457e39900b82f04def8beztenghui                continue;
115b77813a5dbce67e7ecb457e39900b82f04def8beztenghui            }
116b77813a5dbce67e7ecb457e39900b82f04def8beztenghui
117b77813a5dbce67e7ecb457e39900b82f04def8beztenghui            AttributeSet attrs = Xml.asAttributeSet(parser);
118b77813a5dbce67e7ecb457e39900b82f04def8beztenghui
119b77813a5dbce67e7ecb457e39900b82f04def8beztenghui            String name = parser.getName();
120b77813a5dbce67e7ecb457e39900b82f04def8beztenghui
121b77813a5dbce67e7ecb457e39900b82f04def8beztenghui            if (name.equals("linearInterpolator")) {
122b77813a5dbce67e7ecb457e39900b82f04def8beztenghui                interpolator = new LinearInterpolator();
123b77813a5dbce67e7ecb457e39900b82f04def8beztenghui            } else if (name.equals("accelerateInterpolator")) {
124b77813a5dbce67e7ecb457e39900b82f04def8beztenghui                interpolator = new AccelerateInterpolator(context, attrs);
125b77813a5dbce67e7ecb457e39900b82f04def8beztenghui            } else if (name.equals("decelerateInterpolator")) {
126b77813a5dbce67e7ecb457e39900b82f04def8beztenghui                interpolator = new DecelerateInterpolator(context, attrs);
127b77813a5dbce67e7ecb457e39900b82f04def8beztenghui            } else if (name.equals("accelerateDecelerateInterpolator")) {
128b77813a5dbce67e7ecb457e39900b82f04def8beztenghui                interpolator = new AccelerateDecelerateInterpolator();
129b77813a5dbce67e7ecb457e39900b82f04def8beztenghui            } else if (name.equals("cycleInterpolator")) {
130b77813a5dbce67e7ecb457e39900b82f04def8beztenghui                interpolator = new CycleInterpolator(context, attrs);
131b77813a5dbce67e7ecb457e39900b82f04def8beztenghui            } else if (name.equals("anticipateInterpolator")) {
132b77813a5dbce67e7ecb457e39900b82f04def8beztenghui                interpolator = new AnticipateInterpolator(context, attrs);
133b77813a5dbce67e7ecb457e39900b82f04def8beztenghui            } else if (name.equals("overshootInterpolator")) {
134b77813a5dbce67e7ecb457e39900b82f04def8beztenghui                interpolator = new OvershootInterpolator(context, attrs);
135b77813a5dbce67e7ecb457e39900b82f04def8beztenghui            } else if (name.equals("anticipateOvershootInterpolator")) {
136b77813a5dbce67e7ecb457e39900b82f04def8beztenghui                interpolator = new AnticipateOvershootInterpolator(context, attrs);
137b77813a5dbce67e7ecb457e39900b82f04def8beztenghui            } else if (name.equals("bounceInterpolator")) {
138b77813a5dbce67e7ecb457e39900b82f04def8beztenghui                interpolator = new BounceInterpolator();
139b77813a5dbce67e7ecb457e39900b82f04def8beztenghui            } else if (name.equals("pathInterpolator")) {
140b77813a5dbce67e7ecb457e39900b82f04def8beztenghui                interpolator = new PathInterpolatorCompat(context, attrs, parser);
141b77813a5dbce67e7ecb457e39900b82f04def8beztenghui            } else {
142b77813a5dbce67e7ecb457e39900b82f04def8beztenghui                throw new RuntimeException("Unknown interpolator name: " + parser.getName());
143b77813a5dbce67e7ecb457e39900b82f04def8beztenghui            }
144b77813a5dbce67e7ecb457e39900b82f04def8beztenghui        }
145b77813a5dbce67e7ecb457e39900b82f04def8beztenghui        return interpolator;
146b77813a5dbce67e7ecb457e39900b82f04def8beztenghui    }
147b77813a5dbce67e7ecb457e39900b82f04def8beztenghui}
148