ShadowHelper.java revision 19312c5f247559a9483d874e62150c49d36aa478
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.content.Context;
17import android.os.Build;
18import android.view.ViewGroup;
19
20
21/**
22 * Helper for shadow.
23 */
24final class ShadowHelper {
25
26    final static ShadowHelper sInstance = new ShadowHelper();
27    boolean mSupportsShadow;
28    ShadowHelperVersionImpl mImpl;
29
30    /**
31     * Interface implemented by classes that support Shadow.
32     */
33    static interface ShadowHelperVersionImpl {
34
35        public void prepareParent(ViewGroup parent);
36
37        public Object addShadow(ViewGroup shadowContainer);
38
39        public void setShadowFocusLevel(Object impl, float level);
40
41    }
42
43    /**
44     * Interface used when we do not support Shadow animations.
45     */
46    private static final class ShadowHelperStubImpl implements ShadowHelperVersionImpl {
47
48        @Override
49        public void prepareParent(ViewGroup parent) {
50            // do nothing
51        }
52
53        @Override
54        public Object addShadow(ViewGroup shadowContainer) {
55            // do nothing
56            return null;
57        }
58
59        @Override
60        public void setShadowFocusLevel(Object impl, float level) {
61            // do nothing
62        }
63
64    }
65
66    /**
67     * Implementation used on JBMR2 (and above).
68     */
69    private static final class ShadowHelperJbmr2Impl implements ShadowHelperVersionImpl {
70
71        @Override
72        public void prepareParent(ViewGroup parent) {
73            ShadowHelperJbmr2.prepareParent(parent);
74        }
75
76        @Override
77        public Object addShadow(ViewGroup shadowContainer) {
78            return ShadowHelperJbmr2.addShadow(shadowContainer);
79        }
80
81        @Override
82        public void setShadowFocusLevel(Object impl, float level) {
83            ShadowHelperJbmr2.setShadowFocusLevel(impl, level);
84        }
85
86    }
87
88    /**
89     * Implementation used on api 21 (and above).
90     */
91    private static final class ShadowHelperApi21Impl implements ShadowHelperVersionImpl {
92
93        @Override
94        public void prepareParent(ViewGroup parent) {
95            // do nothing
96        }
97
98        @Override
99        public Object addShadow(ViewGroup shadowContainer) {
100            return ShadowHelperApi21.addShadow(shadowContainer);
101        }
102
103        @Override
104        public void setShadowFocusLevel(Object impl, float level) {
105            ShadowHelperApi21.setShadowFocusLevel(impl, level);
106        }
107
108    }
109
110    /**
111     * Returns the ShadowHelper.
112     */
113    private ShadowHelper() {
114     // TODO: we should use version number once "L" is published
115        if ("L".equals(Build.VERSION.RELEASE)) {
116            mSupportsShadow = true;
117            mImpl = new ShadowHelperApi21Impl();
118        } else if (Build.VERSION.SDK_INT >= 18) {
119            mSupportsShadow = true;
120            mImpl = new ShadowHelperJbmr2Impl();
121        } else {
122            mSupportsShadow = false;
123            mImpl = new ShadowHelperStubImpl();
124        }
125    }
126
127    public static ShadowHelper getInstance() {
128        return sInstance;
129    }
130
131    public boolean supportsShadow() {
132        return mSupportsShadow;
133    }
134
135    public void prepareParent(ViewGroup parent) {
136        mImpl.prepareParent(parent);
137    }
138
139    public Object addShadow(ViewGroup shadowContainer) {
140        return mImpl.addShadow(shadowContainer);
141    }
142
143    public void setShadowFocusLevel(Object impl, float level) {
144        mImpl.setShadowFocusLevel(impl, level);
145    }
146}
147