ShadowHelper.java revision adf55abedd17eb9484d03da4b521209f15724f1f
1/* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 * in compliance with the License. You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software distributed under the License 10 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 * or implied. See the License for the specific language governing permissions and limitations under 12 * the License. 13 */ 14package android.support.v17.leanback.widget; 15 16import android.os.Build; 17import android.view.ViewGroup; 18import android.view.View; 19 20 21/** 22 * Helper for shadow. 23 */ 24final class ShadowHelper { 25 26 final static ShadowHelper sInstance = new ShadowHelper(); 27 boolean mSupportsShadow; 28 boolean mUsesZShadow; 29 ShadowHelperVersionImpl mImpl; 30 31 /** 32 * Interface implemented by classes that support Shadow. 33 */ 34 static interface ShadowHelperVersionImpl { 35 36 public void prepareParent(ViewGroup parent); 37 38 public Object addShadow(ViewGroup shadowContainer); 39 40 public void setZ(View view, float focusLevel); 41 42 public void clearZ(View view); 43 44 public void setShadowFocusLevel(Object impl, float level); 45 46 } 47 48 /** 49 * Interface used when we do not support Shadow animations. 50 */ 51 private static final class ShadowHelperStubImpl implements ShadowHelperVersionImpl { 52 53 @Override 54 public void prepareParent(ViewGroup parent) { 55 // do nothing 56 } 57 58 @Override 59 public Object addShadow(ViewGroup shadowContainer) { 60 // do nothing 61 return null; 62 } 63 64 @Override 65 public void setShadowFocusLevel(Object impl, float level) { 66 // do nothing 67 } 68 69 @Override 70 public void setZ(View view, float focusLevel) { 71 // do nothing 72 } 73 74 @Override 75 public void clearZ(View view) { 76 // do nothing 77 } 78 79 } 80 81 /** 82 * Implementation used on JBMR2 (and above). 83 */ 84 private static final class ShadowHelperJbmr2Impl implements ShadowHelperVersionImpl { 85 86 @Override 87 public void prepareParent(ViewGroup parent) { 88 ShadowHelperJbmr2.prepareParent(parent); 89 } 90 91 @Override 92 public Object addShadow(ViewGroup shadowContainer) { 93 return ShadowHelperJbmr2.addShadow(shadowContainer); 94 } 95 96 @Override 97 public void setShadowFocusLevel(Object impl, float level) { 98 ShadowHelperJbmr2.setShadowFocusLevel(impl, level); 99 } 100 101 @Override 102 public void setZ(View view, float focusLevel) { 103 // Not supported 104 } 105 106 @Override 107 public void clearZ(View view) { 108 // Not supported 109 } 110 111 } 112 113 /** 114 * Implementation used on api 21 (and above). 115 */ 116 private static final class ShadowHelperApi21Impl implements ShadowHelperVersionImpl { 117 118 @Override 119 public void prepareParent(ViewGroup parent) { 120 // do nothing 121 } 122 123 @Override 124 public Object addShadow(ViewGroup shadowContainer) { 125 return ShadowHelperApi21.addShadow(shadowContainer); 126 } 127 128 @Override 129 public void setShadowFocusLevel(Object impl, float level) { 130 ShadowHelperApi21.setShadowFocusLevel(impl, level); 131 } 132 133 @Override 134 public void setZ(View view, float focusLevel) { 135 ShadowHelperApi21.setZ(view, focusLevel); 136 } 137 138 @Override 139 public void clearZ(View view) { 140 ShadowHelperApi21.clearZ(view); 141 } 142 143 } 144 145 /** 146 * Returns the ShadowHelper. 147 */ 148 private ShadowHelper() { 149 // TODO: we should use version number once "L" is published 150 if ("L".equals(Build.VERSION.RELEASE)) { 151 mSupportsShadow = true; 152 mUsesZShadow = true; 153 mImpl = new ShadowHelperApi21Impl(); 154 } else if (Build.VERSION.SDK_INT >= 18) { 155 mSupportsShadow = true; 156 mImpl = new ShadowHelperJbmr2Impl(); 157 } else { 158 mSupportsShadow = false; 159 mImpl = new ShadowHelperStubImpl(); 160 } 161 } 162 163 public static ShadowHelper getInstance() { 164 return sInstance; 165 } 166 167 public boolean supportsShadow() { 168 return mSupportsShadow; 169 } 170 171 public boolean usesZShadow() { 172 return mUsesZShadow; 173 } 174 175 public void prepareParent(ViewGroup parent) { 176 mImpl.prepareParent(parent); 177 } 178 179 public Object addShadow(ViewGroup shadowContainer) { 180 return mImpl.addShadow(shadowContainer); 181 } 182 183 public void setShadowFocusLevel(Object impl, float level) { 184 mImpl.setShadowFocusLevel(impl, level); 185 } 186 187 /** 188 * Set the view z coordinate with the given focus level from 0..1. 189 */ 190 public void setZ(View view, float focusLevel) { 191 mImpl.setZ(view, focusLevel); 192 } 193 194 public void clearZ(View view) { 195 mImpl.clearZ(view); 196 } 197} 198