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