1/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5 * in compliance with the License. You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software distributed under the License
10 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11 * or implied. See the License for the specific language governing permissions and limitations under
12 * the License.
13 */
14package android.support.v17.leanback.widget;
15
16import android.os.Build;
17import android.view.ViewGroup;
18import android.view.View;
19
20
21/**
22 * Helper for shadow.
23 */
24final class ShadowHelper {
25
26    final static ShadowHelper sInstance = new ShadowHelper();
27    boolean mSupportsShadow;
28    boolean mUsesZShadow;
29    ShadowHelperVersionImpl mImpl;
30
31    /**
32     * Interface implemented by classes that support Shadow.
33     */
34    static interface ShadowHelperVersionImpl {
35
36        public void prepareParent(ViewGroup parent);
37
38        public Object addShadow(ViewGroup shadowContainer, boolean roundedCorners);
39
40        public void setZ(View view, float z);
41
42        public void setShadowFocusLevel(Object impl, float level);
43
44    }
45
46    /**
47     * Interface used when we do not support Shadow animations.
48     */
49    private static final class ShadowHelperStubImpl implements ShadowHelperVersionImpl {
50
51        @Override
52        public void prepareParent(ViewGroup parent) {
53            // do nothing
54        }
55
56        @Override
57        public Object addShadow(ViewGroup shadowContainer, boolean roundedCorners) {
58            // do nothing
59            return null;
60        }
61
62        @Override
63        public void setShadowFocusLevel(Object impl, float level) {
64            // do nothing
65        }
66
67        @Override
68        public void setZ(View view, float z) {
69            // do nothing
70        }
71
72    }
73
74    /**
75     * Implementation used on JBMR2 (and above).
76     */
77    private static final class ShadowHelperJbmr2Impl implements ShadowHelperVersionImpl {
78
79        @Override
80        public void prepareParent(ViewGroup parent) {
81            ShadowHelperJbmr2.prepareParent(parent);
82        }
83
84        @Override
85        public Object addShadow(ViewGroup shadowContainer, boolean roundedCorners) {
86            // Rounded corners not supported
87            return ShadowHelperJbmr2.addShadow(shadowContainer);
88        }
89
90        @Override
91        public void setShadowFocusLevel(Object impl, float level) {
92            ShadowHelperJbmr2.setShadowFocusLevel(impl, level);
93        }
94
95        @Override
96        public void setZ(View view, float z) {
97            // Not supported
98        }
99
100    }
101
102    /**
103     * Implementation used on api 21 (and above).
104     */
105    private static final class ShadowHelperApi21Impl implements ShadowHelperVersionImpl {
106
107        @Override
108        public void prepareParent(ViewGroup parent) {
109            // do nothing
110        }
111
112        @Override
113        public Object addShadow(ViewGroup shadowContainer, boolean roundedCorners) {
114            return ShadowHelperApi21.addShadow(shadowContainer, roundedCorners);
115        }
116
117        @Override
118        public void setShadowFocusLevel(Object impl, float level) {
119            ShadowHelperApi21.setShadowFocusLevel(impl, level);
120        }
121
122        @Override
123        public void setZ(View view, float z) {
124            ShadowHelperApi21.setZ(view, z);
125        }
126
127    }
128
129    /**
130     * Returns the ShadowHelper.
131     */
132    private ShadowHelper() {
133        if (Build.VERSION.SDK_INT >= 21) {
134            mSupportsShadow = true;
135            mUsesZShadow = true;
136            mImpl = new ShadowHelperApi21Impl();
137        } else if (Build.VERSION.SDK_INT >= 18) {
138            mSupportsShadow = true;
139            mImpl = new ShadowHelperJbmr2Impl();
140        } else {
141            mSupportsShadow = false;
142            mImpl = new ShadowHelperStubImpl();
143        }
144    }
145
146    public static ShadowHelper getInstance() {
147        return sInstance;
148    }
149
150    public boolean supportsShadow() {
151        return mSupportsShadow;
152    }
153
154    public boolean usesZShadow() {
155        return mUsesZShadow;
156    }
157
158    public void prepareParent(ViewGroup parent) {
159        mImpl.prepareParent(parent);
160    }
161
162    public Object addShadow(ViewGroup shadowContainer, boolean roundedCorners) {
163        return mImpl.addShadow(shadowContainer, roundedCorners);
164    }
165
166    public void setShadowFocusLevel(Object impl, float level) {
167        mImpl.setShadowFocusLevel(impl, level);
168    }
169
170    /**
171     * Set the view z coordinate.
172     */
173    public void setZ(View view, float z) {
174        mImpl.setZ(view, z);
175    }
176
177}
178