Skip to content

Commit 36901b6

Browse files
committed
Move HAS_TRANSIENT_STATE flag into a safe area.
Previously, this flag conflicted with other text direction flags, which can cause weird interactions across the View hierarchy, specifically with ListView. Also adds dumpFlags() utility to dump values of all know flags for documentation and sanity checking. Bug: 7189738 Change-Id: Iceb2f93f68a800e19a5889ced93abcce4932b067
1 parent 4046e01 commit 36901b6

File tree

1 file changed

+94
-3
lines changed

1 file changed

+94
-3
lines changed

core/java/android/view/View.java

Lines changed: 94 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,12 +83,18 @@
8383
import com.android.internal.R;
8484
import com.android.internal.util.Predicate;
8585
import com.android.internal.view.menu.MenuBuilder;
86+
import com.google.android.collect.Lists;
87+
import com.google.android.collect.Maps;
8688

8789
import java.lang.ref.WeakReference;
90+
import java.lang.reflect.Field;
8891
import java.lang.reflect.InvocationTargetException;
8992
import java.lang.reflect.Method;
93+
import java.lang.reflect.Modifier;
9094
import java.util.ArrayList;
9195
import java.util.Arrays;
96+
import java.util.Collections;
97+
import java.util.HashMap;
9298
import java.util.Locale;
9399
import java.util.concurrent.CopyOnWriteArrayList;
94100
import java.util.concurrent.atomic.AtomicInteger;
@@ -1727,7 +1733,51 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
17271733
*/
17281734
static final int PFLAG_INVALIDATED = 0x80000000;
17291735

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+
*/
17311781

17321782
/**
17331783
* 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,
18251875
*
18261876
* @hide
18271877
*/
1828-
static final int PFLAG2_HAS_TRANSIENT_STATE = 0x00000100;
1829-
1878+
static final int PFLAG2_HAS_TRANSIENT_STATE = 0x1 << 22;
18301879

18311880
/**
18321881
* Text direction is inherited thru {@link ViewGroup}
@@ -18114,4 +18163,46 @@ public boolean apply(View view) {
1811418163
return (view.mLabelForId == mLabeledId);
1811518164
}
1811618165
}
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+
}
1811718208
}

0 commit comments

Comments
 (0)