Skip to content

Commit 0af4b8b

Browse files
author
Fabrice Di Meglio
committed
Make ProgressBar / SeekBar / RatingBar widgets aware of layout direction
- see bug #5429822 UI should be mirrored for RTL locales (Arabic, Hebrew, farsi) Change-Id: I8d76299090abf6b2b187696b1a83e71d7a44b1ce
1 parent 18e8768 commit 0af4b8b

File tree

12 files changed

+95
-19
lines changed

12 files changed

+95
-19
lines changed

core/java/android/view/View.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11359,6 +11359,7 @@ void resolveRtlProperties() {
1135911359
resolveLayoutParams();
1136011360
resolveTextDirection();
1136111361
resolveTextAlignment();
11362+
resolveDrawables();
1136211363
}
1136311364

1136411365
/**

core/java/android/widget/AbsSeekBar.java

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,9 @@ public void setThumb(Drawable thumb) {
107107
}
108108
if (thumb != null) {
109109
thumb.setCallback(this);
110+
if (canResolveLayoutDirection()) {
111+
thumb.setLayoutDirection(getResolvedLayoutDirection());
112+
}
110113

111114
// Assuming the thumb drawable is symmetric, set the thumb offset
112115
// such that the thumb will hang halfway off either edge of the
@@ -303,7 +306,16 @@ private void setThumbPos(int w, Drawable thumb, float scale, int gap) {
303306
// Canvas will be translated, so 0,0 is where we start drawing
304307
thumb.setBounds(thumbPos, topBound, thumbPos + thumbWidth, bottomBound);
305308
}
306-
309+
310+
@Override
311+
public void onResolveDrawables(int layoutDirection) {
312+
super.onResolveDrawables(layoutDirection);
313+
314+
if (mThumb != null) {
315+
mThumb.setLayoutDirection(layoutDirection);
316+
}
317+
}
318+
307319
@Override
308320
protected synchronized void onDraw(Canvas canvas) {
309321
super.onDraw(canvas);
@@ -409,15 +421,25 @@ private void trackTouchEvent(MotionEvent event) {
409421
int x = (int)event.getX();
410422
float scale;
411423
float progress = 0;
412-
if (x < mPaddingLeft) {
413-
scale = 0.0f;
414-
} else if (x > width - mPaddingRight) {
415-
scale = 1.0f;
424+
if (isLayoutRtl()) {
425+
if (x > width - mPaddingRight) {
426+
scale = 0.0f;
427+
} else if (x < mPaddingLeft) {
428+
scale = 1.0f;
429+
} else {
430+
scale = (float)(available - x + mPaddingLeft) / (float)available;
431+
progress = mTouchProgressOffset;
432+
}
416433
} else {
417-
scale = (float)(x - mPaddingLeft) / (float)available;
418-
progress = mTouchProgressOffset;
434+
if (x < mPaddingLeft) {
435+
scale = 0.0f;
436+
} else if (x > width - mPaddingRight) {
437+
scale = 1.0f;
438+
} else {
439+
scale = (float)(x - mPaddingLeft) / (float)available;
440+
progress = mTouchProgressOffset;
441+
}
419442
}
420-
421443
final int max = getMax();
422444
progress += scale * max;
423445

core/java/android/widget/ProgressBar.java

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -478,8 +478,8 @@ public void setIndeterminateDrawable(Drawable d) {
478478
d.setCallback(this);
479479
}
480480
mIndeterminateDrawable = d;
481-
if (mIndeterminateDrawable != null) {
482-
mIndeterminateDrawable.setLayoutDirection(getLayoutDirection());
481+
if (mIndeterminateDrawable != null && canResolveLayoutDirection()) {
482+
mIndeterminateDrawable.setLayoutDirection(getResolvedLayoutDirection());
483483
}
484484
if (mIndeterminate) {
485485
mCurrentDrawable = d;
@@ -520,7 +520,9 @@ public void setProgressDrawable(Drawable d) {
520520

521521
if (d != null) {
522522
d.setCallback(this);
523-
d.setLayoutDirection(getLayoutDirection());
523+
if (canResolveLayoutDirection()) {
524+
d.setLayoutDirection(getResolvedLayoutDirection());
525+
}
524526

525527
// Make sure the ProgressBar is always tall enough
526528
int drawableHeight = d.getMinimumHeight();
@@ -563,6 +565,20 @@ public void jumpDrawablesToCurrentState() {
563565
if (mIndeterminateDrawable != null) mIndeterminateDrawable.jumpToCurrentState();
564566
}
565567

568+
@Override
569+
public void onResolveDrawables(int layoutDirection) {
570+
final Drawable d = mCurrentDrawable;
571+
if (d != null) {
572+
d.setLayoutDirection(layoutDirection);
573+
}
574+
if (mIndeterminateDrawable != null) {
575+
mIndeterminateDrawable.setLayoutDirection(layoutDirection);
576+
}
577+
if (mProgressDrawable != null) {
578+
mProgressDrawable.setLayoutDirection(layoutDirection);
579+
}
580+
}
581+
566582
@Override
567583
public void postInvalidate() {
568584
if (!mNoInvalidate) {
@@ -652,6 +668,9 @@ private synchronized void doRefreshProgress(int id, int progress, boolean fromUs
652668

653669
if (d instanceof LayerDrawable) {
654670
progressDrawable = ((LayerDrawable) d).findDrawableByLayerId(id);
671+
if (progressDrawable != null && canResolveLayoutDirection()) {
672+
progressDrawable.setLayoutDirection(getResolvedLayoutDirection());
673+
}
655674
}
656675

657676
final int level = (int) (scale * MAX_LEVEL);

core/java/android/widget/TextView.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4463,9 +4463,6 @@ protected void onAttachedToWindow() {
44634463

44644464
mTemporaryDetach = false;
44654465

4466-
// Resolve drawables as the layout direction has been resolved
4467-
resolveDrawables();
4468-
44694466
if (mEditor != null) mEditor.onAttachedToWindow();
44704467
}
44714468

core/res/res/drawable/progress_horizontal_holo_dark.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,13 @@
2121

2222
<item android:id="@android:id/secondaryProgress">
2323
<scale android:scaleWidth="100%"
24+
android:scaleGravity="start"
2425
android:drawable="@android:drawable/progress_secondary_holo_dark" />
2526
</item>
2627

2728
<item android:id="@android:id/progress">
2829
<scale android:scaleWidth="100%"
30+
android:scaleGravity="start"
2931
android:drawable="@android:drawable/progress_primary_holo_dark" />
3032
</item>
3133

core/res/res/drawable/progress_horizontal_holo_light.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,13 @@
2121

2222
<item android:id="@android:id/secondaryProgress">
2323
<scale android:scaleWidth="100%"
24+
android:scaleGravity="start"
2425
android:drawable="@android:drawable/progress_secondary_holo_light" />
2526
</item>
2627

2728
<item android:id="@android:id/progress">
2829
<scale android:scaleWidth="100%"
30+
android:scaleGravity="start"
2931
android:drawable="@android:drawable/progress_primary_holo_light" />
3032
</item>
3133

core/res/res/drawable/scrubber_progress_horizontal_holo_dark.xml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,12 @@
1919
android:drawable="@android:drawable/scrubber_track_holo_dark" />
2020
<item android:id="@android:id/secondaryProgress">
2121
<scale android:scaleWidth="100%"
22-
android:drawable="@android:drawable/scrubber_secondary_holo" />
22+
android:scaleGravity="start"
23+
android:drawable="@android:drawable/scrubber_secondary_holo" />
2324
</item>
2425
<item android:id="@android:id/progress">
2526
<scale android:scaleWidth="100%"
26-
android:drawable="@android:drawable/scrubber_primary_holo" />
27+
android:scaleGravity="start"
28+
android:drawable="@android:drawable/scrubber_primary_holo" />
2729
</item>
2830
</layer-list>

core/res/res/drawable/scrubber_progress_horizontal_holo_light.xml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,12 @@
1919
android:drawable="@android:drawable/scrubber_track_holo_light" />
2020
<item android:id="@android:id/secondaryProgress">
2121
<scale android:scaleWidth="100%"
22-
android:drawable="@android:drawable/scrubber_secondary_holo" />
22+
android:scaleGravity="start"
23+
android:drawable="@android:drawable/scrubber_secondary_holo" />
2324
</item>
2425
<item android:id="@android:id/progress">
2526
<scale android:scaleWidth="100%"
26-
android:drawable="@android:drawable/scrubber_primary_holo" />
27+
android:scaleGravity="start"
28+
android:drawable="@android:drawable/scrubber_primary_holo" />
2729
</item>
2830
</layer-list>

core/res/res/values/attrs.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4079,6 +4079,10 @@
40794079
The clip will be based on the horizontal gravity: a left gravity will clip the right
40804080
edge, a right gravity will clip the left edge, and neither will clip both edges. -->
40814081
<flag name="clip_horizontal" value="0x08" />
4082+
<!-- Push object to the beginning of its container, not changing its size. -->
4083+
<flag name="start" value="0x00800003" />
4084+
<!-- Push object to the end of its container, not changing its size. -->
4085+
<flag name="end" value="0x00800005" />
40824086
</attr>
40834087
<!-- Reference to a drawable resource to draw with the specified scale. -->
40844088
<attr name="drawable" />

graphics/java/android/graphics/drawable/ClipDrawable.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,11 @@ public ConstantState getConstantState() {
239239
return null;
240240
}
241241

242-
242+
@Override
243+
public void setLayoutDirection(int layoutDirection) {
244+
mClipState.mDrawable.setLayoutDirection(layoutDirection);
245+
super.setLayoutDirection(layoutDirection);
246+
}
243247

244248
final static class ClipState extends ConstantState {
245249
Drawable mDrawable;

0 commit comments

Comments
 (0)