/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.support.v4.view;
import android.content.Context;
import android.os.Build;
import android.view.View;
import android.view.ViewParent;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
/**
* Helper for accessing features in {@link ViewParent}
* introduced after API level 4 in a backwards compatible fashion.
*/
public class ViewParentCompat {
interface ViewParentCompatImpl {
public boolean requestSendAccessibilityEvent(
ViewParent parent, View child, AccessibilityEvent event);
}
static class ViewParentCompatStubImpl implements ViewParentCompatImpl {
@Override
public boolean requestSendAccessibilityEvent(
ViewParent parent, View child, AccessibilityEvent event) {
// Emulate what ViewRootImpl does in ICS and above.
if (child == null) {
return false;
}
final AccessibilityManager manager = (AccessibilityManager) child.getContext()
.getSystemService(Context.ACCESSIBILITY_SERVICE);
manager.sendAccessibilityEvent(event);
return true;
}
}
static class ViewParentCompatICSImpl extends ViewParentCompatStubImpl {
@Override
public boolean requestSendAccessibilityEvent(
ViewParent parent, View child, AccessibilityEvent event) {
return ViewParentCompatICS.requestSendAccessibilityEvent(parent, child, event);
}
}
static final ViewParentCompatImpl IMPL;
static {
final int version = Build.VERSION.SDK_INT;
if (version >= 14) {
IMPL = new ViewParentCompatICSImpl();
} else {
IMPL = new ViewParentCompatStubImpl();
}
}
/*
* Hide the constructor.
*/
private ViewParentCompat() {
}
/**
* Called by a child to request from its parent to send an {@link AccessibilityEvent}.
* The child has already populated a record for itself in the event and is delegating
* to its parent to send the event. The parent can optionally add a record for itself.
* <p>
* Note: An accessibility event is fired by an individual view which populates the
* event with a record for its state and requests from its parent to perform
* the sending. The parent can optionally add a record for itself before
* dispatching the request to its parent. A parent can also choose not to
* respect the request for sending the event. The accessibility event is sent
* by the topmost view in the view tree.</p>
*
* @param parent The parent whose method to invoke.
* @param child The child which requests sending the event.
* @param event The event to be sent.
* @return True if the event was sent.
*/
public static boolean requestSendAccessibilityEvent(
ViewParent parent, View child, AccessibilityEvent event) {
return IMPL.requestSendAccessibilityEvent(parent, child, event);
}
}