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.View;
20f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stoutimport android.view.ViewGroup;
21f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout
22f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout
23f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout/**
24f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout * Helper for static (nine patch) shadows.
25f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout */
26f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stoutfinal class StaticShadowHelper {
27f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout
28f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout    final static StaticShadowHelper sInstance = new StaticShadowHelper();
29f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout    boolean mSupportsShadow;
30f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout    ShadowHelperVersionImpl mImpl;
31f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout
32f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout    /**
33f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout     * Interface implemented by classes that support Shadow.
34f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout     */
35f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout    static interface ShadowHelperVersionImpl {
36f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout        public void prepareParent(ViewGroup parent);
37254b417129de2a8c5612826a152f8a26c8f1d0e8Dake Gu        public Object addStaticShadow(ViewGroup shadowContainer);
38f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout        public void setShadowFocusLevel(Object impl, float level);
39f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout    }
40f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout
41f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout    /**
42f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout     * Interface used when we do not support Shadow animations.
43f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout     */
44f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout    private static final class ShadowHelperStubImpl implements ShadowHelperVersionImpl {
4599ec8b0cb375f7e5577ea3ec9f09e6ff7a95de0dAurimas Liutikas        ShadowHelperStubImpl() {
4699ec8b0cb375f7e5577ea3ec9f09e6ff7a95de0dAurimas Liutikas        }
4799ec8b0cb375f7e5577ea3ec9f09e6ff7a95de0dAurimas Liutikas
48f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout        @Override
49f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout        public void prepareParent(ViewGroup parent) {
50f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout            // do nothing
51f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout        }
52f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout
53f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout        @Override
54254b417129de2a8c5612826a152f8a26c8f1d0e8Dake Gu        public Object addStaticShadow(ViewGroup shadowContainer) {
55f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout            // do nothing
56f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout            return null;
57f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout        }
58f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout
59f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout        @Override
60f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout        public void setShadowFocusLevel(Object impl, float level) {
61f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout            // do nothing
62f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout        }
63f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout    }
64f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout
65f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout    /**
66f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout     * Implementation used on JBMR2 (and above).
67f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout     */
68f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout    private static final class ShadowHelperJbmr2Impl implements ShadowHelperVersionImpl {
6999ec8b0cb375f7e5577ea3ec9f09e6ff7a95de0dAurimas Liutikas        ShadowHelperJbmr2Impl() {
7099ec8b0cb375f7e5577ea3ec9f09e6ff7a95de0dAurimas Liutikas        }
7199ec8b0cb375f7e5577ea3ec9f09e6ff7a95de0dAurimas Liutikas
72f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout        @Override
73f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout        public void prepareParent(ViewGroup parent) {
74f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout            ShadowHelperJbmr2.prepareParent(parent);
75f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout        }
76f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout
77f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout        @Override
78254b417129de2a8c5612826a152f8a26c8f1d0e8Dake Gu        public Object addStaticShadow(ViewGroup shadowContainer) {
79f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout            return ShadowHelperJbmr2.addShadow(shadowContainer);
80f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout        }
81f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout
82f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout        @Override
83f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout        public void setShadowFocusLevel(Object impl, float level) {
84f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout            ShadowHelperJbmr2.setShadowFocusLevel(impl, level);
85f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout        }
86f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout    }
87f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout
88f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout    /**
89f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout     * Returns the StaticShadowHelper.
90f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout     */
91f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout    private StaticShadowHelper() {
92b7c09c22aa6e2edf28335894e5fff4f2b7a30175Dake Gu        if (Build.VERSION.SDK_INT >= 21) {
93f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout            mSupportsShadow = true;
94f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout            mImpl = new ShadowHelperJbmr2Impl();
95f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout        } else {
96f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout            mSupportsShadow = false;
97f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout            mImpl = new ShadowHelperStubImpl();
98f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout        }
99f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout    }
100f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout
101f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout    public static StaticShadowHelper getInstance() {
102f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout        return sInstance;
103f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout    }
104f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout
105f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout    public boolean supportsShadow() {
106f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout        return mSupportsShadow;
107f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout    }
108f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout
109f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout    public void prepareParent(ViewGroup parent) {
110f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout        mImpl.prepareParent(parent);
111f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout    }
112f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout
113254b417129de2a8c5612826a152f8a26c8f1d0e8Dake Gu    public Object addStaticShadow(ViewGroup shadowContainer) {
114254b417129de2a8c5612826a152f8a26c8f1d0e8Dake Gu        return mImpl.addStaticShadow(shadowContainer);
115f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout    }
116f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout
117f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout    public void setShadowFocusLevel(Object impl, float level) {
118f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout        mImpl.setShadowFocusLevel(impl, level);
119f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout    }
120f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout}
121