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