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