Quellcode durchsuchen

RTL support everywhere else, resolves #1581

Aidan Follestad vor 6 Jahren
Ursprung
Commit
b571da4118

+ 3 - 3
core/src/main/java/com/afollestad/materialdialogs/internal/button/DialogActionButton.kt

@@ -10,8 +10,6 @@ import android.content.Context
 import android.support.v7.widget.AppCompatButton
 import android.util.AttributeSet
 import android.view.Gravity.CENTER
-import android.view.Gravity.CENTER_VERTICAL
-import android.view.Gravity.END
 import com.afollestad.materialdialogs.R
 import com.afollestad.materialdialogs.R.attr
 import com.afollestad.materialdialogs.Theme.Companion.inferTheme
@@ -19,6 +17,7 @@ import com.afollestad.materialdialogs.Theme.LIGHT
 import com.afollestad.materialdialogs.utils.dimenPx
 import com.afollestad.materialdialogs.utils.getColor
 import com.afollestad.materialdialogs.utils.getDrawable
+import com.afollestad.materialdialogs.utils.setGravityEndCompat
 import com.afollestad.materialdialogs.utils.updatePadding
 
 /**
@@ -66,7 +65,8 @@ internal class DialogActionButton(
     updatePadding(left = sidePadding, right = sidePadding)
 
     // Text alignment
-    gravity = if (stacked) CENTER_VERTICAL and END else CENTER
+    if (stacked) setGravityEndCompat()
+    else gravity = CENTER
 
     // Invalidate in case enabled state was changed before this method executed
     isEnabled = isEnabled

+ 58 - 16
core/src/main/java/com/afollestad/materialdialogs/internal/button/DialogActionButtonLayout.kt

@@ -10,6 +10,9 @@ import android.content.Context
 import android.graphics.Canvas
 import android.support.v7.widget.AppCompatCheckBox
 import android.util.AttributeSet
+import android.view.View.MeasureSpec.AT_MOST
+import android.view.View.MeasureSpec.EXACTLY
+import android.view.View.MeasureSpec.UNSPECIFIED
 import android.view.View.MeasureSpec.getSize
 import android.view.View.MeasureSpec.makeMeasureSpec
 import com.afollestad.materialdialogs.R
@@ -19,6 +22,7 @@ import com.afollestad.materialdialogs.internal.main.DEBUG_COLOR_BLUE
 import com.afollestad.materialdialogs.internal.main.DEBUG_COLOR_DARK_PINK
 import com.afollestad.materialdialogs.internal.main.DEBUG_COLOR_PINK
 import com.afollestad.materialdialogs.utils.dimenPx
+import com.afollestad.materialdialogs.utils.isRtl
 import com.afollestad.materialdialogs.utils.isVisible
 
 /**
@@ -87,10 +91,10 @@ internal class DialogActionButtonLayout(
     val parentWidth = getSize(widthMeasureSpec)
 
     if (checkBoxPrompt.isVisible()) {
-      val checkboxPromptWidth = parentWidth - (checkBoxPromptMarginHorizontal * 2)
+      val checkboxPromptMaxWidth = parentWidth - (checkBoxPromptMarginHorizontal * 2)
       checkBoxPrompt.measure(
-          makeMeasureSpec(checkboxPromptWidth, MeasureSpec.EXACTLY),
-          makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)
+          makeMeasureSpec(checkboxPromptMaxWidth, AT_MOST),
+          makeMeasureSpec(0, UNSPECIFIED)
       )
     }
 
@@ -98,22 +102,22 @@ internal class DialogActionButtonLayout(
     val baseContext = dialogParent().dialog.context
     val appContext = dialogParent().dialog.windowContext
     for (button in visibleButtons) {
-      button.update(
-          baseContext = baseContext,
-          appContext = appContext,
-          stacked = stackButtons
-      )
       if (stackButtons) {
         button.measure(
-            makeMeasureSpec(parentWidth, MeasureSpec.EXACTLY),
-            makeMeasureSpec(buttonHeightStacked, MeasureSpec.EXACTLY)
+            makeMeasureSpec(parentWidth, EXACTLY),
+            makeMeasureSpec(buttonHeightStacked, EXACTLY)
         )
       } else {
         button.measure(
-            makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
-            makeMeasureSpec(buttonHeightDefault, MeasureSpec.EXACTLY)
+            makeMeasureSpec(0, UNSPECIFIED),
+            makeMeasureSpec(buttonHeightDefault, EXACTLY)
         )
       }
+      button.update(
+          baseContext = baseContext,
+          appContext = appContext,
+          stacked = stackButtons
+      )
     }
 
     if (visibleButtons.isNotEmpty() && !stackButtons) {
@@ -146,10 +150,21 @@ internal class DialogActionButtonLayout(
     }
 
     if (checkBoxPrompt.isVisible()) {
-      val promptLeft = checkBoxPromptMarginHorizontal
-      val promptTop = checkBoxPromptMarginVertical
-      val promptRight = promptLeft + checkBoxPrompt.measuredWidth
-      val promptBottom = promptTop + checkBoxPrompt.measuredHeight
+      val promptLeft: Int
+      val promptTop: Int
+      val promptRight: Int
+      val promptBottom: Int
+      if (isRtl()) {
+        promptRight = measuredWidth - checkBoxPromptMarginHorizontal
+        promptTop = checkBoxPromptMarginVertical
+        promptLeft = promptRight - checkBoxPrompt.measuredWidth
+        promptBottom = promptTop + checkBoxPrompt.measuredHeight
+      } else {
+        promptLeft = checkBoxPromptMarginHorizontal
+        promptTop = checkBoxPromptMarginVertical
+        promptRight = promptLeft + checkBoxPrompt.measuredWidth
+        promptBottom = promptTop + checkBoxPrompt.measuredHeight
+      }
       checkBoxPrompt.layout(
           promptLeft,
           promptTop,
@@ -165,6 +180,33 @@ internal class DialogActionButtonLayout(
         button.layout(0, topY, measuredWidth, bottomY)
         topY = bottomY
       }
+    } else if (isRtl()) {
+      val topY = measuredHeight - (requiredHeightForButtons() - buttonFramePadding)
+      val bottomY = measuredHeight - buttonFramePadding
+
+      if (actionButtons[INDEX_NEUTRAL].isVisible()) {
+        val btn = actionButtons[INDEX_NEUTRAL]
+        val rightX = measuredWidth - buttonFramePaddingNeutral
+        btn.layout(
+            rightX - btn.measuredWidth,
+            topY,
+            rightX,
+            bottomY
+        )
+      }
+
+      var leftX = buttonFramePadding
+      if (actionButtons[INDEX_POSITIVE].isVisible()) {
+        val btn = actionButtons[INDEX_POSITIVE]
+        val rightX = leftX + btn.measuredWidth
+        btn.layout(leftX, topY, rightX, bottomY)
+        leftX = rightX + buttonSpacing
+      }
+      if (actionButtons[INDEX_NEGATIVE].isVisible()) {
+        val btn = actionButtons[INDEX_NEGATIVE]
+        val rightX = leftX + btn.measuredWidth
+        btn.layout(leftX, topY, rightX, bottomY)
+      }
     } else {
       val topY = measuredHeight - (requiredHeightForButtons() - buttonFramePadding)
       val bottomY = measuredHeight - buttonFramePadding

+ 2 - 10
core/src/main/java/com/afollestad/materialdialogs/internal/rtl/RtlTextView.kt

@@ -6,13 +6,10 @@
 
 package com.afollestad.materialdialogs.internal.rtl
 
-import android.annotation.SuppressLint
 import android.content.Context
 import android.util.AttributeSet
-import android.view.Gravity.LEFT
-import android.view.Gravity.RIGHT
 import android.widget.TextView
-import com.afollestad.materialdialogs.utils.isRtl
+import com.afollestad.materialdialogs.utils.setGravityStartCompat
 
 /**
  * With our custom layout-ing, using START/END gravity doesn't work so we manually
@@ -20,17 +17,12 @@ import com.afollestad.materialdialogs.utils.isRtl
  *
  * @author Aidan Follestad (afollestad)
  */
-@SuppressLint("RtlHardcoded")
 class RtlTextView(
   context: Context,
   attrs: AttributeSet?
 ) : TextView(context, attrs) {
 
   init {
-    if (isRtl()) {
-      this.gravity = RIGHT
-    } else {
-      this.gravity = LEFT
-    }
+    setGravityStartCompat()
   }
 }

+ 17 - 3
core/src/main/java/com/afollestad/materialdialogs/utils/ViewExt.kt

@@ -6,12 +6,14 @@
 
 package com.afollestad.materialdialogs.utils
 
+import android.annotation.SuppressLint
 import android.content.Context
 import android.os.Build.VERSION.SDK_INT
 import android.os.Build.VERSION_CODES.JELLY_BEAN_MR1
 import android.support.annotation.LayoutRes
 import android.support.annotation.RestrictTo
 import android.support.annotation.RestrictTo.Scope
+import android.view.Gravity
 import android.view.LayoutInflater
 import android.view.View
 import android.view.View.INVISIBLE
@@ -20,6 +22,7 @@ import android.view.ViewGroup
 import android.view.ViewGroup.MarginLayoutParams
 import android.view.ViewTreeObserver
 import android.widget.Button
+import android.widget.TextView
 import com.afollestad.materialdialogs.MaterialDialog
 
 @Suppress("UNCHECKED_CAST")
@@ -109,7 +112,18 @@ internal fun <T : View> T.isRtl(): Boolean {
   return resources.configuration.layoutDirection == View.LAYOUT_DIRECTION_RTL
 }
 
-@RestrictTo(Scope.LIBRARY_GROUP)
-fun <T : View> T.setVisible(visible: Boolean) {
-  visibility = if (visible) VISIBLE else INVISIBLE
+internal fun TextView.setGravityStartCompat() {
+  if (SDK_INT >= JELLY_BEAN_MR1) {
+    this.textAlignment = View.TEXT_ALIGNMENT_VIEW_START
+  } else {
+    this.gravity = Gravity.START
+  }
+}
+
+internal fun TextView.setGravityEndCompat() {
+  if (SDK_INT >= JELLY_BEAN_MR1) {
+    this.textAlignment = View.TEXT_ALIGNMENT_VIEW_END
+  } else {
+    this.gravity = Gravity.END
+  }
 }

+ 2 - 1
core/src/main/res/layout/md_dialog_base.xml

@@ -41,8 +41,9 @@
 
     <android.support.v7.widget.AppCompatCheckBox
         android:id="@+id/md_checkbox_prompt"
-        android:layout_width="match_parent"
+        android:layout_width="wrap_content"
         android:layout_height="wrap_content"
+        android:gravity="start|center_vertical"
         android:visibility="gone"
         />
 

+ 1 - 1
core/src/main/res/layout/md_listitem.xml

@@ -3,7 +3,7 @@
     xmlns:tools="http://schemas.android.com/tools"
     style="@style/MD_ListItem"
     >
-  <TextView
+  <com.afollestad.materialdialogs.internal.rtl.RtlTextView
       android:id="@+id/md_title"
       style="@style/MD_ListItemText"
       tools:text="Item"

+ 1 - 1
core/src/main/res/layout/md_listitem_multichoice.xml

@@ -7,7 +7,7 @@
       android:id="@+id/md_control"
       style="@style/MD_ListItem_Control"
       />
-  <TextView
+  <com.afollestad.materialdialogs.internal.rtl.RtlTextView
       android:id="@+id/md_title"
       tools:text="Item"
       style="@style/MD_ListItemText.Choice"

+ 1 - 1
core/src/main/res/layout/md_listitem_singlechoice.xml

@@ -7,7 +7,7 @@
       android:id="@+id/md_control"
       style="@style/MD_ListItem_Control"
       />
-  <TextView
+  <com.afollestad.materialdialogs.internal.rtl.RtlTextView
       android:id="@+id/md_title"
       tools:text="Item"
       style="@style/MD_ListItemText.Choice"

+ 1 - 1
files/src/main/java/com/afollestad/materialdialogs/files/FileChooserAdapter.kt

@@ -24,7 +24,7 @@ import com.afollestad.materialdialogs.files.utilext.getDrawable
 import com.afollestad.materialdialogs.files.utilext.hasParent
 import com.afollestad.materialdialogs.files.utilext.isColorDark
 import com.afollestad.materialdialogs.files.utilext.jumpOverEmulated
-import com.afollestad.materialdialogs.utils.setVisible
+import com.afollestad.materialdialogs.files.utilext.setVisible
 import java.io.File
 
 internal class FileChooserViewHolder(

+ 13 - 0
files/src/main/java/com/afollestad/materialdialogs/files/utilext/ViewExt.kt

@@ -0,0 +1,13 @@
+/*
+ * Licensed under Apache-2.0
+ *
+ * Designed an developed by Aidan Follestad (afollestad)
+ */
+
+package com.afollestad.materialdialogs.files.utilext
+
+import android.view.View
+
+internal fun <T : View> T.setVisible(visible: Boolean) {
+  visibility = if (visible) View.VISIBLE else View.INVISIBLE
+}

+ 4 - 1
files/src/main/res/drawable/icon_file_dark.xml

@@ -1,9 +1,12 @@
 <vector
     xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:autoMirrored="true"
     android:height="36dp"
     android:viewportHeight="24.0"
     android:viewportWidth="24.0"
-    android:width="36dp">
+    android:width="36dp"
+    tools:ignore="UnusedAttribute,VectorRaster">
   <path
       android:fillColor="#424242"
       android:pathData="M6,2c-1.1,0 -1.99,0.9 -1.99,2L4,20c0,1.1 0.89,2 1.99,2L18,22c1.1,0 2,-0.9 2,-2L20,8l-6,-6L6,2zM13,9L13,3.5L18.5,9L13,9z"/>

+ 4 - 1
files/src/main/res/drawable/icon_file_light.xml

@@ -1,9 +1,12 @@
 <vector
     xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:autoMirrored="true"
     android:height="36dp"
     android:viewportHeight="24.0"
     android:viewportWidth="24.0"
-    android:width="36dp">
+    android:width="36dp"
+    tools:ignore="UnusedAttribute,VectorRaster">
   <path
       android:fillColor="#EEEEEE"
       android:pathData="M6,2c-1.1,0 -1.99,0.9 -1.99,2L4,20c0,1.1 0.89,2 1.99,2L18,22c1.1,0 2,-0.9 2,-2L20,8l-6,-6L6,2zM13,9L13,3.5L18.5,9L13,9z"/>

+ 4 - 1
files/src/main/res/drawable/icon_folder_dark.xml

@@ -1,9 +1,12 @@
 <vector
     xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:autoMirrored="true"
     android:height="36dp"
     android:viewportHeight="24.0"
     android:viewportWidth="24.0"
-    android:width="36dp">
+    android:width="36dp"
+    tools:ignore="UnusedAttribute,VectorRaster">
   <path
       android:fillColor="#424242"
       android:pathData="M10,4H4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V8c0,-1.1 -0.9,-2 -2,-2h-8l-2,-2z"/>

+ 4 - 1
files/src/main/res/drawable/icon_folder_light.xml

@@ -1,9 +1,12 @@
 <vector
     xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:autoMirrored="true"
     android:height="36dp"
     android:viewportHeight="24.0"
     android:viewportWidth="24.0"
-    android:width="36dp">
+    android:width="36dp"
+    tools:ignore="UnusedAttribute,VectorRaster">
   <path
       android:fillColor="#EEEEEE"
       android:pathData="M10,4H4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V8c0,-1.1 -0.9,-2 -2,-2h-8l-2,-2z"/>

+ 4 - 1
files/src/main/res/drawable/icon_return_dark.xml

@@ -1,9 +1,12 @@
 <vector
     xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:autoMirrored="true"
     android:height="36dp"
     android:viewportHeight="24.0"
     android:viewportWidth="24.0"
-    android:width="36dp">
+    android:width="36dp"
+    tools:ignore="UnusedAttribute,VectorRaster">
   <path
       android:fillColor="#424242"
       android:pathData="M19,7v4H5.83l3.58,-3.59L8,6l-6,6 6,6 1.41,-1.41L5.83,13H21V7z"/>

+ 4 - 1
files/src/main/res/drawable/icon_return_light.xml

@@ -1,9 +1,12 @@
 <vector
     xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:autoMirrored="true"
     android:height="36dp"
     android:viewportHeight="24.0"
     android:viewportWidth="24.0"
-    android:width="36dp">
+    android:width="36dp"
+    tools:ignore="UnusedAttribute,VectorRaster">
   <path
       android:fillColor="#EEEEEE"
       android:pathData="M19,7v4H5.83l3.58,-3.59L8,6l-6,6 6,6 1.41,-1.41L5.83,13H21V7z"/>

+ 2 - 1
files/src/main/res/layout/md_file_chooser_item.xml

@@ -27,11 +27,12 @@
 
   <TextView
       android:id="@+id/name"
-      android:layout_width="match_parent"
+      android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_centerVertical="true"
       android:layout_toEndOf="@+id/icon"
       android:layout_toRightOf="@+id/icon"
+      android:gravity="start|center_vertical"
       android:textColor="?android:textColorPrimary"
       tools:text="External Storage"
       />

+ 2 - 0
input/src/main/res/values/styles.xml

@@ -4,6 +4,7 @@
   <style name="MD_Dialog_Input_Layout">
     <item name="android:layout_width">match_parent</item>
     <item name="android:layout_height">wrap_content</item>
+    <item name="android:gravity">start|center_vertical</item>
   </style>
 
   <style name="MD_Dialog_Input_Layout.Message">
@@ -11,6 +12,7 @@
     <item name="android:layout_height">wrap_content</item>
     <item name="android:textColor">?android:textColorPrimary</item>
     <item name="android:textSize">@dimen/md_message_textsize</item>
+    <item name="android:gravity">start|center_vertical</item>
     <item name="android:layout_marginLeft">-4dp</item>
     <item name="android:layout_marginRight">-4dp</item>
   </style>

+ 3 - 1
sample/src/main/res/layout/custom_view.xml

@@ -85,9 +85,11 @@
 
   <CheckBox
       android:id="@+id/showPassword"
-      android:layout_width="match_parent"
+      android:layout_width="wrap_content"
       android:layout_height="wrap_content"
+      android:layout_gravity="start"
       android:layout_marginTop="18dp"
+      android:gravity="center"
       android:text="@string/showPassword"
       android:textColor="#000000"
       android:textSize="@dimen/customEntry"