ShadowHelper.java revision adf55abedd17eb9484d03da4b521209f15724f1f
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);
39
40        public void setZ(View view, float focusLevel);
41
42        public void clearZ(View view);
43
44        public void setShadowFocusLevel(Object impl, float level);
45
46    }
47
48    /**
49     * Interface used when we do not support Shadow animations.
50     */
51    private static final class ShadowHelperStubImpl implements ShadowHelperVersionImpl {
52
53        @Override
54        public void prepareParent(ViewGroup parent) {
55            // do nothing
56        }
57
58        @Override
59        public Object addShadow(ViewGroup shadowContainer) {
60            // do nothing
61            return null;
62        }
63
64        @Override
65        public void setShadowFocusLevel(Object impl, float level) {
66            // do nothing
67        }
68
69        @Override
70        public void setZ(View view, float focusLevel) {
71            // do nothing
72        }
73
74        @Override
75        public void clearZ(View view) {
76            // do nothing
77        }
78
79    }
80
81    /**
82     * Implementation used on JBMR2 (and above).
83     */
84    private static final class ShadowHelperJbmr2Impl implements ShadowHelperVersionImpl {
85
86        @Override
87        public void prepareParent(ViewGroup parent) {
88            ShadowHelperJbmr2.prepareParent(parent);
89        }
90
91        @Override
92        public Object addShadow(ViewGroup shadowContainer) {
93            return ShadowHelperJbmr2.addShadow(shadowContainer);
94        }
95
96        @Override
97        public void setShadowFocusLevel(Object impl, float level) {
98            ShadowHelperJbmr2.setShadowFocusLevel(impl, level);
99        }
100
101        @Override
102        public void setZ(View view, float focusLevel) {
103            // Not supported
104        }
105
106        @Override
107        public void clearZ(View view) {
108            // Not supported
109        }
110
111    }
112
113    /**
114     * Implementation used on api 21 (and above).
115     */
116    private static final class ShadowHelperApi21Impl implements ShadowHelperVersionImpl {
117
118        @Override
119        public void prepareParent(ViewGroup parent) {
120            // do nothing
121        }
122
123        @Override
124        public Object addShadow(ViewGroup shadowContainer) {
125            return ShadowHelperApi21.addShadow(shadowContainer);
126        }
127
128        @Override
129        public void setShadowFocusLevel(Object impl, float level) {
130            ShadowHelperApi21.setShadowFocusLevel(impl, level);
131        }
132
133        @Override
134        public void setZ(View view, float focusLevel) {
135            ShadowHelperApi21.setZ(view, focusLevel);
136        }
137
138        @Override
139        public void clearZ(View view) {
140            ShadowHelperApi21.clearZ(view);
141        }
142
143    }
144
145    /**
146     * Returns the ShadowHelper.
147     */
148    private ShadowHelper() {
149     // TODO: we should use version number once "L" is published
150        if ("L".equals(Build.VERSION.RELEASE)) {
151            mSupportsShadow = true;
152            mUsesZShadow = true;
153            mImpl = new ShadowHelperApi21Impl();
154        } else if (Build.VERSION.SDK_INT >= 18) {
155            mSupportsShadow = true;
156            mImpl = new ShadowHelperJbmr2Impl();
157        } else {
158            mSupportsShadow = false;
159            mImpl = new ShadowHelperStubImpl();
160        }
161    }
162
163    public static ShadowHelper getInstance() {
164        return sInstance;
165    }
166
167    public boolean supportsShadow() {
168        return mSupportsShadow;
169    }
170
171    public boolean usesZShadow() {
172        return mUsesZShadow;
173    }
174
175    public void prepareParent(ViewGroup parent) {
176        mImpl.prepareParent(parent);
177    }
178
179    public Object addShadow(ViewGroup shadowContainer) {
180        return mImpl.addShadow(shadowContainer);
181    }
182
183    public void setShadowFocusLevel(Object impl, float level) {
184        mImpl.setShadowFocusLevel(impl, level);
185    }
186
187    /**
188     * Set the view z coordinate with the given focus level from 0..1.
189     */
190    public void setZ(View view, float focusLevel) {
191        mImpl.setZ(view, focusLevel);
192    }
193
194    public void clearZ(View view) {
195        mImpl.clearZ(view);
196    }
197}
198