ShadowHelper.java revision 76c3b90228d8c4afc6d24c683e9c95f41ae619c9
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; 18 19 20/** 21 * Helper for shadow. 22 */ 23final class ShadowHelper { 24 25 final static ShadowHelper sInstance = new ShadowHelper(); 26 boolean mSupportsShadow; 27 ShadowHelperVersionImpl mImpl; 28 29 /** 30 * Interface implemented by classes that support Shadow. 31 */ 32 static interface ShadowHelperVersionImpl { 33 34 public void prepareParent(ViewGroup parent); 35 36 public Object addShadow(ViewGroup shadowContainer); 37 38 public void setShadowFocusLevel(Object impl, float level); 39 40 } 41 42 /** 43 * Interface used when we do not support Shadow animations. 44 */ 45 private static final class ShadowHelperStubImpl implements ShadowHelperVersionImpl { 46 47 @Override 48 public void prepareParent(ViewGroup parent) { 49 // do nothing 50 } 51 52 @Override 53 public Object addShadow(ViewGroup shadowContainer) { 54 // do nothing 55 return null; 56 } 57 58 @Override 59 public void setShadowFocusLevel(Object impl, float level) { 60 // do nothing 61 } 62 63 } 64 65 /** 66 * Implementation used on JBMR2 (and above). 67 */ 68 private static final class ShadowHelperJbmr2Impl implements ShadowHelperVersionImpl { 69 70 @Override 71 public void prepareParent(ViewGroup parent) { 72 ShadowHelperJbmr2.prepareParent(parent); 73 } 74 75 @Override 76 public Object addShadow(ViewGroup shadowContainer) { 77 return ShadowHelperJbmr2.addShadow(shadowContainer); 78 } 79 80 @Override 81 public void setShadowFocusLevel(Object impl, float level) { 82 ShadowHelperJbmr2.setShadowFocusLevel(impl, level); 83 } 84 85 } 86 87 /** 88 * Implementation used on api 21 (and above). 89 */ 90 private static final class ShadowHelperApi21Impl implements ShadowHelperVersionImpl { 91 92 @Override 93 public void prepareParent(ViewGroup parent) { 94 // do nothing 95 } 96 97 @Override 98 public Object addShadow(ViewGroup shadowContainer) { 99 return ShadowHelperApi21.addShadow(shadowContainer); 100 } 101 102 @Override 103 public void setShadowFocusLevel(Object impl, float level) { 104 ShadowHelperApi21.setShadowFocusLevel(impl, level); 105 } 106 107 } 108 109 /** 110 * Returns the ShadowHelper. 111 */ 112 private ShadowHelper() { 113 // TODO: we should use version number once "L" is published 114 if ("L".equals(Build.VERSION.RELEASE)) { 115 mSupportsShadow = true; 116 mImpl = new ShadowHelperApi21Impl(); 117 } else if (Build.VERSION.SDK_INT >= 18) { 118 mSupportsShadow = true; 119 mImpl = new ShadowHelperJbmr2Impl(); 120 } else { 121 mSupportsShadow = false; 122 mImpl = new ShadowHelperStubImpl(); 123 } 124 } 125 126 public static ShadowHelper getInstance() { 127 return sInstance; 128 } 129 130 public boolean supportsShadow() { 131 return mSupportsShadow; 132 } 133 134 public void prepareParent(ViewGroup parent) { 135 mImpl.prepareParent(parent); 136 } 137 138 public Object addShadow(ViewGroup shadowContainer) { 139 return mImpl.addShadow(shadowContainer); 140 } 141 142 public void setShadowFocusLevel(Object impl, float level) { 143 mImpl.setShadowFocusLevel(impl, level); 144 } 145} 146