2214313177
Clings should block interaction with elements below when Talkback is enabled Change-Id: Ifdcd109351fd3c2d6dc97ad75ea3ab6eea48b582
113 lines
3.8 KiB
Java
113 lines
3.8 KiB
Java
/*
|
|
* Copyright (C) 2012 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 com.android.launcher2;
|
|
|
|
import android.view.View;
|
|
import android.view.ViewGroup;
|
|
import android.view.ViewGroup.OnHierarchyChangeListener;
|
|
|
|
import java.util.HashMap;
|
|
|
|
public class HideFromAccessibilityHelper implements OnHierarchyChangeListener {
|
|
private HashMap<View, Integer> mPreviousValues;
|
|
boolean mHide;
|
|
boolean mOnlyAllApps;
|
|
|
|
public HideFromAccessibilityHelper() {
|
|
mPreviousValues = new HashMap<View, Integer>();
|
|
mHide = false;
|
|
}
|
|
|
|
public void setImportantForAccessibilityToNo(View v, boolean onlyAllApps) {
|
|
mOnlyAllApps = onlyAllApps;
|
|
setImportantForAccessibilityToNoHelper(v);
|
|
mHide = true;
|
|
}
|
|
|
|
private void setImportantForAccessibilityToNoHelper(View v) {
|
|
mPreviousValues.put(v, v.getImportantForAccessibility());
|
|
v.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO);
|
|
|
|
// Call method on children recursively
|
|
if (v instanceof ViewGroup) {
|
|
ViewGroup vg = (ViewGroup) v;
|
|
vg.setOnHierarchyChangeListener(this);
|
|
for (int i = 0; i < vg.getChildCount(); i++) {
|
|
View child = vg.getChildAt(i);
|
|
|
|
if (includeView(child)) {
|
|
setImportantForAccessibilityToNoHelper(child);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public void restoreImportantForAccessibility(View v) {
|
|
if (mHide) {
|
|
restoreImportantForAccessibilityHelper(v);
|
|
}
|
|
mHide = false;
|
|
}
|
|
|
|
private void restoreImportantForAccessibilityHelper(View v) {
|
|
v.setImportantForAccessibility(mPreviousValues.get(v));
|
|
mPreviousValues.remove(v);
|
|
|
|
// Call method on children recursively
|
|
if (v instanceof ViewGroup) {
|
|
ViewGroup vg = (ViewGroup) v;
|
|
|
|
// We assume if a class implements OnHierarchyChangeListener, it listens
|
|
// to changes to any of its children (happens to be the case in Launcher)
|
|
if (vg instanceof OnHierarchyChangeListener) {
|
|
vg.setOnHierarchyChangeListener((OnHierarchyChangeListener) vg);
|
|
} else {
|
|
vg.setOnHierarchyChangeListener(null);
|
|
}
|
|
for (int i = 0; i < vg.getChildCount(); i++) {
|
|
View child = vg.getChildAt(i);
|
|
if (includeView(child)) {
|
|
restoreImportantForAccessibilityHelper(child);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public void onChildViewAdded(View parent, View child) {
|
|
if (mHide && includeView(child)) {
|
|
setImportantForAccessibilityToNoHelper(child);
|
|
}
|
|
}
|
|
|
|
public void onChildViewRemoved(View parent, View child) {
|
|
if (mHide && includeView(child)) {
|
|
restoreImportantForAccessibilityHelper(child);
|
|
}
|
|
}
|
|
|
|
private boolean includeView(View v) {
|
|
return !hasAncestorOfType(v, Cling.class) &&
|
|
(!mOnlyAllApps || hasAncestorOfType(v, AppsCustomizeTabHost.class));
|
|
}
|
|
|
|
private boolean hasAncestorOfType(View v, Class c) {
|
|
return v != null &&
|
|
(v.getClass().equals(c) ||
|
|
(v.getParent() instanceof ViewGroup &&
|
|
hasAncestorOfType((ViewGroup) v.getParent(), c)));
|
|
}
|
|
} |