Index: chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelTextViewInflater.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelTextViewInflater.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelTextViewInflater.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..97eb0e8391c188ca8f866e9b2765c59f8c2c0a09 |
--- /dev/null |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelTextViewInflater.java |
@@ -0,0 +1,88 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+package org.chromium.chrome.browser.compositor.bottombar; |
+ |
+import android.annotation.SuppressLint; |
+import android.content.Context; |
+import android.util.LayoutDirection; |
+import android.view.Gravity; |
+import android.view.View; |
+import android.view.View.OnLayoutChangeListener; |
+import android.view.ViewGroup; |
+import android.widget.TextView; |
+ |
+import org.chromium.ui.base.LocalizationUtils; |
+import org.chromium.ui.resources.dynamics.DynamicResourceLoader; |
+ |
+/** |
+ * Provides an {@link OverlayPanelInflater} that adjusts a text view to override the RTL/LTR |
+ * ordering when the initial text fragment is short. |
+ * Details in this issue: crbug.com/651389. |
+ */ |
+public abstract class OverlayPanelTextViewInflater |
+ extends OverlayPanelInflater implements OnLayoutChangeListener { |
+ private static final float SHORTNESS_FACTOR = 0.5f; |
+ |
+ private boolean mDidAdjustViewDirection; |
+ |
+ /** |
+ * Constructs an instance similar to an {@link OverlayPanelInflater} that can adjust the RTL/LTR |
+ * ordering of text fragments whose initial values are considered short relative to the width |
+ * of the view. |
+ */ |
+ public OverlayPanelTextViewInflater(OverlayPanel panel, int layoutId, int viewId, |
+ Context context, ViewGroup container, DynamicResourceLoader resourceLoader) { |
+ super(panel, layoutId, viewId, context, container, resourceLoader); |
+ } |
+ |
+ /** |
+ * Subclasses must override to return the {@link TextView} once it's inflated. |
+ * @return The {@link TextView} or {@code null} if not yet inflated. |
+ */ |
+ protected abstract TextView getTextView(); |
+ |
+ //======================================================================================== |
+ // OverlayPanelInflater overrides |
+ //======================================================================================== |
+ |
+ @Override |
+ protected void onFinishInflate() { |
+ super.onFinishInflate(); |
+ |
+ View view = getView(); |
+ view.addOnLayoutChangeListener(this); |
+ } |
+ |
+ @Override |
+ public void onLayoutChange(View view, int left, int top, int right, int bottom, int oldLeft, |
+ int oldTop, int oldRight, int oldBottom) { |
+ TextView textView = getTextView(); |
+ if (!mDidAdjustViewDirection && textView != null) { |
+ // We only adjust the view once, based on the initial value set at layout time. |
+ mDidAdjustViewDirection = true; |
+ adjustViewDirection(textView); |
+ } |
+ } |
+ |
+ //======================================================================================== |
+ // Private methods |
+ //======================================================================================== |
+ |
+ /** |
+ * Adjusts the given {@code TextView} to have a layout direction that matches the UI direction |
+ * when the contents of the view is considered short (based on SHORTNESS_FACTOR). |
+ * @param textView The text view to adjust. |
+ */ |
+ @SuppressLint("RtlHardcoded") |
+ private void adjustViewDirection(TextView textView) { |
+ float textWidth = textView.getPaint().measureText(textView.getText().toString()); |
+ if (textWidth < SHORTNESS_FACTOR * textView.getWidth()) { |
+ int layoutDirection = |
+ LocalizationUtils.isLayoutRtl() ? LayoutDirection.RTL : LayoutDirection.LTR; |
+ if (layoutDirection == LayoutDirection.LTR) textView.setGravity(Gravity.LEFT); |
+ if (layoutDirection == LayoutDirection.RTL) textView.setGravity(Gravity.RIGHT); |
+ } |
+ } |
+} |