Skip to content

Commit 4e1b130

Browse files
manabu-nakamuraleticiarossi
authored andcommittedSep 12, 2023
[Catalog][Carousel] Fixed demos in RTL
Resolves #3556 GIT_ORIGIN_REV_ID=c2fbf22cfe914840783f41145171defffe9ad738 PiperOrigin-RevId: 564361017
1 parent 43242f2 commit 4e1b130

File tree

4 files changed

+73
-93
lines changed

4 files changed

+73
-93
lines changed
 
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/*
2+
* Copyright 2023 The Android Open Source Project
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package io.material.catalog.carousel;
18+
19+
import androidx.recyclerview.widget.RecyclerView;
20+
import androidx.annotation.NonNull;
21+
import com.google.android.material.slider.Slider;
22+
import com.google.android.material.slider.Slider.OnSliderTouchListener;
23+
24+
/** Utilities for setting up carousel catalog demos. */
25+
class CarouselDemoUtils {
26+
27+
private CarouselDemoUtils() {}
28+
29+
static RecyclerView.OnScrollListener createUpdateSliderOnScrollListener(
30+
Slider slider, CarouselAdapter adapter) {
31+
return new RecyclerView.OnScrollListener() {
32+
private boolean dragged = false;
33+
34+
@Override
35+
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
36+
if (newState == RecyclerView.SCROLL_STATE_DRAGGING) {
37+
dragged = true;
38+
} else if (dragged && newState == RecyclerView.SCROLL_STATE_IDLE) {
39+
if (recyclerView.computeHorizontalScrollRange() != 0) {
40+
slider.setValue(
41+
(adapter.getItemCount() - 1)
42+
* Math.abs(recyclerView.computeHorizontalScrollOffset())
43+
/ recyclerView.computeHorizontalScrollRange()
44+
+ 1);
45+
}
46+
dragged = false;
47+
}
48+
}
49+
};
50+
}
51+
52+
static OnSliderTouchListener createScrollToPositionSliderTouchListener(
53+
RecyclerView recyclerView) {
54+
return new OnSliderTouchListener() {
55+
@Override
56+
public void onStartTrackingTouch(@NonNull Slider slider) {}
57+
58+
@Override
59+
public void onStopTrackingTouch(@NonNull Slider slider) {
60+
recyclerView.smoothScrollToPosition(((int) slider.getValue()) - 1);
61+
}
62+
};
63+
}
64+
}

‎catalog/java/io/material/catalog/carousel/HeroCarouselDemoFragment.java

+4-33
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@
3737
import com.google.android.material.divider.MaterialDividerItemDecoration;
3838
import com.google.android.material.materialswitch.MaterialSwitch;
3939
import com.google.android.material.slider.Slider;
40-
import com.google.android.material.slider.Slider.OnSliderTouchListener;
4140
import io.material.catalog.feature.DemoFragment;
4241

4342
/** A fragment that displays the hero variant of the Carousel. */
@@ -73,8 +72,7 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle bundle) {
7372
RadioButton centerAlignButton = view.findViewById(R.id.center_align);
7473

7574
// A hero carousel
76-
RecyclerView heroStartRecyclerView =
77-
view.findViewById(R.id.hero_start_carousel_recycler_view);
75+
RecyclerView heroStartRecyclerView = view.findViewById(R.id.hero_start_carousel_recycler_view);
7876
CarouselLayoutManager heroStartCarouselLayoutManager =
7977
new CarouselLayoutManager(new HeroCarouselStrategy());
8078
heroStartCarouselLayoutManager.setDebuggingEnabled(
@@ -86,8 +84,7 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle bundle) {
8684
(buttonView, isChecked) -> {
8785
heroStartRecyclerView.setBackgroundResource(
8886
isChecked ? R.drawable.dashed_outline_rectangle : 0);
89-
heroStartCarouselLayoutManager.setDebuggingEnabled(
90-
heroStartRecyclerView, isChecked);
87+
heroStartCarouselLayoutManager.setDebuggingEnabled(heroStartRecyclerView, isChecked);
9188
});
9289

9390
drawDividers.setOnCheckedChangeListener(
@@ -107,25 +104,7 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle bundle) {
107104
},
108105
R.layout.cat_carousel_item);
109106
heroStartRecyclerView.addOnScrollListener(
110-
new RecyclerView.OnScrollListener() {
111-
private boolean dragged = false;
112-
113-
@Override
114-
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
115-
if (newState == RecyclerView.SCROLL_STATE_DRAGGING) {
116-
dragged = true;
117-
} else if (dragged && newState == RecyclerView.SCROLL_STATE_IDLE) {
118-
if (recyclerView.computeHorizontalScrollRange() != 0) {
119-
positionSlider.setValue(
120-
(adapter.getItemCount() - 1)
121-
* recyclerView.computeHorizontalScrollOffset()
122-
/ recyclerView.computeHorizontalScrollRange()
123-
+ 1);
124-
}
125-
dragged = false;
126-
}
127-
}
128-
});
107+
CarouselDemoUtils.createUpdateSliderOnScrollListener(positionSlider, adapter));
129108

130109
SnapHelper disableFlingSnapHelper = new CarouselSnapHelper();
131110
SnapHelper enableFlingSnapHelper = new CarouselSnapHelper(false);
@@ -154,15 +133,7 @@ public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newStat
154133
updateSliderRange(positionSlider, adapter)));
155134

156135
positionSlider.addOnSliderTouchListener(
157-
new OnSliderTouchListener() {
158-
@Override
159-
public void onStartTrackingTouch(@NonNull Slider slider) {}
160-
161-
@Override
162-
public void onStopTrackingTouch(@NonNull Slider slider) {
163-
heroStartRecyclerView.smoothScrollToPosition(((int) slider.getValue()) - 1);
164-
}
165-
});
136+
CarouselDemoUtils.createScrollToPositionSliderTouchListener(heroStartRecyclerView));
166137

167138
startAlignButton.setOnClickListener(
168139
v -> heroStartCarouselLayoutManager.setCarouselAlignment(ALIGNMENT_START));

‎catalog/java/io/material/catalog/carousel/MultiBrowseCarouselDemoFragment.java

+2-29
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
import com.google.android.material.divider.MaterialDividerItemDecoration;
3333
import com.google.android.material.materialswitch.MaterialSwitch;
3434
import com.google.android.material.slider.Slider;
35-
import com.google.android.material.slider.Slider.OnSliderTouchListener;
3635
import io.material.catalog.feature.DemoFragment;
3736

3837
/** A fragment that displays the multi-browse variants of the Carousel. */
@@ -115,25 +114,7 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle bundle) {
115114
},
116115
R.layout.cat_carousel_item_narrow);
117116
multiBrowseStartRecyclerView.addOnScrollListener(
118-
new RecyclerView.OnScrollListener() {
119-
private boolean dragged = false;
120-
121-
@Override
122-
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
123-
if (newState == RecyclerView.SCROLL_STATE_DRAGGING) {
124-
dragged = true;
125-
} else if (dragged && newState == RecyclerView.SCROLL_STATE_IDLE) {
126-
if (recyclerView.computeHorizontalScrollRange() != 0) {
127-
positionSlider.setValue(
128-
(adapter.getItemCount() - 1)
129-
* recyclerView.computeHorizontalScrollOffset()
130-
/ recyclerView.computeHorizontalScrollRange()
131-
+ 1);
132-
}
133-
dragged = false;
134-
}
135-
}
136-
});
117+
CarouselDemoUtils.createUpdateSliderOnScrollListener(positionSlider, adapter));
137118

138119
itemCountDropdown.setOnItemClickListener(
139120
(parent, view1, position, id) -> {
@@ -143,15 +124,7 @@ public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newStat
143124
});
144125

145126
positionSlider.addOnSliderTouchListener(
146-
new OnSliderTouchListener() {
147-
@Override
148-
public void onStartTrackingTouch(@NonNull Slider slider) {}
149-
150-
@Override
151-
public void onStopTrackingTouch(@NonNull Slider slider) {
152-
multiBrowseStartRecyclerView.smoothScrollToPosition(((int) slider.getValue()) - 1);
153-
}
154-
});
127+
CarouselDemoUtils.createScrollToPositionSliderTouchListener(multiBrowseStartRecyclerView));
155128

156129
multiBrowseStartRecyclerView.setAdapter(adapter);
157130
adapter.submitList(CarouselData.createItems(), updateSliderRange(positionSlider, adapter));

‎catalog/java/io/material/catalog/carousel/UncontainedCarouselDemoFragment.java

+3-31
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
import com.google.android.material.divider.MaterialDividerItemDecoration;
3333
import com.google.android.material.materialswitch.MaterialSwitch;
3434
import com.google.android.material.slider.Slider;
35-
import com.google.android.material.slider.Slider.OnSliderTouchListener;
3635
import io.material.catalog.feature.DemoFragment;
3736

3837
/** A fragment that displays the uncontained variant of the Carousel. */
@@ -78,8 +77,7 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle bundle) {
7877
(buttonView, isChecked) -> {
7978
uncontainedRecyclerView.setBackgroundResource(
8079
isChecked ? R.drawable.dashed_outline_rectangle : 0);
81-
uncontainedCarouselLayoutManager.setDebuggingEnabled(
82-
uncontainedRecyclerView, isChecked);
80+
uncontainedCarouselLayoutManager.setDebuggingEnabled(uncontainedRecyclerView, isChecked);
8381
});
8482

8583
drawDividers.setOnCheckedChangeListener(
@@ -109,25 +107,7 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle bundle) {
109107
},
110108
R.layout.cat_carousel_item_narrow);
111109
uncontainedRecyclerView.addOnScrollListener(
112-
new RecyclerView.OnScrollListener() {
113-
private boolean dragged = false;
114-
115-
@Override
116-
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
117-
if (newState == RecyclerView.SCROLL_STATE_DRAGGING) {
118-
dragged = true;
119-
} else if (dragged && newState == RecyclerView.SCROLL_STATE_IDLE) {
120-
if (recyclerView.computeHorizontalScrollRange() != 0) {
121-
positionSlider.setValue(
122-
(adapter.getItemCount() - 1)
123-
* recyclerView.computeHorizontalScrollOffset()
124-
/ recyclerView.computeHorizontalScrollRange()
125-
+ 1);
126-
}
127-
dragged = false;
128-
}
129-
}
130-
});
110+
CarouselDemoUtils.createUpdateSliderOnScrollListener(positionSlider, adapter));
131111

132112
itemCountDropdown.setOnItemClickListener(
133113
(parent, view1, position, id) ->
@@ -136,15 +116,7 @@ public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newStat
136116
updateSliderRange(positionSlider, adapter)));
137117

138118
positionSlider.addOnSliderTouchListener(
139-
new OnSliderTouchListener() {
140-
@Override
141-
public void onStartTrackingTouch(@NonNull Slider slider) {}
142-
143-
@Override
144-
public void onStopTrackingTouch(@NonNull Slider slider) {
145-
uncontainedRecyclerView.smoothScrollToPosition(((int) slider.getValue()) - 1);
146-
}
147-
});
119+
CarouselDemoUtils.createScrollToPositionSliderTouchListener(uncontainedRecyclerView));
148120

149121
uncontainedRecyclerView.setAdapter(adapter);
150122
adapter.submitList(CarouselData.createItems(), updateSliderRange(positionSlider, adapter));

0 commit comments

Comments
 (0)
Please sign in to comment.