ViewGroupCompat.java revision 1b8262b87426b2f766b40d6ab4eaeac296d5c2fe
19648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov/* 29648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov * Copyright (C) 2011 The Android Open Source Project 39648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov * 49648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov * Licensed under the Apache License, Version 2.0 (the "License"); 59648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov * you may not use this file except in compliance with the License. 69648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov * You may obtain a copy of the License at 79648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov * 89648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov * http://www.apache.org/licenses/LICENSE-2.0 99648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov * 109648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov * Unless required by applicable law or agreed to in writing, software 119648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov * distributed under the License is distributed on an "AS IS" BASIS, 129648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov * See the License for the specific language governing permissions and 149648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov * limitations under the License. 159648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov */ 169648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov 179648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganovpackage android.support.v4.view; 189648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov 199648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganovimport android.os.Build; 209648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganovimport android.view.View; 219648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganovimport android.view.ViewGroup; 229648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganovimport android.view.accessibility.AccessibilityEvent; 239648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov 249648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov/** 250574ca37da4619afe4e26753f5a1b4de314b6565Svetoslav Ganov * Helper for accessing features in {@link ViewGroup} 260574ca37da4619afe4e26753f5a1b4de314b6565Svetoslav Ganov * introduced after API level 4 in a backwards compatible fashion. 279648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov */ 289648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganovpublic class ViewGroupCompat { 299648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov 309648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov interface ViewGroupCompatImpl { 319648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov public boolean onRequestSendAccessibilityEvent(ViewGroup group, View child, 329648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov AccessibilityEvent event); 331b8262b87426b2f766b40d6ab4eaeac296d5c2feAdam Powell 341b8262b87426b2f766b40d6ab4eaeac296d5c2feAdam Powell public void setMotionEventSplittingEnabled(ViewGroup group, boolean split); 359648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov } 369648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov 379648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov static class ViewGroupCompatStubImpl implements ViewGroupCompatImpl { 389648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov public boolean onRequestSendAccessibilityEvent( 399648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov ViewGroup group, View child, AccessibilityEvent event) { 409648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov return true; 419648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov } 421b8262b87426b2f766b40d6ab4eaeac296d5c2feAdam Powell 431b8262b87426b2f766b40d6ab4eaeac296d5c2feAdam Powell public void setMotionEventSplittingEnabled(ViewGroup group, boolean split) { 441b8262b87426b2f766b40d6ab4eaeac296d5c2feAdam Powell // no-op, didn't exist. 451b8262b87426b2f766b40d6ab4eaeac296d5c2feAdam Powell } 461b8262b87426b2f766b40d6ab4eaeac296d5c2feAdam Powell } 471b8262b87426b2f766b40d6ab4eaeac296d5c2feAdam Powell 481b8262b87426b2f766b40d6ab4eaeac296d5c2feAdam Powell static class ViewGroupCompatHCImpl extends ViewGroupCompatStubImpl { 491b8262b87426b2f766b40d6ab4eaeac296d5c2feAdam Powell @Override 501b8262b87426b2f766b40d6ab4eaeac296d5c2feAdam Powell public void setMotionEventSplittingEnabled(ViewGroup group, boolean split) { 511b8262b87426b2f766b40d6ab4eaeac296d5c2feAdam Powell ViewGroupCompatHC.setMotionEventSplittingEnabled(group, split); 521b8262b87426b2f766b40d6ab4eaeac296d5c2feAdam Powell } 539648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov } 549648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov 551b8262b87426b2f766b40d6ab4eaeac296d5c2feAdam Powell static class ViewGroupCompatIcsImpl extends ViewGroupCompatHCImpl { 569648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov @Override 579648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov public boolean onRequestSendAccessibilityEvent( 589648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov ViewGroup group, View child, AccessibilityEvent event) { 599648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov return ViewGroupCompatIcs.onRequestSendAccessibilityEvent(group, child, event); 609648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov } 619648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov } 629648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov 639648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov static final ViewGroupCompatImpl IMPL; 649648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov static { 651b8262b87426b2f766b40d6ab4eaeac296d5c2feAdam Powell final int version = Build.VERSION.SDK_INT; 661b8262b87426b2f766b40d6ab4eaeac296d5c2feAdam Powell if (version >= 14) { 679648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov IMPL = new ViewGroupCompatIcsImpl(); 681b8262b87426b2f766b40d6ab4eaeac296d5c2feAdam Powell } else if (version >= 11) { 691b8262b87426b2f766b40d6ab4eaeac296d5c2feAdam Powell IMPL = new ViewGroupCompatHCImpl(); 709648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov } else { 719648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov IMPL = new ViewGroupCompatStubImpl(); 729648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov } 739648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov } 749648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov 759648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov /* 769648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov * Hide the constructor. 779648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov */ 789648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov private ViewGroupCompat() { 799648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov 809648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov } 819648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov 829648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov /** 839648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov * Called when a child has requested sending an {@link AccessibilityEvent} and 849648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov * gives an opportunity to its parent to augment the event. 859648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov * <p> 869648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov * If an {@link AccessibilityDelegateCompat} has been specified via calling 879648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov * {@link ViewCompat#setAccessibilityDelegate(View, AccessibilityDelegateCompat)} its 889648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov * {@link AccessibilityDelegateCompat#onRequestSendAccessibilityEvent(ViewGroup, View, 899648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov * AccessibilityEvent)} is responsible for handling this call. 909648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov * </p> 919648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov * 929648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov * @param group The group whose method to invoke. 939648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov * @param child The child which requests sending the event. 949648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov * @param event The event to be sent. 959648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov * @return True if the event should be sent. 969648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov */ 979648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov public static boolean onRequestSendAccessibilityEvent(ViewGroup group, View child, 989648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov AccessibilityEvent event) { 999648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov return IMPL.onRequestSendAccessibilityEvent(group, child, event); 1009648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov } 1011b8262b87426b2f766b40d6ab4eaeac296d5c2feAdam Powell 1021b8262b87426b2f766b40d6ab4eaeac296d5c2feAdam Powell /** 1031b8262b87426b2f766b40d6ab4eaeac296d5c2feAdam Powell * Enable or disable the splitting of MotionEvents to multiple children during touch event 1041b8262b87426b2f766b40d6ab4eaeac296d5c2feAdam Powell * dispatch. This behavior is enabled by default for applications that target an 1051b8262b87426b2f766b40d6ab4eaeac296d5c2feAdam Powell * SDK version of 11 (Honeycomb) or newer. On earlier platform versions this feature 1061b8262b87426b2f766b40d6ab4eaeac296d5c2feAdam Powell * was not supported and this method is a no-op. 1071b8262b87426b2f766b40d6ab4eaeac296d5c2feAdam Powell * 1081b8262b87426b2f766b40d6ab4eaeac296d5c2feAdam Powell * <p>When this option is enabled MotionEvents may be split and dispatched to different child 1091b8262b87426b2f766b40d6ab4eaeac296d5c2feAdam Powell * views depending on where each pointer initially went down. This allows for user interactions 1101b8262b87426b2f766b40d6ab4eaeac296d5c2feAdam Powell * such as scrolling two panes of content independently, chording of buttons, and performing 1111b8262b87426b2f766b40d6ab4eaeac296d5c2feAdam Powell * independent gestures on different pieces of content. 1121b8262b87426b2f766b40d6ab4eaeac296d5c2feAdam Powell * 1131b8262b87426b2f766b40d6ab4eaeac296d5c2feAdam Powell * @param group ViewGroup to modify 1141b8262b87426b2f766b40d6ab4eaeac296d5c2feAdam Powell * @param split <code>true</code> to allow MotionEvents to be split and dispatched to multiple 1151b8262b87426b2f766b40d6ab4eaeac296d5c2feAdam Powell * child views. <code>false</code> to only allow one child view to be the target of 1161b8262b87426b2f766b40d6ab4eaeac296d5c2feAdam Powell * any MotionEvent received by this ViewGroup. 1171b8262b87426b2f766b40d6ab4eaeac296d5c2feAdam Powell */ 1181b8262b87426b2f766b40d6ab4eaeac296d5c2feAdam Powell public static void setMotionEventSplittingEnabled(ViewGroup group, boolean split) { 1191b8262b87426b2f766b40d6ab4eaeac296d5c2feAdam Powell IMPL.setMotionEventSplittingEnabled(group, split); 1201b8262b87426b2f766b40d6ab4eaeac296d5c2feAdam Powell } 1219648c538bac4f04145c118cc41168d1d7a536312Svetoslav Ganov} 122