|
83 | 83 | import com.android.internal.R; |
84 | 84 | import com.android.internal.util.Predicate; |
85 | 85 | import com.android.internal.view.menu.MenuBuilder; |
| 86 | +import com.google.android.collect.Lists; |
| 87 | +import com.google.android.collect.Maps; |
86 | 88 |
|
87 | 89 | import java.lang.ref.WeakReference; |
| 90 | +import java.lang.reflect.Field; |
88 | 91 | import java.lang.reflect.InvocationTargetException; |
89 | 92 | import java.lang.reflect.Method; |
| 93 | +import java.lang.reflect.Modifier; |
90 | 94 | import java.util.ArrayList; |
91 | 95 | import java.util.Arrays; |
| 96 | +import java.util.Collections; |
| 97 | +import java.util.HashMap; |
92 | 98 | import java.util.Locale; |
93 | 99 | import java.util.concurrent.CopyOnWriteArrayList; |
94 | 100 | import java.util.concurrent.atomic.AtomicInteger; |
@@ -1727,7 +1733,51 @@ public class View implements Drawable.Callback, KeyEvent.Callback, |
1727 | 1733 | */ |
1728 | 1734 | static final int PFLAG_INVALIDATED = 0x80000000; |
1729 | 1735 |
|
1730 | | - /* Masks for mPrivateFlags2 */ |
| 1736 | + /** |
| 1737 | + * Masks for mPrivateFlags2, as generated by dumpFlags(): |
| 1738 | + * |
| 1739 | + * -------|-------|-------|-------| |
| 1740 | + * PFLAG2_TEXT_ALIGNMENT_FLAGS[0] |
| 1741 | + * PFLAG2_TEXT_DIRECTION_FLAGS[0] |
| 1742 | + * 1 PFLAG2_DRAG_CAN_ACCEPT |
| 1743 | + * 1 PFLAG2_DRAG_HOVERED |
| 1744 | + * 1 PFLAG2_LAYOUT_DIRECTION_MASK_SHIFT |
| 1745 | + * 11 PFLAG2_TEXT_DIRECTION_MASK_SHIFT |
| 1746 | + * 1 1 PFLAG2_TEXT_DIRECTION_RESOLVED_MASK_SHIFT |
| 1747 | + * 11 PFLAG2_LAYOUT_DIRECTION_MASK |
| 1748 | + * 11 1 PFLAG2_TEXT_ALIGNMENT_MASK_SHIFT |
| 1749 | + * 1 PFLAG2_LAYOUT_DIRECTION_RESOLVED_RTL |
| 1750 | + * 1 1 PFLAG2_TEXT_ALIGNMENT_RESOLVED_MASK_SHIFT |
| 1751 | + * 1 1 PFLAG2_IMPORTANT_FOR_ACCESSIBILITY_SHIFT |
| 1752 | + * 1 PFLAG2_LAYOUT_DIRECTION_RESOLVED |
| 1753 | + * 11 PFLAG2_LAYOUT_DIRECTION_RESOLVED_MASK |
| 1754 | + * 1 PFLAG2_TEXT_DIRECTION_FLAGS[1] |
| 1755 | + * 1 PFLAG2_TEXT_DIRECTION_FLAGS[2] |
| 1756 | + * 11 PFLAG2_TEXT_DIRECTION_FLAGS[3] |
| 1757 | + * 1 PFLAG2_TEXT_DIRECTION_FLAGS[4] |
| 1758 | + * 1 1 PFLAG2_TEXT_DIRECTION_FLAGS[5] |
| 1759 | + * 111 PFLAG2_TEXT_DIRECTION_MASK |
| 1760 | + * 1 PFLAG2_TEXT_DIRECTION_RESOLVED |
| 1761 | + * 1 PFLAG2_TEXT_DIRECTION_RESOLVED_DEFAULT |
| 1762 | + * 111 PFLAG2_TEXT_DIRECTION_RESOLVED_MASK |
| 1763 | + * 1 PFLAG2_TEXT_ALIGNMENT_FLAGS[1] |
| 1764 | + * 1 PFLAG2_TEXT_ALIGNMENT_FLAGS[2] |
| 1765 | + * 11 PFLAG2_TEXT_ALIGNMENT_FLAGS[3] |
| 1766 | + * 1 PFLAG2_TEXT_ALIGNMENT_FLAGS[4] |
| 1767 | + * 1 1 PFLAG2_TEXT_ALIGNMENT_FLAGS[5] |
| 1768 | + * 11 PFLAG2_TEXT_ALIGNMENT_FLAGS[6] |
| 1769 | + * 111 PFLAG2_TEXT_ALIGNMENT_MASK |
| 1770 | + * 1 PFLAG2_TEXT_ALIGNMENT_RESOLVED |
| 1771 | + * 1 PFLAG2_TEXT_ALIGNMENT_RESOLVED_DEFAULT |
| 1772 | + * 111 PFLAG2_TEXT_ALIGNMENT_RESOLVED_MASK |
| 1773 | + * 11 PFLAG2_IMPORTANT_FOR_ACCESSIBILITY_MASK |
| 1774 | + * 1 PFLAG2_HAS_TRANSIENT_STATE |
| 1775 | + * 1 PFLAG2_ACCESSIBILITY_FOCUSED |
| 1776 | + * 1 PFLAG2_ACCESSIBILITY_STATE_CHANGED |
| 1777 | + * 1 PFLAG2_VIEW_QUICK_REJECTED |
| 1778 | + * 1 PFLAG2_PADDING_RESOLVED |
| 1779 | + * -------|-------|-------|-------| |
| 1780 | + */ |
1731 | 1781 |
|
1732 | 1782 | /** |
1733 | 1783 | * Indicates that this view has reported that it can accept the current drag's content. |
@@ -1825,8 +1875,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, |
1825 | 1875 | * |
1826 | 1876 | * @hide |
1827 | 1877 | */ |
1828 | | - static final int PFLAG2_HAS_TRANSIENT_STATE = 0x00000100; |
1829 | | - |
| 1878 | + static final int PFLAG2_HAS_TRANSIENT_STATE = 0x1 << 22; |
1830 | 1879 |
|
1831 | 1880 | /** |
1832 | 1881 | * Text direction is inherited thru {@link ViewGroup} |
@@ -18114,4 +18163,46 @@ public boolean apply(View view) { |
18114 | 18163 | return (view.mLabelForId == mLabeledId); |
18115 | 18164 | } |
18116 | 18165 | } |
| 18166 | + |
| 18167 | + /** |
| 18168 | + * Dump all private flags in readable format, useful for documentation and |
| 18169 | + * sanity checking. |
| 18170 | + */ |
| 18171 | + private static void dumpFlags() { |
| 18172 | + final HashMap<String, String> found = Maps.newHashMap(); |
| 18173 | + try { |
| 18174 | + for (Field field : View.class.getDeclaredFields()) { |
| 18175 | + final int modifiers = field.getModifiers(); |
| 18176 | + if (Modifier.isStatic(modifiers) && Modifier.isFinal(modifiers)) { |
| 18177 | + if (field.getType().equals(int.class)) { |
| 18178 | + final int value = field.getInt(null); |
| 18179 | + dumpFlag(found, field.getName(), value); |
| 18180 | + } else if (field.getType().equals(int[].class)) { |
| 18181 | + final int[] values = (int[]) field.get(null); |
| 18182 | + for (int i = 0; i < values.length; i++) { |
| 18183 | + dumpFlag(found, field.getName() + "[" + i + "]", values[i]); |
| 18184 | + } |
| 18185 | + } |
| 18186 | + } |
| 18187 | + } |
| 18188 | + } catch (IllegalAccessException e) { |
| 18189 | + throw new RuntimeException(e); |
| 18190 | + } |
| 18191 | + |
| 18192 | + final ArrayList<String> keys = Lists.newArrayList(); |
| 18193 | + keys.addAll(found.keySet()); |
| 18194 | + Collections.sort(keys); |
| 18195 | + for (String key : keys) { |
| 18196 | + Log.d(VIEW_LOG_TAG, found.get(key)); |
| 18197 | + } |
| 18198 | + } |
| 18199 | + |
| 18200 | + private static void dumpFlag(HashMap<String, String> found, String name, int value) { |
| 18201 | + // Sort flags by prefix, then by bits, always keeping unique keys |
| 18202 | + final String bits = String.format("%32s", Integer.toBinaryString(value)).replace('0', ' '); |
| 18203 | + final int prefix = name.indexOf('_'); |
| 18204 | + final String key = (prefix > 0 ? name.substring(0, prefix) : name) + bits + name; |
| 18205 | + final String output = bits + " " + name; |
| 18206 | + found.put(key, output); |
| 18207 | + } |
18117 | 18208 | } |
0 commit comments