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