ShadowHelper.java revision adf55abedd17eb9484d03da4b521209f15724f1f
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
42adf55abedd17eb9484d03da4b521209f15724f1fCraig Stout        public void clearZ(View view);
43adf55abedd17eb9484d03da4b521209f15724f1fCraig Stout
44dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        public void setShadowFocusLevel(Object impl, float level);
45dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
46dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    }
47dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
48dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    /**
49dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu     * Interface used when we do not support Shadow animations.
50dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu     */
51dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    private static final class ShadowHelperStubImpl implements ShadowHelperVersionImpl {
52dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
53dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        @Override
54dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        public void prepareParent(ViewGroup parent) {
55dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu            // do nothing
56dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        }
57dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
58dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        @Override
59dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        public Object addShadow(ViewGroup shadowContainer) {
60dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu            // do nothing
61dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu            return null;
62dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        }
63dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
64dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        @Override
65dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        public void setShadowFocusLevel(Object impl, float level) {
66dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu            // do nothing
67dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        }
68dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
6969e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout        @Override
7069e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout        public void setZ(View view, float focusLevel) {
7169e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout            // do nothing
7269e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout        }
7369e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout
74adf55abedd17eb9484d03da4b521209f15724f1fCraig Stout        @Override
75adf55abedd17eb9484d03da4b521209f15724f1fCraig Stout        public void clearZ(View view) {
76adf55abedd17eb9484d03da4b521209f15724f1fCraig Stout            // do nothing
77adf55abedd17eb9484d03da4b521209f15724f1fCraig Stout        }
78adf55abedd17eb9484d03da4b521209f15724f1fCraig Stout
79dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    }
80dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
81dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    /**
82dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu     * Implementation used on JBMR2 (and above).
83dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu     */
84dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    private static final class ShadowHelperJbmr2Impl implements ShadowHelperVersionImpl {
85dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
86dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        @Override
87dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        public void prepareParent(ViewGroup parent) {
88dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu            ShadowHelperJbmr2.prepareParent(parent);
89dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        }
90dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
91dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        @Override
92dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        public Object addShadow(ViewGroup shadowContainer) {
93dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu            return ShadowHelperJbmr2.addShadow(shadowContainer);
94dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        }
95dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
96dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        @Override
97dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        public void setShadowFocusLevel(Object impl, float level) {
98dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu            ShadowHelperJbmr2.setShadowFocusLevel(impl, level);
99dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        }
100dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
10169e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout        @Override
10269e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout        public void setZ(View view, float focusLevel) {
10369e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout            // Not supported
10469e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout        }
10569e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout
106adf55abedd17eb9484d03da4b521209f15724f1fCraig Stout        @Override
107adf55abedd17eb9484d03da4b521209f15724f1fCraig Stout        public void clearZ(View view) {
108adf55abedd17eb9484d03da4b521209f15724f1fCraig Stout            // Not supported
109adf55abedd17eb9484d03da4b521209f15724f1fCraig Stout        }
110adf55abedd17eb9484d03da4b521209f15724f1fCraig Stout
111dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    }
112dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
113dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    /**
11419312c5f247559a9483d874e62150c49d36aa478Dake Gu     * Implementation used on api 21 (and above).
11519312c5f247559a9483d874e62150c49d36aa478Dake Gu     */
11619312c5f247559a9483d874e62150c49d36aa478Dake Gu    private static final class ShadowHelperApi21Impl implements ShadowHelperVersionImpl {
11719312c5f247559a9483d874e62150c49d36aa478Dake Gu
11819312c5f247559a9483d874e62150c49d36aa478Dake Gu        @Override
11919312c5f247559a9483d874e62150c49d36aa478Dake Gu        public void prepareParent(ViewGroup parent) {
12019312c5f247559a9483d874e62150c49d36aa478Dake Gu            // do nothing
12119312c5f247559a9483d874e62150c49d36aa478Dake Gu        }
12219312c5f247559a9483d874e62150c49d36aa478Dake Gu
12319312c5f247559a9483d874e62150c49d36aa478Dake Gu        @Override
12419312c5f247559a9483d874e62150c49d36aa478Dake Gu        public Object addShadow(ViewGroup shadowContainer) {
12519312c5f247559a9483d874e62150c49d36aa478Dake Gu            return ShadowHelperApi21.addShadow(shadowContainer);
12619312c5f247559a9483d874e62150c49d36aa478Dake Gu        }
12719312c5f247559a9483d874e62150c49d36aa478Dake Gu
12819312c5f247559a9483d874e62150c49d36aa478Dake Gu        @Override
12919312c5f247559a9483d874e62150c49d36aa478Dake Gu        public void setShadowFocusLevel(Object impl, float level) {
13019312c5f247559a9483d874e62150c49d36aa478Dake Gu            ShadowHelperApi21.setShadowFocusLevel(impl, level);
13119312c5f247559a9483d874e62150c49d36aa478Dake Gu        }
13219312c5f247559a9483d874e62150c49d36aa478Dake Gu
13369e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout        @Override
13469e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout        public void setZ(View view, float focusLevel) {
13569e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout            ShadowHelperApi21.setZ(view, focusLevel);
13669e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout        }
13769e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout
138adf55abedd17eb9484d03da4b521209f15724f1fCraig Stout        @Override
139adf55abedd17eb9484d03da4b521209f15724f1fCraig Stout        public void clearZ(View view) {
140adf55abedd17eb9484d03da4b521209f15724f1fCraig Stout            ShadowHelperApi21.clearZ(view);
141adf55abedd17eb9484d03da4b521209f15724f1fCraig Stout        }
142adf55abedd17eb9484d03da4b521209f15724f1fCraig Stout
14319312c5f247559a9483d874e62150c49d36aa478Dake Gu    }
14419312c5f247559a9483d874e62150c49d36aa478Dake Gu
14519312c5f247559a9483d874e62150c49d36aa478Dake Gu    /**
146dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu     * Returns the ShadowHelper.
147dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu     */
148dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    private ShadowHelper() {
14919312c5f247559a9483d874e62150c49d36aa478Dake Gu     // TODO: we should use version number once "L" is published
15019312c5f247559a9483d874e62150c49d36aa478Dake Gu        if ("L".equals(Build.VERSION.RELEASE)) {
15119312c5f247559a9483d874e62150c49d36aa478Dake Gu            mSupportsShadow = true;
1520fcad32410ad29031630bb9cc2da35d33a4aa906Dake Gu            mUsesZShadow = true;
15319312c5f247559a9483d874e62150c49d36aa478Dake Gu            mImpl = new ShadowHelperApi21Impl();
15419312c5f247559a9483d874e62150c49d36aa478Dake Gu        } else if (Build.VERSION.SDK_INT >= 18) {
155dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu            mSupportsShadow = true;
156dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu            mImpl = new ShadowHelperJbmr2Impl();
157dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        } else {
158dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu            mSupportsShadow = false;
159dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu            mImpl = new ShadowHelperStubImpl();
160dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        }
161dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    }
162dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
163dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    public static ShadowHelper getInstance() {
164dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        return sInstance;
165dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    }
166dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
167dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    public boolean supportsShadow() {
168dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        return mSupportsShadow;
169dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    }
170dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
1710fcad32410ad29031630bb9cc2da35d33a4aa906Dake Gu    public boolean usesZShadow() {
1720fcad32410ad29031630bb9cc2da35d33a4aa906Dake Gu        return mUsesZShadow;
1730fcad32410ad29031630bb9cc2da35d33a4aa906Dake Gu    }
1740fcad32410ad29031630bb9cc2da35d33a4aa906Dake Gu
175dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    public void prepareParent(ViewGroup parent) {
176dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        mImpl.prepareParent(parent);
177dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    }
178dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
179dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    public Object addShadow(ViewGroup shadowContainer) {
180dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        return mImpl.addShadow(shadowContainer);
181dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    }
182dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
183dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    public void setShadowFocusLevel(Object impl, float level) {
184dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        mImpl.setShadowFocusLevel(impl, level);
185dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    }
18669e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout
18769e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout    /**
18869e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout     * Set the view z coordinate with the given focus level from 0..1.
18969e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout     */
19069e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout    public void setZ(View view, float focusLevel) {
19169e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout        mImpl.setZ(view, focusLevel);
19269e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout    }
193adf55abedd17eb9484d03da4b521209f15724f1fCraig Stout
194adf55abedd17eb9484d03da4b521209f15724f1fCraig Stout    public void clearZ(View view) {
195adf55abedd17eb9484d03da4b521209f15724f1fCraig Stout        mImpl.clearZ(view);
196adf55abedd17eb9484d03da4b521209f15724f1fCraig Stout    }
197dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu}
198