StaticShadowHelper.java revision 99ec8b0cb375f7e5577ea3ec9f09e6ff7a95de0d
1/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License
15 */
16package android.support.v17.leanback.widget;
17
18import android.os.Build;
19import android.view.View;
20import android.view.ViewGroup;
21
22
23/**
24 * Helper for static (nine patch) shadows.
25 */
26final class StaticShadowHelper {
27
28    final static StaticShadowHelper sInstance = new StaticShadowHelper();
29    boolean mSupportsShadow;
30    ShadowHelperVersionImpl mImpl;
31
32    /**
33     * Interface implemented by classes that support Shadow.
34     */
35    static interface ShadowHelperVersionImpl {
36        public void prepareParent(ViewGroup parent);
37        public Object addStaticShadow(ViewGroup shadowContainer);
38        public void setShadowFocusLevel(Object impl, float level);
39    }
40
41    /**
42     * Interface used when we do not support Shadow animations.
43     */
44    private static final class ShadowHelperStubImpl implements ShadowHelperVersionImpl {
45        ShadowHelperStubImpl() {
46        }
47
48        @Override
49        public void prepareParent(ViewGroup parent) {
50            // do nothing
51        }
52
53        @Override
54        public Object addStaticShadow(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     * Implementation used on JBMR2 (and above).
67     */
68    private static final class ShadowHelperJbmr2Impl implements ShadowHelperVersionImpl {
69        ShadowHelperJbmr2Impl() {
70        }
71
72        @Override
73        public void prepareParent(ViewGroup parent) {
74            ShadowHelperJbmr2.prepareParent(parent);
75        }
76
77        @Override
78        public Object addStaticShadow(ViewGroup shadowContainer) {
79            return ShadowHelperJbmr2.addShadow(shadowContainer);
80        }
81
82        @Override
83        public void setShadowFocusLevel(Object impl, float level) {
84            ShadowHelperJbmr2.setShadowFocusLevel(impl, level);
85        }
86    }
87
88    /**
89     * Returns the StaticShadowHelper.
90     */
91    private StaticShadowHelper() {
92        if (Build.VERSION.SDK_INT >= 21) {
93            mSupportsShadow = true;
94            mImpl = new ShadowHelperJbmr2Impl();
95        } else {
96            mSupportsShadow = false;
97            mImpl = new ShadowHelperStubImpl();
98        }
99    }
100
101    public static StaticShadowHelper getInstance() {
102        return sInstance;
103    }
104
105    public boolean supportsShadow() {
106        return mSupportsShadow;
107    }
108
109    public void prepareParent(ViewGroup parent) {
110        mImpl.prepareParent(parent);
111    }
112
113    public Object addStaticShadow(ViewGroup shadowContainer) {
114        return mImpl.addStaticShadow(shadowContainer);
115    }
116
117    public void setShadowFocusLevel(Object impl, float level) {
118        mImpl.setShadowFocusLevel(impl, level);
119    }
120}
121