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