diff --git a/README.md b/README.md index ba93ef4..2f10185 100644 --- a/README.md +++ b/README.md @@ -79,6 +79,8 @@ tv.setVectorDrawableRight(CompoundIconTextView.UNDEFINED_RESOURCE); |cit_drawableTop|Sets a drawable or vector drawable to top of TextView| |cit_drawableBottom|Sets a drawable or vector drawable to bottom of TextView| |cit_drawableRight|Sets a drawable or vector drawable to right of TextView| +|cit_drawableStart|Sets a drawable or vector drawable to start of TextView (for RTL)| +|cit_drawableEnd|Sets a drawable or vector drawable to end of TextView (for RTL)| |cit_iconWidth|Sets a width of icon| |cit_iconHeight|Sets a width of icon| |cit_iconColor|Sets a icon color| @@ -131,4 +133,4 @@ See the License for the specific language governing permissions and limitations under the License. ``` -[preview]: /arts/preview.png +[preview]: /arts/preview.jpg diff --git a/arts/preview.jpg b/arts/preview.jpg new file mode 100644 index 0000000..0f53452 Binary files /dev/null and b/arts/preview.jpg differ diff --git a/arts/preview.png b/arts/preview.png deleted file mode 100644 index ee1814c..0000000 Binary files a/arts/preview.png and /dev/null differ diff --git a/compoundicontextview/src/main/java/com/github/aakira/compoundicontextview/CompoundIconTextView.java b/compoundicontextview/src/main/java/com/github/aakira/compoundicontextview/CompoundIconTextView.java index 2416149..fd61098 100644 --- a/compoundicontextview/src/main/java/com/github/aakira/compoundicontextview/CompoundIconTextView.java +++ b/compoundicontextview/src/main/java/com/github/aakira/compoundicontextview/CompoundIconTextView.java @@ -18,10 +18,14 @@ import android.support.annotation.Nullable; import android.support.v4.content.ContextCompat; import android.support.v4.graphics.drawable.DrawableCompat; +import android.support.v4.text.TextUtilsCompat; +import android.support.v4.view.ViewCompat; import android.support.v7.content.res.AppCompatResources; import android.support.v7.widget.AppCompatTextView; import android.util.AttributeSet; +import java.util.Locale; + /** * You can use a vector drawable in TextView instead of drawableLeft, drawableTop, drawableRight and * drawableBottom. @@ -80,6 +84,12 @@ public CompoundIconTextView(Context context, @Nullable AttributeSet attrs, int d drawableResIds[INDEX_TOP] = a.getResourceId(R.styleable.CompoundIconTextView_cit_drawableTop, UNDEFINED_RESOURCE); drawableResIds[INDEX_RIGHT] = a.getResourceId(R.styleable.CompoundIconTextView_cit_drawableRight, UNDEFINED_RESOURCE); drawableResIds[INDEX_BOTTOM] = a.getResourceId(R.styleable.CompoundIconTextView_cit_drawableBottom, UNDEFINED_RESOURCE); + if (a.hasValue(R.styleable.CompoundIconTextView_cit_drawableStart)) { + drawableResIds[isRtl() ? INDEX_RIGHT : INDEX_LEFT] = a.getResourceId(R.styleable.CompoundIconTextView_cit_drawableStart, UNDEFINED_RESOURCE); + } + if (a.hasValue(R.styleable.CompoundIconTextView_cit_drawableEnd)) { + drawableResIds[isRtl() ? INDEX_LEFT : INDEX_RIGHT] = a.getResourceId(R.styleable.CompoundIconTextView_cit_drawableEnd, UNDEFINED_RESOURCE); + } iconWidth = a.getDimensionPixelSize(R.styleable.CompoundIconTextView_cit_iconWidth, UNDEFINED_RESOURCE); iconHeight = a.getDimensionPixelSize(R.styleable.CompoundIconTextView_cit_iconHeight, UNDEFINED_RESOURCE); iconColor = a.getColor(R.styleable.CompoundIconTextView_cit_iconColor, UNDEFINED_RESOURCE); @@ -103,52 +113,42 @@ public CompoundIconTextView(Context context, @Nullable AttributeSet attrs, int d * @param resourceId Set the {@link CompoundIconTextView#UNDEFINED_RESOURCE} if you want clear icon. */ public void setVectorDrawableLeft(@DrawableRes final int resourceId) { - if (resourceId == UNDEFINED_RESOURCE) { - drawables[INDEX_LEFT] = null; - drawableResIds[INDEX_LEFT] = UNDEFINED_RESOURCE; - updateIcons(); - } else { - setVectorDrawable(INDEX_LEFT, resourceId); - } + setVectorDrawable(INDEX_LEFT, resourceId); } /** * @param resourceId Set the {@link CompoundIconTextView#UNDEFINED_RESOURCE} if you want clear icon. */ public void setVectorDrawableTop(@DrawableRes final int resourceId) { - if (resourceId == UNDEFINED_RESOURCE) { - drawables[INDEX_TOP] = null; - drawableResIds[INDEX_TOP] = UNDEFINED_RESOURCE; - updateIcons(); - } else { - setVectorDrawable(INDEX_TOP, resourceId); - } + setVectorDrawable(INDEX_TOP, resourceId); } /** * @param resourceId Set the {@link CompoundIconTextView#UNDEFINED_RESOURCE} if you want clear icon. */ public void setVectorDrawableRight(@DrawableRes final int resourceId) { - if (resourceId == UNDEFINED_RESOURCE) { - drawables[INDEX_RIGHT] = null; - drawableResIds[INDEX_RIGHT] = UNDEFINED_RESOURCE; - updateIcons(); - } else { - setVectorDrawable(INDEX_RIGHT, resourceId); - } + setVectorDrawable(INDEX_RIGHT, resourceId); } /** * @param resourceId Set the {@link CompoundIconTextView#UNDEFINED_RESOURCE} if you want clear icon. */ public void setVectorDrawableBottom(@DrawableRes final int resourceId) { - if (resourceId == UNDEFINED_RESOURCE) { - drawables[INDEX_BOTTOM] = null; - drawableResIds[INDEX_BOTTOM] = UNDEFINED_RESOURCE; - updateIcons(); - } else { - setVectorDrawable(INDEX_BOTTOM, resourceId); - } + setVectorDrawable(INDEX_BOTTOM, resourceId); + } + + /** + * @param resourceId Set the {@link CompoundIconTextView#UNDEFINED_RESOURCE} if you want clear icon. + */ + public void setVectorDrawableStart(@DrawableRes final int resourceId) { + setVectorDrawable(isRtl() ? INDEX_RIGHT : INDEX_LEFT, resourceId); + } + + /** + * @param resourceId Set the {@link CompoundIconTextView#UNDEFINED_RESOURCE} if you want clear icon. + */ + public void setVectorDrawableEnd(@DrawableRes final int resourceId) { + setVectorDrawable(isRtl() ? INDEX_LEFT : INDEX_RIGHT, resourceId); } /** @@ -176,7 +176,7 @@ public void setIconColor(@ColorInt final int color) { /** * Change drawable icon size * - * @param widthRes Set width resource id + * @param widthRes Set width resource id * @param heightRes Set height resource id */ public void setIconSizeResource(@DimenRes final int widthRes, @DimenRes final int heightRes) { @@ -187,7 +187,7 @@ public void setIconSizeResource(@DimenRes final int widthRes, @DimenRes final in /** * Change drawable icon size * - * @param width Set width size + * @param width Set width size * @param height Set height size */ public void setIconSize(@Dimension final int width, @Dimension final int height) { @@ -218,10 +218,16 @@ private void setColorFilter(final int index, @ColorInt final int color) { } private void setVectorDrawable(final int index, @DrawableRes final int resourceId) { - checkHasIconSize(); - setDrawable(index, resourceId); - drawableResIds[index] = resourceId; - updateIcons(); + if (resourceId == UNDEFINED_RESOURCE) { + drawables[index] = null; + drawableResIds[index] = UNDEFINED_RESOURCE; + updateIcons(); + } else { + checkHasIconSize(); + setDrawable(index, resourceId); + drawableResIds[index] = resourceId; + updateIcons(); + } } private void updateIcons() { @@ -278,7 +284,7 @@ private static Bitmap drawable2Bitmap(final Drawable drawable, final int iconWid * {@link android.content.res.Resources} or a {@link android.content.res.TypedArray}. */ private static void fixDrawable(@NonNull final Drawable drawable) { - if (Build.VERSION.SDK_INT == 21 + if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP && VECTOR_DRAWABLE_CLAZZ_NAME.equals(drawable.getClass().getName())) { fixVectorDrawableTinting(drawable); } @@ -302,4 +308,12 @@ private static void fixVectorDrawableTinting(final Drawable drawable) { // Now set the original state drawable.setState(originalState); } + + private boolean isRtl() { + Resources resources = getContext().getResources(); + Locale locale = Build.VERSION.SDK_INT >= Build.VERSION_CODES.N + ? resources.getConfiguration().getLocales().getFirstMatch(resources.getAssets().getLocales()) + : resources.getConfiguration().locale; + return TextUtilsCompat.getLayoutDirectionFromLocale(locale) == ViewCompat.LAYOUT_DIRECTION_RTL; + } } \ No newline at end of file diff --git a/compoundicontextview/src/main/res/values/attrs.xml b/compoundicontextview/src/main/res/values/attrs.xml index b26b6e5..28ada27 100644 --- a/compoundicontextview/src/main/res/values/attrs.xml +++ b/compoundicontextview/src/main/res/values/attrs.xml @@ -5,6 +5,8 @@ + + diff --git a/sample/src/main/res/drawable/ic_language_black_24px.xml b/sample/src/main/res/drawable/ic_language_black_24px.xml new file mode 100644 index 0000000..d2d4140 --- /dev/null +++ b/sample/src/main/res/drawable/ic_language_black_24px.xml @@ -0,0 +1,10 @@ + + + + diff --git a/sample/src/main/res/layout/activity_main.xml b/sample/src/main/res/layout/activity_main.xml index ece9de0..93ec402 100644 --- a/sample/src/main/res/layout/activity_main.xml +++ b/sample/src/main/res/layout/activity_main.xml @@ -1,6 +1,7 @@ + app:cit_iconWidth="4dp" + tools:ignore="HardcodedText" /> + app:cit_iconWidth="@dimen/icon_size" + tools:ignore="HardcodedText" /> + app:cit_iconWidth="@dimen/icon_size" + tools:ignore="HardcodedText" /> + app:cit_iconWidth="@dimen/icon_size" + tools:ignore="HardcodedText" /> + + \ No newline at end of file diff --git a/sample/src/main/res/values-ar/strings.xml b/sample/src/main/res/values-ar/strings.xml new file mode 100644 index 0000000..a7d8fbd --- /dev/null +++ b/sample/src/main/res/values-ar/strings.xml @@ -0,0 +1,3 @@ + + من اليمين الى اليسار + diff --git a/sample/src/main/res/values/strings.xml b/sample/src/main/res/values/strings.xml index 376afb7..4cbf2b8 100644 --- a/sample/src/main/res/values/strings.xml +++ b/sample/src/main/res/values/strings.xml @@ -1,3 +1,4 @@ - CompoundIconTextView + CompoundIconTextView + Right to Left (in Arabic)