ViewCompat.java revision 9648c538bac4f04145c118cc41168d1d7a536312
1/* 2 * Copyright (C) 2011 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 */ 16 17package android.support.v4.view; 18 19import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat; 20import android.view.View; 21import android.view.accessibility.AccessibilityEvent; 22 23/** 24 * Helper for accessing newer features in View. 25 */ 26public class ViewCompat { 27 /** 28 * Always allow a user to over-scroll this view, provided it is a 29 * view that can scroll. 30 */ 31 public static final int OVER_SCROLL_ALWAYS = 0; 32 33 /** 34 * Allow a user to over-scroll this view only if the content is large 35 * enough to meaningfully scroll, provided it is a view that can scroll. 36 */ 37 public static final int OVER_SCROLL_IF_CONTENT_SCROLLS = 1; 38 39 /** 40 * Never allow a user to over-scroll this view. 41 */ 42 public static final int OVER_SCROLL_NEVER = 2; 43 44 interface ViewCompatImpl { 45 public boolean canScrollHorizontally(View v, int direction); 46 public boolean canScrollVertically(View v, int direction); 47 public int getOverScrollMode(View v); 48 public void setOverScrollMode(View v, int mode); 49 public void onInitializeAccessibilityEvent(View v, AccessibilityEvent event); 50 public void onPopulateAccessibilityEvent(View v, AccessibilityEvent event); 51 public void onInitializeAccessibilityNodeInfo(View v, AccessibilityNodeInfoCompat info); 52 public void setAccessibilityDelegate(View v, AccessibilityDelegateCompat delegate); 53 } 54 55 static class BaseViewCompatImpl implements ViewCompatImpl { 56 public boolean canScrollHorizontally(View v, int direction) { 57 return false; 58 } 59 public boolean canScrollVertically(View v, int direction) { 60 return false; 61 } 62 public int getOverScrollMode(View v) { 63 return OVER_SCROLL_NEVER; 64 } 65 public void setOverScrollMode(View v, int mode) { 66 // Do nothing; API doesn't exist 67 } 68 public void setAccessibilityDelegate(View v, AccessibilityDelegateCompat delegate) { 69 // Do nothing; API doesn't exist 70 } 71 public void onPopulateAccessibilityEvent(View v, AccessibilityEvent event) { 72 // Do nothing; API doesn't exist 73 } 74 public void onInitializeAccessibilityEvent(View v, AccessibilityEvent event) { 75 // Do nothing; API doesn't exist 76 } 77 public void onInitializeAccessibilityNodeInfo(View v, AccessibilityNodeInfoCompat info) { 78 // Do nothing; API doesn't exist 79 } 80 } 81 82 static class GBViewCompatImpl extends BaseViewCompatImpl { 83 @Override 84 public int getOverScrollMode(View v) { 85 return ViewCompatGingerbread.getOverScrollMode(v); 86 } 87 @Override 88 public void setOverScrollMode(View v, int mode) { 89 ViewCompatGingerbread.setOverScrollMode(v, mode); 90 } 91 } 92 93 static class ICSViewCompatImpl extends GBViewCompatImpl { 94 @Override 95 public boolean canScrollHorizontally(View v, int direction) { 96 return ViewCompatICS.canScrollHorizontally(v, direction); 97 } 98 @Override 99 public boolean canScrollVertically(View v, int direction) { 100 return ViewCompatICS.canScrollVertically(v, direction); 101 } 102 @Override 103 public void onPopulateAccessibilityEvent(View v, AccessibilityEvent event) { 104 ViewCompatICS.onPopulateAccessibilityEvent(v, event); 105 } 106 @Override 107 public void onInitializeAccessibilityEvent(View v, AccessibilityEvent event) { 108 ViewCompatICS.onInitializeAccessibilityEvent(v, event); 109 } 110 @Override 111 public void onInitializeAccessibilityNodeInfo(View v, AccessibilityNodeInfoCompat info) { 112 ViewCompatICS.onInitializeAccessibilityNodeInfo(v, info.getImpl()); 113 } 114 @Override 115 public void setAccessibilityDelegate(View v, AccessibilityDelegateCompat delegate) { 116 ViewCompatICS.setAccessibilityDelegate(v, delegate.getBridge()); 117 } 118 } 119 120 static final ViewCompatImpl IMPL; 121 static { 122 final int version = android.os.Build.VERSION.SDK_INT; 123 if (version >= 14) { 124 IMPL = new ICSViewCompatImpl(); 125 } else if (version >= 9) { 126 IMPL = new GBViewCompatImpl(); 127 } else { 128 IMPL = new BaseViewCompatImpl(); 129 } 130 } 131 132 public static boolean canScrollHorizontally(View v, int direction) { 133 return IMPL.canScrollHorizontally(v, direction); 134 } 135 136 public static boolean canScrollVertically(View v, int direction) { 137 return IMPL.canScrollVertically(v, direction); 138 } 139 140 public static int getOverScrollMode(View v) { 141 return IMPL.getOverScrollMode(v); 142 } 143 144 public static void setOverScrollMode(View v, int mode) { 145 IMPL.setOverScrollMode(v, mode); 146 } 147 148 public static void onPopulateAccessibilityEvent(View v, AccessibilityEvent event) { 149 IMPL.onPopulateAccessibilityEvent(v, event); 150 } 151 152 public static void onInitializeAccessibilityEvent(View v, AccessibilityEvent event) { 153 IMPL.onInitializeAccessibilityEvent(v, event); 154 } 155 156 public static void onInitializeAccessibilityNodeInfo(View v, AccessibilityNodeInfoCompat info) { 157 IMPL.onInitializeAccessibilityNodeInfo(v, info); 158 } 159 160 public static void setAccessibilityDelegate(View v, AccessibilityDelegateCompat delegate) { 161 IMPL.setAccessibilityDelegate(v, delegate); 162 } 163} 164