OSDN Git Service

Print A11yEv. Content Change Types in DEBUG toString
authorEugene Susla <eugenesusla@google.com>
Tue, 16 May 2017 21:16:38 +0000 (14:16 -0700)
committerEugene Susla <eugenesusla@google.com>
Wed, 17 May 2017 18:13:05 +0000 (11:13 -0700)
Test: Enable debug, and ensure changeTypes are properly displayed
Change-Id: I1bf6a9f56a72e867a0bc967a5e3527eb4dc83952

core/java/android/text/TextUtils.java
core/java/android/view/accessibility/AccessibilityEvent.java
core/java/com/android/internal/util/BitUtils.java

index 585f882..3baadd4 100644 (file)
@@ -1943,6 +1943,16 @@ public class TextUtils {
         return charSequence;
     }
 
+    /**
+     * Prepends {@code start} and appends {@code end} to a given {@link StringBuilder}
+     *
+     * @hide
+     */
+    public static void wrap(StringBuilder builder, String start, String end) {
+        builder.insert(0, start);
+        builder.append(end);
+    }
+
     private static Object sLock = new Object();
 
     private static char[] sTemp = null;
index c6563fd..341386c 100644 (file)
@@ -21,6 +21,8 @@ import android.os.Parcelable;
 import android.text.TextUtils;
 import android.util.Pools.SynchronizedPool;
 
+import com.android.internal.util.BitUtils;
+
 import java.util.ArrayList;
 import java.util.List;
 
@@ -852,6 +854,22 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par
         return mContentChangeTypes;
     }
 
+    private static String contentChangeTypesToString(int types) {
+        return BitUtils.flagsToString(types, AccessibilityEvent::singleContentChangeTypeToString);
+    }
+
+    private static String singleContentChangeTypeToString(int type) {
+        switch (type) {
+            case CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION: {
+                return "CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION";
+            }
+            case CONTENT_CHANGE_TYPE_SUBTREE: return "CONTENT_CHANGE_TYPE_SUBTREE";
+            case CONTENT_CHANGE_TYPE_TEXT: return "CONTENT_CHANGE_TYPE_TEXT";
+            case CONTENT_CHANGE_TYPE_UNDEFINED: return "CONTENT_CHANGE_TYPE_UNDEFINED";
+            default: return Integer.toHexString(type);
+        }
+    }
+
     /**
      * Sets the bit mask of node tree changes signaled by an
      * {@link #TYPE_WINDOW_CONTENT_CHANGED} event.
@@ -1187,7 +1205,8 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par
         builder.append(super.toString());
         if (DEBUG) {
             builder.append("\n");
-            builder.append("; ContentChangeTypes: ").append(mContentChangeTypes);
+            builder.append("; ContentChangeTypes: ").append(
+                    contentChangeTypesToString(mContentChangeTypes));
             builder.append("; sourceWindowId: ").append(mSourceWindowId);
             if (mSourceNode != null) {
                 builder.append("; mSourceNodeId: ").append(mSourceNode.getSourceNodeId());
index 7d49987..28f12eb 100644 (file)
 package com.android.internal.util;
 
 import android.annotation.Nullable;
+import android.text.TextUtils;
 
 import libcore.util.Objects;
 
 import java.nio.ByteBuffer;
 import java.util.Arrays;
 import java.util.UUID;
+import java.util.function.IntFunction;
 
 /**
  * A utility class for handling unsigned integers and unsigned arithmetics, as well as syntactic
@@ -132,4 +134,18 @@ public final class BitUtils {
     public static long bitAt(int bitIndex) {
         return 1L << bitIndex;
     }
+
+    public static String flagsToString(int flags, IntFunction<String> getFlagName) {
+        StringBuilder builder = new StringBuilder();
+        int count = 0;
+        while (flags != 0) {
+            final int flag = 1 << Integer.numberOfTrailingZeros(flags);
+            flags &= ~flag;
+            if (count > 0) builder.append(", ");
+            builder.append(getFlagName.apply(flag));
+            count++;
+        }
+        TextUtils.wrap(builder, "[", "]");
+        return builder.toString();
+    }
 }