Merge "Fixing scrolling up in App Apps." into ub-launcher3-master

This commit is contained in:
TreeHugger Robot
2018-08-02 22:58:25 +00:00
committed by Android (Google) Code Review
6 changed files with 102 additions and 27 deletions
+4
View File
@@ -602,4 +602,8 @@ public final class Utilities {
msg.setAsynchronous(true);
handler.sendMessage(msg);
}
public interface Consumer<T> {
void accept(T var1);
}
}
@@ -21,6 +21,7 @@ import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.Rect;
import android.os.Bundle;
import android.os.Process;
import android.support.animation.DynamicAnimation;
import android.support.annotation.NonNull;
@@ -48,6 +49,7 @@ import com.android.launcher3.ItemInfo;
import com.android.launcher3.Launcher;
import com.android.launcher3.R;
import com.android.launcher3.Utilities;
import com.android.launcher3.compat.AccessibilityManagerCompat;
import com.android.launcher3.config.FeatureFlags;
import com.android.launcher3.keyboard.FocusedItemDecorator;
import com.android.launcher3.userevent.nano.LauncherLogProto.Target;
@@ -549,4 +551,16 @@ public class AllAppsContainerView extends SpringRelativeLayout implements DragSo
&& verticalFadingEdge);
}
}
@Override
public boolean performAccessibilityAction(int action, Bundle arguments) {
if (AccessibilityManagerCompat.processTestRequest(
mLauncher, "TAPL_GET_SCROLL", action, arguments,
response ->
response.putInt("scrollY", getActiveRecyclerView().getCurrentScrollY()))) {
return true;
}
return super.performAccessibilityAction(action, arguments);
}
}
@@ -18,9 +18,11 @@ package com.android.launcher3.compat;
import android.accessibilityservice.AccessibilityServiceInfo;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.AccessibilityNodeInfo;
import com.android.launcher3.Utilities;
@@ -49,17 +51,60 @@ public class AccessibilityManagerCompat {
}
public static void sendEventToTest(Context context, String eventTag) {
if (!Utilities.IS_RUNNING_IN_TEST_HARNESS) return;
final AccessibilityManager accessibilityManager = getAccessibilityManagerForTest(context);
if (accessibilityManager == null) return;
sendEventToTest(accessibilityManager, eventTag, null);
}
private static void sendEventToTest(
AccessibilityManager accessibilityManager, String eventTag, Bundle data) {
final AccessibilityEvent e = AccessibilityEvent.obtain(
AccessibilityEvent.TYPE_ANNOUNCEMENT);
e.setClassName(eventTag);
e.setParcelableData(data);
accessibilityManager.sendAccessibilityEvent(e);
}
/**
* Returns accessibility manager to be used for communication with UI Automation tests.
* The tests may exchange custom accessibility messages with the launcher; the accessibility
* manager is used in these communications.
*
* If the launcher runs not under a test, the return is null, and no attempt to process or send
* custom accessibility messages should be made.
*/
private static AccessibilityManager getAccessibilityManagerForTest(Context context) {
// If not running in a test harness, don't participate in test exchanges.
if (!Utilities.IS_RUNNING_IN_TEST_HARNESS) return null;
// Additional safety check: when running under UI Automation, accessibility is enabled,
// but the list of accessibility services is empty. Return null if this is not the case.
final AccessibilityManager accessibilityManager = getManager(context);
if (accessibilityManager.isEnabled() &&
if (!accessibilityManager.isEnabled() ||
accessibilityManager.getEnabledAccessibilityServiceList(
AccessibilityServiceInfo.FEEDBACK_ALL_MASK).size() == 0) {
final AccessibilityEvent e = AccessibilityEvent.obtain(
AccessibilityEvent.TYPE_ANNOUNCEMENT);
e.setClassName(eventTag);
accessibilityManager.sendAccessibilityEvent(e);
AccessibilityServiceInfo.FEEDBACK_ALL_MASK).size() > 0) {
return null;
}
return accessibilityManager;
}
public static boolean processTestRequest(Context context, String eventTag, int action,
Bundle request, Utilities.Consumer<Bundle> responseFiller) {
final AccessibilityManager accessibilityManager = getAccessibilityManagerForTest(context);
if (accessibilityManager == null) return false;
// The test sends a request via a ACTION_SET_TEXT.
if (action == AccessibilityNodeInfo.ACTION_SET_TEXT &&
eventTag.equals(request.getCharSequence(
AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE))) {
final Bundle response = new Bundle();
responseFiller.accept(response);
AccessibilityManagerCompat.sendEventToTest(
accessibilityManager, eventTag + "_RESPONSE", response);
return true;
}
return false;
}
}