1/* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License 15 */ 16package android.support.v17.leanback.widget; 17 18import android.os.Build; 19import android.view.ViewGroup; 20 21 22/** 23 * Helper for static (nine patch) shadows. 24 */ 25final class StaticShadowHelper { 26 27 final static StaticShadowHelper sInstance = new StaticShadowHelper(); 28 boolean mSupportsShadow; 29 ShadowHelperVersionImpl mImpl; 30 31 /** 32 * Interface implemented by classes that support Shadow. 33 */ 34 static interface ShadowHelperVersionImpl { 35 public void prepareParent(ViewGroup parent); 36 public Object addStaticShadow(ViewGroup shadowContainer); 37 public void setShadowFocusLevel(Object impl, float level); 38 } 39 40 /** 41 * Interface used when we do not support Shadow animations. 42 */ 43 private static final class ShadowHelperStubImpl implements ShadowHelperVersionImpl { 44 ShadowHelperStubImpl() { 45 } 46 47 @Override 48 public void prepareParent(ViewGroup parent) { 49 // do nothing 50 } 51 52 @Override 53 public Object addStaticShadow(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 * Implementation used on JBMR2 (and above). 66 */ 67 private static final class ShadowHelperJbmr2Impl implements ShadowHelperVersionImpl { 68 ShadowHelperJbmr2Impl() { 69 } 70 71 @Override 72 public void prepareParent(ViewGroup parent) { 73 ShadowHelperJbmr2.prepareParent(parent); 74 } 75 76 @Override 77 public Object addStaticShadow(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 * Returns the StaticShadowHelper. 89 */ 90 private StaticShadowHelper() { 91 if (Build.VERSION.SDK_INT >= 21) { 92 mSupportsShadow = true; 93 mImpl = new ShadowHelperJbmr2Impl(); 94 } else { 95 mSupportsShadow = false; 96 mImpl = new ShadowHelperStubImpl(); 97 } 98 } 99 100 public static StaticShadowHelper getInstance() { 101 return sInstance; 102 } 103 104 public boolean supportsShadow() { 105 return mSupportsShadow; 106 } 107 108 public void prepareParent(ViewGroup parent) { 109 mImpl.prepareParent(parent); 110 } 111 112 public Object addStaticShadow(ViewGroup shadowContainer) { 113 return mImpl.addStaticShadow(shadowContainer); 114 } 115 116 public void setShadowFocusLevel(Object impl, float level) { 117 mImpl.setShadowFocusLevel(impl, level); 118 } 119} 120