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