diff options
Diffstat (limited to 'core/java')
| -rw-r--r-- | core/java/android/content/pm/ApplicationInfo.java | 20 | ||||
| -rw-r--r-- | core/java/android/content/pm/PackageParser.java | 6 | ||||
| -rw-r--r-- | core/java/android/view/View.java | 126 |
3 files changed, 96 insertions, 56 deletions
diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java index 65a8750..cbabc7c 100644 --- a/core/java/android/content/pm/ApplicationInfo.java +++ b/core/java/android/content/pm/ApplicationInfo.java @@ -291,6 +291,17 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { public static final int FLAG_STOPPED = 1<<21; /** + * Value for {@link #flags}: true when the application is willing to support + * RTL (right to left). All activities will inherit this value. + * + * Set from the {@link android.R.attr#supportsRtl} attribute in the + * activity's manifest. + * + * Default value is false (no support for RTL). + */ + public static final int FLAG_SUPPORTS_RTL = 1<<22; + + /** * Value for {@link #flags}: Set to true if the application has been * installed using the forward lock option. * @@ -466,8 +477,17 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { if (uiOptions != 0) { pw.println(prefix + "uiOptions=0x" + Integer.toHexString(uiOptions)); } + pw.println(prefix + "supportsRtl=" + (hasRtlSupport() ? "true" : "false")); super.dumpBack(pw, prefix); } + + /** + * @return true if "supportsRtl" has been set to true in the AndroidManifest + * @hide + */ + public boolean hasRtlSupport() { + return (flags & FLAG_SUPPORTS_RTL) == FLAG_SUPPORTS_RTL; + } public static class DisplayNameComparator implements Comparator<ApplicationInfo> { diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index eb8536f..a79b86a 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -1761,6 +1761,12 @@ public class PackageParser { ai.flags |= ApplicationInfo.FLAG_LARGE_HEAP; } + if (sa.getBoolean( + com.android.internal.R.styleable.AndroidManifestApplication_supportsRtl, + false /* default is no RTL support*/)) { + ai.flags |= ApplicationInfo.FLAG_SUPPORTS_RTL; + } + String str; str = sa.getNonConfigurationString( com.android.internal.R.styleable.AndroidManifestApplication_permission, 0); diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 69d7655..a9421f0 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -9998,6 +9998,13 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal } /** + * Return true if the application tag in the AndroidManifest has set "supportRtl" to true + */ + private boolean hasRtlSupport() { + return mContext.getApplicationInfo().hasRtlSupport(); + } + + /** * Resolve and cache the layout direction. LTR is set initially. This is implicitly supposing * that the parent directionality can and will be resolved before its children. * Will call {@link View#onResolvedLayoutDirectionChanged} when resolution is done. @@ -10006,30 +10013,32 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal // Clear any previous layout direction resolution mPrivateFlags2 &= ~LAYOUT_DIRECTION_RESOLVED_MASK; - // Set resolved depending on layout direction - switch (getLayoutDirection()) { - case LAYOUT_DIRECTION_INHERIT: - // If this is root view, no need to look at parent's layout dir. - if (canResolveLayoutDirection()) { - ViewGroup viewGroup = ((ViewGroup) mParent); + if (hasRtlSupport()) { + // Set resolved depending on layout direction + switch (getLayoutDirection()) { + case LAYOUT_DIRECTION_INHERIT: + // If this is root view, no need to look at parent's layout dir. + if (canResolveLayoutDirection()) { + ViewGroup viewGroup = ((ViewGroup) mParent); - if (viewGroup.getResolvedLayoutDirection() == LAYOUT_DIRECTION_RTL) { + if (viewGroup.getResolvedLayoutDirection() == LAYOUT_DIRECTION_RTL) { + mPrivateFlags2 |= LAYOUT_DIRECTION_RESOLVED_RTL; + } + } else { + // Nothing to do, LTR by default + } + break; + case LAYOUT_DIRECTION_RTL: + mPrivateFlags2 |= LAYOUT_DIRECTION_RESOLVED_RTL; + break; + case LAYOUT_DIRECTION_LOCALE: + if(isLayoutDirectionRtl(Locale.getDefault())) { mPrivateFlags2 |= LAYOUT_DIRECTION_RESOLVED_RTL; } - } else { + break; + default: // Nothing to do, LTR by default - } - break; - case LAYOUT_DIRECTION_RTL: - mPrivateFlags2 |= LAYOUT_DIRECTION_RESOLVED_RTL; - break; - case LAYOUT_DIRECTION_LOCALE: - if(isLayoutDirectionRtl(Locale.getDefault())) { - mPrivateFlags2 |= LAYOUT_DIRECTION_RESOLVED_RTL; - } - break; - default: - // Nothing to do, LTR by default + } } // Set to resolved @@ -14809,44 +14818,49 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal // Reset any previous text direction resolution mPrivateFlags2 &= ~(TEXT_DIRECTION_RESOLVED | TEXT_DIRECTION_RESOLVED_MASK); - // Set resolved text direction flag depending on text direction flag - final int textDirection = getTextDirection(); - switch(textDirection) { - case TEXT_DIRECTION_INHERIT: - if (canResolveTextDirection()) { - ViewGroup viewGroup = ((ViewGroup) mParent); - - // Set current resolved direction to the same value as the parent's one - final int parentResolvedDirection = viewGroup.getResolvedTextDirection(); - switch (parentResolvedDirection) { - case TEXT_DIRECTION_FIRST_STRONG: - case TEXT_DIRECTION_ANY_RTL: - case TEXT_DIRECTION_LTR: - case TEXT_DIRECTION_RTL: - case TEXT_DIRECTION_LOCALE: - mPrivateFlags2 |= - (parentResolvedDirection << TEXT_DIRECTION_RESOLVED_MASK_SHIFT); - break; - default: - // Default resolved direction is "first strong" heuristic - mPrivateFlags2 |= TEXT_DIRECTION_RESOLVED_DEFAULT; + if (hasRtlSupport()) { + // Set resolved text direction flag depending on text direction flag + final int textDirection = getTextDirection(); + switch(textDirection) { + case TEXT_DIRECTION_INHERIT: + if (canResolveTextDirection()) { + ViewGroup viewGroup = ((ViewGroup) mParent); + + // Set current resolved direction to the same value as the parent's one + final int parentResolvedDirection = viewGroup.getResolvedTextDirection(); + switch (parentResolvedDirection) { + case TEXT_DIRECTION_FIRST_STRONG: + case TEXT_DIRECTION_ANY_RTL: + case TEXT_DIRECTION_LTR: + case TEXT_DIRECTION_RTL: + case TEXT_DIRECTION_LOCALE: + mPrivateFlags2 |= + (parentResolvedDirection << TEXT_DIRECTION_RESOLVED_MASK_SHIFT); + break; + default: + // Default resolved direction is "first strong" heuristic + mPrivateFlags2 |= TEXT_DIRECTION_RESOLVED_DEFAULT; + } + } else { + // We cannot do the resolution if there is no parent, so use the default one + mPrivateFlags2 |= TEXT_DIRECTION_RESOLVED_DEFAULT; } - } else { - // We cannot do the resolution if there is no parent, so use the default one + break; + case TEXT_DIRECTION_FIRST_STRONG: + case TEXT_DIRECTION_ANY_RTL: + case TEXT_DIRECTION_LTR: + case TEXT_DIRECTION_RTL: + case TEXT_DIRECTION_LOCALE: + // Resolved direction is the same as text direction + mPrivateFlags2 |= (textDirection << TEXT_DIRECTION_RESOLVED_MASK_SHIFT); + break; + default: + // Default resolved direction is "first strong" heuristic mPrivateFlags2 |= TEXT_DIRECTION_RESOLVED_DEFAULT; - } - break; - case TEXT_DIRECTION_FIRST_STRONG: - case TEXT_DIRECTION_ANY_RTL: - case TEXT_DIRECTION_LTR: - case TEXT_DIRECTION_RTL: - case TEXT_DIRECTION_LOCALE: - // Resolved direction is the same as text direction - mPrivateFlags2 |= (textDirection << TEXT_DIRECTION_RESOLVED_MASK_SHIFT); - break; - default: - // Default resolved direction is "first strong" heuristic - mPrivateFlags2 |= TEXT_DIRECTION_RESOLVED_DEFAULT; + } + } else { + // Default resolved direction is "first strong" heuristic + mPrivateFlags2 |= TEXT_DIRECTION_RESOLVED_DEFAULT; } // Set to resolved |
