How To Use The Accessibility Delegate To Adjust The Speech?

Viewed 4918

I would like to use the AccessibilityDelegateCompatto adjust the the content of the AccessibilityEvent.

I've seen various example but I am not sure why I am not able to append to the voice over output.

This is the full code

@Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_more, container, false);

        ViewCompat.setAccessibilityDelegate(mProfilePic,new AccessibilityDelegateCompat(){
            @Override
            public void sendAccessibilityEvent(View host, int eventType) {
                super.sendAccessibilityEvent(host, eventType);
            }

            @Override
            public void sendAccessibilityEventUnchecked(View host, AccessibilityEvent event) {
                event.getText().add("TEST");
                super.sendAccessibilityEventUnchecked(host, event);
            }

            @Override
            public boolean dispatchPopulateAccessibilityEvent(View host, AccessibilityEvent event) {
                event.getText().add("TEST");
                return super.dispatchPopulateAccessibilityEvent(host, event);
            }

            @Override
            public void onPopulateAccessibilityEvent(View host, AccessibilityEvent event) {
                event.getText().add("TEST");
                super.onPopulateAccessibilityEvent(host, event);
                event.getText().add("TEST");
            }

            @Override
            public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) {
                event.getText().add("TEST");
                super.onInitializeAccessibilityEvent(host, event);
            }

            @Override
            public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) {
                super.onInitializeAccessibilityNodeInfo(host, info);
            }

            @Override
            public boolean onRequestSendAccessibilityEvent(ViewGroup host, View child, AccessibilityEvent event) {
                event.getText().add("TEST");
                return super.onRequestSendAccessibilityEvent(host, child, event);
            }

            @Override
            public AccessibilityNodeProviderCompat getAccessibilityNodeProvider(View host) {
                return super.getAccessibilityNodeProvider(host);
            }

            @Override
            public boolean performAccessibilityAction(View host, int action, Bundle args) {
                return super.performAccessibilityAction(host, action, args);
            }
        });

        return view;
    }

As seen I have tried adding my content in various places. Note that the mProfilePic has content description set in XML. I would like to add to the existing content description but in code.

1 Answers

Got a solution which seems to be working. I tested this on a Nexus 6p with Google's Talkback and a Samsung S7 using Samsung Voice.

    ViewCompat.setAccessibilityDelegate(mProfilePic, new AccessibilityDelegateCompat() {

     private boolean didPerformAccessibilityAction = false

     @Override
     public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) {
      super.onInitializeAccessibilityNodeInfo(host, info);
      if (didPerformAccessibilityAction) {
       didPerformAccessibilityAction = false
       info.contentDescription = "MY NEW CONTENT"
      }
     }

     @Override
     public boolean performAccessibilityAction(View host, int action, Bundle args) {
      didPerformAccessibilityAction = super.performAccessibilityAction(host, action, args)
      return didPerformAccessibilityAction
     }
    });

onInitializeAccessibilityNodeInfo is called last just before the accessibility event is processed. It is on this last stage that the content description to be announced is set again.

So what ever changes any of the other delegate methods make have no effect because onInitializeAccessibilityNodeInfo overwrites it.

This method is called for every child to init the node info so we need a blocker until a real accessibility event is made before we invoke the modifier so we wait until performAccessibilityAction which appears to be called on a real event before we do a modification.

Related