ShadowHelper.java revision 0fcad32410ad29031630bb9cc2da35d33a4aa906
1dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu/*
2dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu * Copyright (C) 2014 The Android Open Source Project
3dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu *
4dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu * in compliance with the License. You may obtain a copy of the License at
6dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu *
7dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu * http://www.apache.org/licenses/LICENSE-2.0
8dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu *
9dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu * Unless required by applicable law or agreed to in writing, software distributed under the License
10dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu * or implied. See the License for the specific language governing permissions and limitations under
12dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu * the License.
13dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu */
14dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gupackage android.support.v17.leanback.widget;
15dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
16dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Guimport android.os.Build;
17dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Guimport android.view.ViewGroup;
1869e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stoutimport android.view.View;
19dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
20dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
21dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu/**
22dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu * Helper for shadow.
23dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu */
24dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gufinal class ShadowHelper {
25dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
26dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    final static ShadowHelper sInstance = new ShadowHelper();
27dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    boolean mSupportsShadow;
280fcad32410ad29031630bb9cc2da35d33a4aa906Dake Gu    boolean mUsesZShadow;
29dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    ShadowHelperVersionImpl mImpl;
30dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
31dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    /**
32dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu     * Interface implemented by classes that support Shadow.
33dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu     */
34dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    static interface ShadowHelperVersionImpl {
35dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
36dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        public void prepareParent(ViewGroup parent);
37dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
38dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        public Object addShadow(ViewGroup shadowContainer);
39dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
4069e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout        public void setZ(View view, float focusLevel);
4169e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout
42dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        public void setShadowFocusLevel(Object impl, float level);
43dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
44dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    }
45dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
46dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    /**
47dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu     * Interface used when we do not support Shadow animations.
48dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu     */
49dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    private static final class ShadowHelperStubImpl implements ShadowHelperVersionImpl {
50dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
51dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        @Override
52dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        public void prepareParent(ViewGroup parent) {
53dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu            // do nothing
54dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        }
55dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
56dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        @Override
57dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        public Object addShadow(ViewGroup shadowContainer) {
58dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu            // do nothing
59dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu            return null;
60dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        }
61dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
62dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        @Override
63dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        public void setShadowFocusLevel(Object impl, float level) {
64dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu            // do nothing
65dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        }
66dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
6769e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout        @Override
6869e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout        public void setZ(View view, float focusLevel) {
6969e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout            // do nothing
7069e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout        }
7169e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout
72dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    }
73dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
74dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    /**
75dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu     * Implementation used on JBMR2 (and above).
76dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu     */
77dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    private static final class ShadowHelperJbmr2Impl implements ShadowHelperVersionImpl {
78dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
79dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        @Override
80dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        public void prepareParent(ViewGroup parent) {
81dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu            ShadowHelperJbmr2.prepareParent(parent);
82dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        }
83dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
84dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        @Override
85dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        public Object addShadow(ViewGroup shadowContainer) {
86dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu            return ShadowHelperJbmr2.addShadow(shadowContainer);
87dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        }
88dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
89dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        @Override
90dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        public void setShadowFocusLevel(Object impl, float level) {
91dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu            ShadowHelperJbmr2.setShadowFocusLevel(impl, level);
92dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        }
93dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
9469e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout        @Override
9569e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout        public void setZ(View view, float focusLevel) {
9669e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout            // Not supported
9769e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout        }
9869e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout
99dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    }
100dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
101dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    /**
10219312c5f247559a9483d874e62150c49d36aa478Dake Gu     * Implementation used on api 21 (and above).
10319312c5f247559a9483d874e62150c49d36aa478Dake Gu     */
10419312c5f247559a9483d874e62150c49d36aa478Dake Gu    private static final class ShadowHelperApi21Impl implements ShadowHelperVersionImpl {
10519312c5f247559a9483d874e62150c49d36aa478Dake Gu
10619312c5f247559a9483d874e62150c49d36aa478Dake Gu        @Override
10719312c5f247559a9483d874e62150c49d36aa478Dake Gu        public void prepareParent(ViewGroup parent) {
10819312c5f247559a9483d874e62150c49d36aa478Dake Gu            // do nothing
10919312c5f247559a9483d874e62150c49d36aa478Dake Gu        }
11019312c5f247559a9483d874e62150c49d36aa478Dake Gu
11119312c5f247559a9483d874e62150c49d36aa478Dake Gu        @Override
11219312c5f247559a9483d874e62150c49d36aa478Dake Gu        public Object addShadow(ViewGroup shadowContainer) {
11319312c5f247559a9483d874e62150c49d36aa478Dake Gu            return ShadowHelperApi21.addShadow(shadowContainer);
11419312c5f247559a9483d874e62150c49d36aa478Dake Gu        }
11519312c5f247559a9483d874e62150c49d36aa478Dake Gu
11619312c5f247559a9483d874e62150c49d36aa478Dake Gu        @Override
11719312c5f247559a9483d874e62150c49d36aa478Dake Gu        public void setShadowFocusLevel(Object impl, float level) {
11819312c5f247559a9483d874e62150c49d36aa478Dake Gu            ShadowHelperApi21.setShadowFocusLevel(impl, level);
11919312c5f247559a9483d874e62150c49d36aa478Dake Gu        }
12019312c5f247559a9483d874e62150c49d36aa478Dake Gu
12169e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout        @Override
12269e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout        public void setZ(View view, float focusLevel) {
12369e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout            ShadowHelperApi21.setZ(view, focusLevel);
12469e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout        }
12569e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout
12619312c5f247559a9483d874e62150c49d36aa478Dake Gu    }
12719312c5f247559a9483d874e62150c49d36aa478Dake Gu
12819312c5f247559a9483d874e62150c49d36aa478Dake Gu    /**
129dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu     * Returns the ShadowHelper.
130dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu     */
131dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    private ShadowHelper() {
13219312c5f247559a9483d874e62150c49d36aa478Dake Gu     // TODO: we should use version number once "L" is published
13319312c5f247559a9483d874e62150c49d36aa478Dake Gu        if ("L".equals(Build.VERSION.RELEASE)) {
13419312c5f247559a9483d874e62150c49d36aa478Dake Gu            mSupportsShadow = true;
1350fcad32410ad29031630bb9cc2da35d33a4aa906Dake Gu            mUsesZShadow = true;
13619312c5f247559a9483d874e62150c49d36aa478Dake Gu            mImpl = new ShadowHelperApi21Impl();
13719312c5f247559a9483d874e62150c49d36aa478Dake Gu        } else if (Build.VERSION.SDK_INT >= 18) {
138dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu            mSupportsShadow = true;
139dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu            mImpl = new ShadowHelperJbmr2Impl();
140dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        } else {
141dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu            mSupportsShadow = false;
142dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu            mImpl = new ShadowHelperStubImpl();
143dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        }
144dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    }
145dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
146dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    public static ShadowHelper getInstance() {
147dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        return sInstance;
148dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    }
149dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
150dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    public boolean supportsShadow() {
151dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        return mSupportsShadow;
152dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    }
153dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
1540fcad32410ad29031630bb9cc2da35d33a4aa906Dake Gu    public boolean usesZShadow() {
1550fcad32410ad29031630bb9cc2da35d33a4aa906Dake Gu        return mUsesZShadow;
1560fcad32410ad29031630bb9cc2da35d33a4aa906Dake Gu    }
1570fcad32410ad29031630bb9cc2da35d33a4aa906Dake Gu
158dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    public void prepareParent(ViewGroup parent) {
159dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        mImpl.prepareParent(parent);
160dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    }
161dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
162dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    public Object addShadow(ViewGroup shadowContainer) {
163dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        return mImpl.addShadow(shadowContainer);
164dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    }
165dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
166dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    public void setShadowFocusLevel(Object impl, float level) {
167dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        mImpl.setShadowFocusLevel(impl, level);
168dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    }
16969e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout
17069e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout    /**
17169e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout     * Set the view z coordinate with the given focus level from 0..1.
17269e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout     */
17369e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout    public void setZ(View view, float focusLevel) {
17469e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout        mImpl.setZ(view, focusLevel);
17569e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout    }
176dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu}
177