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;
1769e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stoutimport android.view.View;
18dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
19dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
20dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu/**
21dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu * Helper for shadow.
22dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu */
23dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gufinal class ShadowHelper {
24dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
25dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    final static ShadowHelper sInstance = new ShadowHelper();
26f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout    boolean mSupportsDynamicShadow;
27dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    ShadowHelperVersionImpl mImpl;
28dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
29dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    /**
30dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu     * Interface implemented by classes that support Shadow.
31dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu     */
32dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    static interface ShadowHelperVersionImpl {
33f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout        public Object addDynamicShadow(
3485833087b2288e0f002de6b4ebcbc0564839a217Dake Gu                View shadowContainer, float unfocusedZ, float focusedZ, int roundedCornerRadius);
35c62efa44831b1c60dcbdfd968735e27ac8294439Craig Stout        public void setZ(View view, float z);
36dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        public void setShadowFocusLevel(Object impl, float level);
37dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    }
38dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
39dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    /**
40dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu     * Interface used when we do not support Shadow animations.
41dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu     */
42dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    private static final class ShadowHelperStubImpl implements ShadowHelperVersionImpl {
4399ec8b0cb375f7e5577ea3ec9f09e6ff7a95de0dAurimas Liutikas        ShadowHelperStubImpl() {
4499ec8b0cb375f7e5577ea3ec9f09e6ff7a95de0dAurimas Liutikas        }
4599ec8b0cb375f7e5577ea3ec9f09e6ff7a95de0dAurimas Liutikas
46dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        @Override
47f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout        public Object addDynamicShadow(
4885833087b2288e0f002de6b4ebcbc0564839a217Dake Gu                View shadowContainer, float focusedZ, float unfocusedZ, int roundedCornerRadius) {
49dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu            // do nothing
50dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu            return null;
51dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        }
52dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
53dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        @Override
54dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        public void setShadowFocusLevel(Object impl, float level) {
55dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu            // do nothing
56dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        }
57dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
5869e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout        @Override
59c62efa44831b1c60dcbdfd968735e27ac8294439Craig Stout        public void setZ(View view, float z) {
60adf55abedd17eb9484d03da4b521209f15724f1fCraig Stout            // do nothing
61adf55abedd17eb9484d03da4b521209f15724f1fCraig Stout        }
62dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    }
63dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
64dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    /**
6519312c5f247559a9483d874e62150c49d36aa478Dake Gu     * Implementation used on api 21 (and above).
6619312c5f247559a9483d874e62150c49d36aa478Dake Gu     */
6719312c5f247559a9483d874e62150c49d36aa478Dake Gu    private static final class ShadowHelperApi21Impl implements ShadowHelperVersionImpl {
6899ec8b0cb375f7e5577ea3ec9f09e6ff7a95de0dAurimas Liutikas        ShadowHelperApi21Impl() {
6999ec8b0cb375f7e5577ea3ec9f09e6ff7a95de0dAurimas Liutikas        }
7099ec8b0cb375f7e5577ea3ec9f09e6ff7a95de0dAurimas Liutikas
7119312c5f247559a9483d874e62150c49d36aa478Dake Gu        @Override
72f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout        public Object addDynamicShadow(
7385833087b2288e0f002de6b4ebcbc0564839a217Dake Gu                View shadowContainer, float unfocusedZ, float focusedZ, int roundedCornerRadius) {
74f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout            return ShadowHelperApi21.addDynamicShadow(
7585833087b2288e0f002de6b4ebcbc0564839a217Dake Gu                    shadowContainer, unfocusedZ, focusedZ, roundedCornerRadius);
7619312c5f247559a9483d874e62150c49d36aa478Dake Gu        }
7719312c5f247559a9483d874e62150c49d36aa478Dake Gu
7819312c5f247559a9483d874e62150c49d36aa478Dake Gu        @Override
7919312c5f247559a9483d874e62150c49d36aa478Dake Gu        public void setShadowFocusLevel(Object impl, float level) {
8019312c5f247559a9483d874e62150c49d36aa478Dake Gu            ShadowHelperApi21.setShadowFocusLevel(impl, level);
8119312c5f247559a9483d874e62150c49d36aa478Dake Gu        }
8219312c5f247559a9483d874e62150c49d36aa478Dake Gu
8369e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout        @Override
84c62efa44831b1c60dcbdfd968735e27ac8294439Craig Stout        public void setZ(View view, float z) {
85c62efa44831b1c60dcbdfd968735e27ac8294439Craig Stout            ShadowHelperApi21.setZ(view, z);
86adf55abedd17eb9484d03da4b521209f15724f1fCraig Stout        }
8719312c5f247559a9483d874e62150c49d36aa478Dake Gu    }
8819312c5f247559a9483d874e62150c49d36aa478Dake Gu
8919312c5f247559a9483d874e62150c49d36aa478Dake Gu    /**
90dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu     * Returns the ShadowHelper.
91dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu     */
92dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    private ShadowHelper() {
93a52784195525cdb1f2bb4d8dde1b8b314f480957Chet Haase        if (Build.VERSION.SDK_INT >= 21) {
94f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout            mSupportsDynamicShadow = true;
9519312c5f247559a9483d874e62150c49d36aa478Dake Gu            mImpl = new ShadowHelperApi21Impl();
96dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        } else {
97dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu            mImpl = new ShadowHelperStubImpl();
98dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        }
99dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    }
100dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
101dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    public static ShadowHelper getInstance() {
102dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        return sInstance;
103dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    }
104dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
105f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout    public boolean supportsDynamicShadow() {
106f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout        return mSupportsDynamicShadow;
107dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    }
108dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
109f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout    public Object addDynamicShadow(
11085833087b2288e0f002de6b4ebcbc0564839a217Dake Gu            View shadowContainer, float unfocusedZ, float focusedZ, int roundedCornerRadius) {
11185833087b2288e0f002de6b4ebcbc0564839a217Dake Gu        return mImpl.addDynamicShadow(shadowContainer, unfocusedZ, focusedZ, roundedCornerRadius);
112dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    }
113dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu
114dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    public void setShadowFocusLevel(Object impl, float level) {
115dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu        mImpl.setShadowFocusLevel(impl, level);
116dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu    }
11769e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout
11869e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout    /**
119c62efa44831b1c60dcbdfd968735e27ac8294439Craig Stout     * Set the view z coordinate.
12069e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout     */
121c62efa44831b1c60dcbdfd968735e27ac8294439Craig Stout    public void setZ(View view, float z) {
122c62efa44831b1c60dcbdfd968735e27ac8294439Craig Stout        mImpl.setZ(view, z);
12369e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout    }
124adf55abedd17eb9484d03da4b521209f15724f1fCraig Stout
125dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu}
126