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, boolean roundedCorners); 39 40 public void setZ(View view, float z); 41 42 public void setShadowFocusLevel(Object impl, float level); 43 44 } 45 46 /** 47 * Interface used when we do not support Shadow animations. 48 */ 49 private static final class ShadowHelperStubImpl implements ShadowHelperVersionImpl { 50 51 @Override 52 public void prepareParent(ViewGroup parent) { 53 // do nothing 54 } 55 56 @Override 57 public Object addShadow(ViewGroup shadowContainer, boolean roundedCorners) { 58 // do nothing 59 return null; 60 } 61 62 @Override 63 public void setShadowFocusLevel(Object impl, float level) { 64 // do nothing 65 } 66 67 @Override 68 public void setZ(View view, float z) { 69 // do nothing 70 } 71 72 } 73 74 /** 75 * Implementation used on JBMR2 (and above). 76 */ 77 private static final class ShadowHelperJbmr2Impl implements ShadowHelperVersionImpl { 78 79 @Override 80 public void prepareParent(ViewGroup parent) { 81 ShadowHelperJbmr2.prepareParent(parent); 82 } 83 84 @Override 85 public Object addShadow(ViewGroup shadowContainer, boolean roundedCorners) { 86 // Rounded corners not supported 87 return ShadowHelperJbmr2.addShadow(shadowContainer); 88 } 89 90 @Override 91 public void setShadowFocusLevel(Object impl, float level) { 92 ShadowHelperJbmr2.setShadowFocusLevel(impl, level); 93 } 94 95 @Override 96 public void setZ(View view, float z) { 97 // Not supported 98 } 99 100 } 101 102 /** 103 * Implementation used on api 21 (and above). 104 */ 105 private static final class ShadowHelperApi21Impl implements ShadowHelperVersionImpl { 106 107 @Override 108 public void prepareParent(ViewGroup parent) { 109 // do nothing 110 } 111 112 @Override 113 public Object addShadow(ViewGroup shadowContainer, boolean roundedCorners) { 114 return ShadowHelperApi21.addShadow(shadowContainer, roundedCorners); 115 } 116 117 @Override 118 public void setShadowFocusLevel(Object impl, float level) { 119 ShadowHelperApi21.setShadowFocusLevel(impl, level); 120 } 121 122 @Override 123 public void setZ(View view, float z) { 124 ShadowHelperApi21.setZ(view, z); 125 } 126 127 } 128 129 /** 130 * Returns the ShadowHelper. 131 */ 132 private ShadowHelper() { 133 if (Build.VERSION.SDK_INT >= 21) { 134 mSupportsShadow = true; 135 mUsesZShadow = true; 136 mImpl = new ShadowHelperApi21Impl(); 137 } else if (Build.VERSION.SDK_INT >= 18) { 138 mSupportsShadow = true; 139 mImpl = new ShadowHelperJbmr2Impl(); 140 } else { 141 mSupportsShadow = false; 142 mImpl = new ShadowHelperStubImpl(); 143 } 144 } 145 146 public static ShadowHelper getInstance() { 147 return sInstance; 148 } 149 150 public boolean supportsShadow() { 151 return mSupportsShadow; 152 } 153 154 public boolean usesZShadow() { 155 return mUsesZShadow; 156 } 157 158 public void prepareParent(ViewGroup parent) { 159 mImpl.prepareParent(parent); 160 } 161 162 public Object addShadow(ViewGroup shadowContainer, boolean roundedCorners) { 163 return mImpl.addShadow(shadowContainer, roundedCorners); 164 } 165 166 public void setShadowFocusLevel(Object impl, float level) { 167 mImpl.setShadowFocusLevel(impl, level); 168 } 169 170 /** 171 * Set the view z coordinate. 172 */ 173 public void setZ(View view, float z) { 174 mImpl.setZ(view, z); 175 } 176 177} 178