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.ViewGroup;
20
21
22/**
23 * Helper for static (nine patch) shadows.
24 */
25final class StaticShadowHelper {
26
27    final static StaticShadowHelper sInstance = new StaticShadowHelper();
28    boolean mSupportsShadow;
29    ShadowHelperVersionImpl mImpl;
30
31    /**
32     * Interface implemented by classes that support Shadow.
33     */
34    static interface ShadowHelperVersionImpl {
35        public void prepareParent(ViewGroup parent);
36        public Object addStaticShadow(ViewGroup shadowContainer);
37        public void setShadowFocusLevel(Object impl, float level);
38    }
39
40    /**
41     * Interface used when we do not support Shadow animations.
42     */
43    private static final class ShadowHelperStubImpl implements ShadowHelperVersionImpl {
44        ShadowHelperStubImpl() {
45        }
46
47        @Override
48        public void prepareParent(ViewGroup parent) {
49            // do nothing
50        }
51
52        @Override
53        public Object addStaticShadow(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     * Implementation used on JBMR2 (and above).
66     */
67    private static final class ShadowHelperJbmr2Impl implements ShadowHelperVersionImpl {
68        ShadowHelperJbmr2Impl() {
69        }
70
71        @Override
72        public void prepareParent(ViewGroup parent) {
73            ShadowHelperJbmr2.prepareParent(parent);
74        }
75
76        @Override
77        public Object addStaticShadow(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     * Returns the StaticShadowHelper.
89     */
90    private StaticShadowHelper() {
91        if (Build.VERSION.SDK_INT >= 21) {
92            mSupportsShadow = true;
93            mImpl = new ShadowHelperJbmr2Impl();
94        } else {
95            mSupportsShadow = false;
96            mImpl = new ShadowHelperStubImpl();
97        }
98    }
99
100    public static StaticShadowHelper getInstance() {
101        return sInstance;
102    }
103
104    public boolean supportsShadow() {
105        return mSupportsShadow;
106    }
107
108    public void prepareParent(ViewGroup parent) {
109        mImpl.prepareParent(parent);
110    }
111
112    public Object addStaticShadow(ViewGroup shadowContainer) {
113        return mImpl.addStaticShadow(shadowContainer);
114    }
115
116    public void setShadowFocusLevel(Object impl, float level) {
117        mImpl.setShadowFocusLevel(impl, level);
118    }
119}
120