From 0975e42ddbcf9ff016bdad344bec75a0be7b70a6 Mon Sep 17 00:00:00 2001 From: rodrigomartindMeli Date: Sun, 29 Nov 2020 18:15:13 -0300 Subject: [PATCH 1/7] Carousel helper infinite --- .../helper/widget/Carousel.java | 74 +++++++++++++++---- .../src/main/res/values/attrs.xml | 1 + 2 files changed, 60 insertions(+), 15 deletions(-) diff --git a/constraintlayout/constraintlayout/src/main/java/androidx/constraintlayout/helper/widget/Carousel.java b/constraintlayout/constraintlayout/src/main/java/androidx/constraintlayout/helper/widget/Carousel.java index 38a914442..dc4d2f19a 100644 --- a/constraintlayout/constraintlayout/src/main/java/androidx/constraintlayout/helper/widget/Carousel.java +++ b/constraintlayout/constraintlayout/src/main/java/androidx/constraintlayout/helper/widget/Carousel.java @@ -41,7 +41,8 @@ public class Carousel extends MotionHelper { private int mIndex = 0; private MotionLayout mMotionLayout; private int firstViewReference = -1; - + private boolean infiniteCarousel = false; + private boolean firstShow = true; private int backwardTransition = -1; private int forwardTransition = -1; private int previousState = -1; @@ -100,6 +101,8 @@ private void init(Context context, AttributeSet attrs) { touchUpMode = a.getInt(attr, touchUpMode); } else if (attr == R.styleable.Carousel_carousel_touchUp_velocityThreshold) { velocityThreshold = a.getFloat(attr, velocityThreshold); + } else if (attr == R.styleable.Carousel_carousel_infinite) { + infiniteCarousel = a.getBoolean(attr, infiniteCarousel); } } a.recycle(); @@ -136,6 +139,7 @@ public void onTransitionChange(MotionLayout motionLayout, int startId, int endId public void onTransitionCompleted(MotionLayout motionLayout, int currentId) { System.out.println("on transition completed"); mPreviousIndex = mIndex; + firstShow = false; if (currentId == nextState) { mIndex++; System.out.println("increment index..."); @@ -144,11 +148,19 @@ public void onTransitionCompleted(MotionLayout motionLayout, int currentId) { System.out.println("decrement index..."); } if (mIndex >= mAdapter.count()) { - mIndex = mAdapter.count() - 1; + if (infiniteCarousel) { + mIndex = 0; + } else { + mIndex = mAdapter.count() - 1; + } System.out.println("index capped... " + mIndex); } if (mIndex < 0) { - mIndex = 0; + if (infiniteCarousel) { + mIndex = mAdapter.count() - 1; + } else { + mIndex = 0; + } System.out.println("index zeroed... "); } @@ -244,6 +256,7 @@ protected void onAttachedToWindow() { /** * Update the view visibility on the different constraintsets + * * @param view * @param visibility * @return @@ -294,9 +307,24 @@ private void updateItems() { View view = mList.get(i); int index = mIndex + i - startIndex; if (index < 0) { - updateViewVisibility(view, emptyViewBehavior); + if (infiniteCarousel) { + updateViewVisibility(view, VISIBLE); + mAdapter.populate(view, mAdapter.count() + index); + } else { + updateViewVisibility(view, emptyViewBehavior); + } } else if (index >= mAdapter.count()) { - updateViewVisibility(view, emptyViewBehavior); + if (infiniteCarousel) { + if (index == mAdapter.count()) { + index = 0; + } else if (index > mAdapter.count()) { + index = index % mAdapter.count() ; + } + updateViewVisibility(view, VISIBLE); + mAdapter.populate(view, index); + } else { + updateViewVisibility(view, emptyViewBehavior); + } } else { updateViewVisibility(view, VISIBLE); mAdapter.populate(view, index); @@ -309,18 +337,34 @@ private void updateItems() { } final int count = mAdapter.count(); - if (mIndex == 0) { - enableTransition(backwardTransition, false); - } else { - enableTransition(backwardTransition, true); - mMotionLayout.setTransition(backwardTransition); - } - if (mIndex == count - 1) { - enableTransition(forwardTransition, false); + if (infiniteCarousel) { + if (firstShow) { + if (mIndex == 0) { + enableTransition(backwardTransition, false); + } else { + enableTransition(backwardTransition, true); + mMotionLayout.setTransition(backwardTransition); + } + } else { + enableTransition(backwardTransition, true); + mMotionLayout.setTransition(backwardTransition); + } + } else { - enableTransition(forwardTransition, true); - mMotionLayout.setTransition(forwardTransition); + if (mIndex == 0) { + enableTransition(backwardTransition, false); + } else { + enableTransition(backwardTransition, true); + mMotionLayout.setTransition(backwardTransition); + } + if (mIndex == count - 1) { + enableTransition(forwardTransition, false); + } else { + enableTransition(forwardTransition, true); + mMotionLayout.setTransition(forwardTransition); + } } + } } diff --git a/constraintlayout/constraintlayout/src/main/res/values/attrs.xml b/constraintlayout/constraintlayout/src/main/res/values/attrs.xml index 749e27540..027a37d1d 100644 --- a/constraintlayout/constraintlayout/src/main/res/values/attrs.xml +++ b/constraintlayout/constraintlayout/src/main/res/values/attrs.xml @@ -236,6 +236,7 @@ + From 94c49cdd701a3fae5439720332ec32daa2a6bfc8 Mon Sep 17 00:00:00 2001 From: rodrigomartindMeli Date: Sun, 29 Nov 2020 21:25:09 -0300 Subject: [PATCH 2/7] Resolve infinte carousel firstItem --- .../helper/widget/Carousel.java | 46 +++++++++---------- .../src/main/res/layout/demo_010_carousel.xml | 1 + .../src/main/res/layout/demo_020_carousel.xml | 1 + .../src/main/res/layout/demo_030_carousel.xml | 1 + .../src/main/res/layout/demo_040_carousel.xml | 1 + .../src/main/res/layout/demo_050_carousel.xml | 1 + .../src/main/res/layout/demo_060_carousel.xml | 1 + 7 files changed, 29 insertions(+), 23 deletions(-) diff --git a/constraintlayout/constraintlayout/src/main/java/androidx/constraintlayout/helper/widget/Carousel.java b/constraintlayout/constraintlayout/src/main/java/androidx/constraintlayout/helper/widget/Carousel.java index dc4d2f19a..6a712f167 100644 --- a/constraintlayout/constraintlayout/src/main/java/androidx/constraintlayout/helper/widget/Carousel.java +++ b/constraintlayout/constraintlayout/src/main/java/androidx/constraintlayout/helper/widget/Carousel.java @@ -36,13 +36,12 @@ public class Carousel extends MotionHelper { private static final boolean DEBUG = false; private static final String TAG = "Carousel"; private Adapter mAdapter = null; - private ArrayList mList = new ArrayList<>(); + private final ArrayList mList = new ArrayList<>(); private int mPreviousIndex = 0; private int mIndex = 0; private MotionLayout mMotionLayout; private int firstViewReference = -1; private boolean infiniteCarousel = false; - private boolean firstShow = true; private int backwardTransition = -1; private int forwardTransition = -1; private int previousState = -1; @@ -59,7 +58,9 @@ public class Carousel extends MotionHelper { public interface Adapter { int count(); + void populate(View view, int index); + void onNewItem(int mIndex); } @@ -109,7 +110,9 @@ private void init(Context context, AttributeSet attrs) { } } - public void setAdapter(Adapter adapter) { mAdapter = adapter; } + public void setAdapter(Adapter adapter) { + mAdapter = adapter; + } public void refresh() { final int count = mList.size(); @@ -139,7 +142,6 @@ public void onTransitionChange(MotionLayout motionLayout, int startId, int endId public void onTransitionCompleted(MotionLayout motionLayout, int currentId) { System.out.println("on transition completed"); mPreviousIndex = mIndex; - firstShow = false; if (currentId == nextState) { mIndex++; System.out.println("increment index..."); @@ -308,8 +310,16 @@ private void updateItems() { int index = mIndex + i - startIndex; if (index < 0) { if (infiniteCarousel) { - updateViewVisibility(view, VISIBLE); - mAdapter.populate(view, mAdapter.count() + index); + if (emptyViewBehavior != View.INVISIBLE) { + updateViewVisibility(view, emptyViewBehavior); + } else { + updateViewVisibility(view, VISIBLE); + } + if (index % mAdapter.count() == 0) { + mAdapter.populate(view, 0); + } else { + mAdapter.populate(view, mAdapter.count() + (index % mAdapter.count())); + } } else { updateViewVisibility(view, emptyViewBehavior); } @@ -318,9 +328,13 @@ private void updateItems() { if (index == mAdapter.count()) { index = 0; } else if (index > mAdapter.count()) { - index = index % mAdapter.count() ; + index = index % mAdapter.count(); + } + if (emptyViewBehavior != View.INVISIBLE) { + updateViewVisibility(view, emptyViewBehavior); + } else { + updateViewVisibility(view, VISIBLE); } - updateViewVisibility(view, VISIBLE); mAdapter.populate(view, index); } else { updateViewVisibility(view, emptyViewBehavior); @@ -337,20 +351,7 @@ private void updateItems() { } final int count = mAdapter.count(); - if (infiniteCarousel) { - if (firstShow) { - if (mIndex == 0) { - enableTransition(backwardTransition, false); - } else { - enableTransition(backwardTransition, true); - mMotionLayout.setTransition(backwardTransition); - } - } else { - enableTransition(backwardTransition, true); - mMotionLayout.setTransition(backwardTransition); - } - - } else { + if (!infiniteCarousel) { if (mIndex == 0) { enableTransition(backwardTransition, false); } else { @@ -364,7 +365,6 @@ private void updateItems() { mMotionLayout.setTransition(forwardTransition); } } - } } diff --git a/projects/CarouselExperiments/app/src/main/res/layout/demo_010_carousel.xml b/projects/CarouselExperiments/app/src/main/res/layout/demo_010_carousel.xml index a2656991f..fd8dd5da4 100644 --- a/projects/CarouselExperiments/app/src/main/res/layout/demo_010_carousel.xml +++ b/projects/CarouselExperiments/app/src/main/res/layout/demo_010_carousel.xml @@ -85,6 +85,7 @@ app:carousel_backwardTransition="@+id/backward" app:carousel_previousState="@+id/previous" app:carousel_nextState="@+id/next" + app:carousel_infinite="true" app:carousel_firstView="@+id/imageView2" app:constraint_referenced_ids="imageView0,imageView1,imageView2,imageView3,imageView4" /> diff --git a/projects/CarouselExperiments/app/src/main/res/layout/demo_020_carousel.xml b/projects/CarouselExperiments/app/src/main/res/layout/demo_020_carousel.xml index 21dbe4d11..515a04aa8 100644 --- a/projects/CarouselExperiments/app/src/main/res/layout/demo_020_carousel.xml +++ b/projects/CarouselExperiments/app/src/main/res/layout/demo_020_carousel.xml @@ -87,6 +87,7 @@ app:carousel_firstView="@+id/imageView2" app:carousel_touchUpMode="carryVelocity" app:carousel_touchUp_dampeningFactor="0.8" + app:carousel_infinite="true" app:constraint_referenced_ids="imageView0,imageView1,imageView2,imageView3,imageView4" /> \ No newline at end of file diff --git a/projects/CarouselExperiments/app/src/main/res/layout/demo_030_carousel.xml b/projects/CarouselExperiments/app/src/main/res/layout/demo_030_carousel.xml index 25d9b99c8..fc82e3a75 100644 --- a/projects/CarouselExperiments/app/src/main/res/layout/demo_030_carousel.xml +++ b/projects/CarouselExperiments/app/src/main/res/layout/demo_030_carousel.xml @@ -84,6 +84,7 @@ app:carousel_backwardTransition="@+id/backward" app:carousel_previousState="@+id/previous" app:carousel_nextState="@+id/next" + app:carousel_infinite="true" app:carousel_firstView="@+id/imageView2" app:carousel_touchUpMode="carryVelocity" app:constraint_referenced_ids="imageView0,imageView1,imageView2,imageView3,imageView4" /> diff --git a/projects/CarouselExperiments/app/src/main/res/layout/demo_040_carousel.xml b/projects/CarouselExperiments/app/src/main/res/layout/demo_040_carousel.xml index d7fef44d5..4a8f042c3 100644 --- a/projects/CarouselExperiments/app/src/main/res/layout/demo_040_carousel.xml +++ b/projects/CarouselExperiments/app/src/main/res/layout/demo_040_carousel.xml @@ -64,6 +64,7 @@ app:carousel_backwardTransition="@+id/backward" app:carousel_previousState="@+id/previous" app:carousel_nextState="@+id/next" + app:carousel_infinite="true" app:carousel_firstView="@+id/imageView2" app:constraint_referenced_ids="imageView1,imageView2,imageView3,imageView4" /> diff --git a/projects/CarouselExperiments/app/src/main/res/layout/demo_050_carousel.xml b/projects/CarouselExperiments/app/src/main/res/layout/demo_050_carousel.xml index d6613388e..ebd313185 100644 --- a/projects/CarouselExperiments/app/src/main/res/layout/demo_050_carousel.xml +++ b/projects/CarouselExperiments/app/src/main/res/layout/demo_050_carousel.xml @@ -105,6 +105,7 @@ app:carousel_nextState="@+id/next" app:carousel_firstView="@+id/imageView2" app:carousel_emptyViewsBehavior="gone" + app:carousel_infinite="true" app:constraint_referenced_ids="imageView0,imageView1,imageView2,imageView3,imageView4" /> diff --git a/projects/CarouselExperiments/app/src/main/res/layout/demo_060_carousel.xml b/projects/CarouselExperiments/app/src/main/res/layout/demo_060_carousel.xml index 510035826..241fe3c47 100644 --- a/projects/CarouselExperiments/app/src/main/res/layout/demo_060_carousel.xml +++ b/projects/CarouselExperiments/app/src/main/res/layout/demo_060_carousel.xml @@ -176,6 +176,7 @@ app:carousel_forwardTransition="@+id/forward" app:carousel_backwardTransition="@+id/backward" app:carousel_previousState="@+id/previous" + app:carousel_infinite="false" app:carousel_nextState="@+id/next" app:carousel_firstView="@+id/textView4" app:constraint_referenced_ids="textView0,textView1,textView2,textView3,textView4,textView5,textView6,textView7,textView8" /> From 7aeec7f2ced407419a414fd43b4266c2d3e2c91b Mon Sep 17 00:00:00 2001 From: rodrigomartindMeli Date: Sun, 29 Nov 2020 21:34:59 -0300 Subject: [PATCH 3/7] Resolve 0 items in adapter --- .../java/androidx/constraintlayout/helper/widget/Carousel.java | 3 +++ .../app/src/main/res/layout/demo_050_carousel.xml | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/constraintlayout/constraintlayout/src/main/java/androidx/constraintlayout/helper/widget/Carousel.java b/constraintlayout/constraintlayout/src/main/java/androidx/constraintlayout/helper/widget/Carousel.java index 6a712f167..938e60d77 100644 --- a/constraintlayout/constraintlayout/src/main/java/androidx/constraintlayout/helper/widget/Carousel.java +++ b/constraintlayout/constraintlayout/src/main/java/androidx/constraintlayout/helper/widget/Carousel.java @@ -300,6 +300,9 @@ private void updateItems() { if (mMotionLayout == null) { return; } + if (mAdapter.count() == 0){ + return; + } if (DEBUG) { System.out.println("Update items, index: " + mIndex); } diff --git a/projects/CarouselExperiments/app/src/main/res/layout/demo_050_carousel.xml b/projects/CarouselExperiments/app/src/main/res/layout/demo_050_carousel.xml index ebd313185..6c32a20b1 100644 --- a/projects/CarouselExperiments/app/src/main/res/layout/demo_050_carousel.xml +++ b/projects/CarouselExperiments/app/src/main/res/layout/demo_050_carousel.xml @@ -105,7 +105,7 @@ app:carousel_nextState="@+id/next" app:carousel_firstView="@+id/imageView2" app:carousel_emptyViewsBehavior="gone" - app:carousel_infinite="true" + app:carousel_infinite="false" app:constraint_referenced_ids="imageView0,imageView1,imageView2,imageView3,imageView4" /> From db31d5a7a4d13662b6dadb5e92b71da0cbf8ec9f Mon Sep 17 00:00:00 2001 From: rodrigomartindMeli Date: Sun, 29 Nov 2020 21:41:25 -0300 Subject: [PATCH 4/7] demo 50 & demo 60 with infinite carousel --- .../app/src/main/res/layout/demo_050_carousel.xml | 2 +- .../app/src/main/res/layout/demo_060_carousel.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/projects/CarouselExperiments/app/src/main/res/layout/demo_050_carousel.xml b/projects/CarouselExperiments/app/src/main/res/layout/demo_050_carousel.xml index 6c32a20b1..ebd313185 100644 --- a/projects/CarouselExperiments/app/src/main/res/layout/demo_050_carousel.xml +++ b/projects/CarouselExperiments/app/src/main/res/layout/demo_050_carousel.xml @@ -105,7 +105,7 @@ app:carousel_nextState="@+id/next" app:carousel_firstView="@+id/imageView2" app:carousel_emptyViewsBehavior="gone" - app:carousel_infinite="false" + app:carousel_infinite="true" app:constraint_referenced_ids="imageView0,imageView1,imageView2,imageView3,imageView4" /> diff --git a/projects/CarouselExperiments/app/src/main/res/layout/demo_060_carousel.xml b/projects/CarouselExperiments/app/src/main/res/layout/demo_060_carousel.xml index 241fe3c47..e9f85e3bb 100644 --- a/projects/CarouselExperiments/app/src/main/res/layout/demo_060_carousel.xml +++ b/projects/CarouselExperiments/app/src/main/res/layout/demo_060_carousel.xml @@ -176,7 +176,7 @@ app:carousel_forwardTransition="@+id/forward" app:carousel_backwardTransition="@+id/backward" app:carousel_previousState="@+id/previous" - app:carousel_infinite="false" + app:carousel_infinite="true" app:carousel_nextState="@+id/next" app:carousel_firstView="@+id/textView4" app:constraint_referenced_ids="textView0,textView1,textView2,textView3,textView4,textView5,textView6,textView7,textView8" /> From f3c5a0d1dc27e1cdd91a97e4198af478878d4b39 Mon Sep 17 00:00:00 2001 From: rodrigomartindMeli Date: Mon, 30 Nov 2020 09:57:36 -0300 Subject: [PATCH 5/7] Added demo from infinite carousel. --- .../app/src/main/AndroidManifest.xml | 1 + .../experiments/CarouselHelperActivity.kt | 49 +++++++ .../constraintlayout/experiments/Loader.java | 7 + .../res/layout/activity_carousel_helper.xml | 77 +++++++++++ .../xml/activity_carousel_helper_scene.xml | 126 ++++++++++++++++++ 5 files changed, 260 insertions(+) create mode 100644 projects/CarouselExperiments/app/src/main/java/androidx/constraintlayout/experiments/CarouselHelperActivity.kt create mode 100644 projects/CarouselExperiments/app/src/main/res/layout/activity_carousel_helper.xml create mode 100644 projects/CarouselExperiments/app/src/main/res/xml/activity_carousel_helper_scene.xml diff --git a/projects/CarouselExperiments/app/src/main/AndroidManifest.xml b/projects/CarouselExperiments/app/src/main/AndroidManifest.xml index ef1c5bf1b..6385bcf1c 100644 --- a/projects/CarouselExperiments/app/src/main/AndroidManifest.xml +++ b/projects/CarouselExperiments/app/src/main/AndroidManifest.xml @@ -16,6 +16,7 @@ + \ No newline at end of file diff --git a/projects/CarouselExperiments/app/src/main/java/androidx/constraintlayout/experiments/CarouselHelperActivity.kt b/projects/CarouselExperiments/app/src/main/java/androidx/constraintlayout/experiments/CarouselHelperActivity.kt new file mode 100644 index 000000000..8679627a0 --- /dev/null +++ b/projects/CarouselExperiments/app/src/main/java/androidx/constraintlayout/experiments/CarouselHelperActivity.kt @@ -0,0 +1,49 @@ +package androidx.constraintlayout.experiments + +import android.graphics.Color +import android.os.Bundle +import android.view.View +import androidx.appcompat.app.AppCompatActivity +import androidx.constraintlayout.helper.widget.Carousel +import com.google.android.material.card.MaterialCardView + + +class CarouselHelperActivity : AppCompatActivity() { + var colors = intArrayOf( + Color.parseColor("#ffd54f"), + Color.parseColor("#ffca28"), + Color.parseColor("#ffc107"), + Color.parseColor("#ffb300"), + Color.parseColor("#ffa000"), + Color.parseColor("#ff8f00"), + Color.parseColor("#ff6f00"), + Color.parseColor("#c43e00") + ) + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_carousel_helper) + setupCarousel() + } + + + private fun setupCarousel() { + val carousel = findViewById(R.id.carousel) ?: return + val numImages = colors.size + + carousel.setAdapter(object : Carousel.Adapter { + override fun count(): Int { + return numImages + } + + override fun populate(view: View, index: Int) { + if (view is MaterialCardView) { + view.setBackgroundColor(colors[index]) + } + } + + override fun onNewItem(index: Int) { + } + }) + } +} \ No newline at end of file diff --git a/projects/CarouselExperiments/app/src/main/java/androidx/constraintlayout/experiments/Loader.java b/projects/CarouselExperiments/app/src/main/java/androidx/constraintlayout/experiments/Loader.java index 069c9fdd4..b99ec5470 100644 --- a/projects/CarouselExperiments/app/src/main/java/androidx/constraintlayout/experiments/Loader.java +++ b/projects/CarouselExperiments/app/src/main/java/androidx/constraintlayout/experiments/Loader.java @@ -69,6 +69,13 @@ static void normalMenuStartUp(MainActivity mainActivity) { linearLayout.addView(button); button.setOnClickListener(view -> launch(mainActivity, (String) view.getTag())); } + Button button = new Button(mainActivity); + button.setText("Carousel color demo"); + linearLayout.addView(button); + button.setOnClickListener(v -> { + Intent intent = new Intent(mainActivity, CarouselHelperActivity.class); + mainActivity.startActivity(intent); + }); sv.addView(linearLayout); mainActivity.setContentView(sv); } diff --git a/projects/CarouselExperiments/app/src/main/res/layout/activity_carousel_helper.xml b/projects/CarouselExperiments/app/src/main/res/layout/activity_carousel_helper.xml new file mode 100644 index 000000000..ca6023c10 --- /dev/null +++ b/projects/CarouselExperiments/app/src/main/res/layout/activity_carousel_helper.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/projects/CarouselExperiments/app/src/main/res/xml/activity_carousel_helper_scene.xml b/projects/CarouselExperiments/app/src/main/res/xml/activity_carousel_helper_scene.xml new file mode 100644 index 000000000..1cf9480df --- /dev/null +++ b/projects/CarouselExperiments/app/src/main/res/xml/activity_carousel_helper_scene.xml @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From ce3aa8627bc852d1e1f9c7ea08696384c845c8c0 Mon Sep 17 00:00:00 2001 From: rodrigomartindMeli Date: Mon, 30 Nov 2020 16:38:58 -0300 Subject: [PATCH 6/7] Resolve PR --- .../helper/widget/Carousel.java | 46 +++++++++++-------- .../experiments/CarouselHelperActivity.kt | 17 ++++++- .../constraintlayout/experiments/Loader.java | 19 ++++---- .../experiments/MainActivity.java | 7 ++- .../src/main/res/layout/demo_020_carousel.xml | 1 - .../src/main/res/layout/demo_050_carousel.xml | 1 - .../src/main/res/layout/demo_060_carousel.xml | 1 - 7 files changed, 59 insertions(+), 33 deletions(-) diff --git a/constraintlayout/constraintlayout/src/main/java/androidx/constraintlayout/helper/widget/Carousel.java b/constraintlayout/constraintlayout/src/main/java/androidx/constraintlayout/helper/widget/Carousel.java index 938e60d77..c9ae8fe0a 100644 --- a/constraintlayout/constraintlayout/src/main/java/androidx/constraintlayout/helper/widget/Carousel.java +++ b/constraintlayout/constraintlayout/src/main/java/androidx/constraintlayout/helper/widget/Carousel.java @@ -149,21 +149,24 @@ public void onTransitionCompleted(MotionLayout motionLayout, int currentId) { mIndex--; System.out.println("decrement index..."); } - if (mIndex >= mAdapter.count()) { - if (infiniteCarousel) { + if (infiniteCarousel) { + if (mIndex >= mAdapter.count()) { mIndex = 0; - } else { + System.out.println("index capped... " + mIndex); + } + if (mIndex < 0) { mIndex = mAdapter.count() - 1; + System.out.println("index zeroed... "); } - System.out.println("index capped... " + mIndex); - } - if (mIndex < 0) { - if (infiniteCarousel) { + } else { + if (mIndex >= mAdapter.count()) { mIndex = mAdapter.count() - 1; - } else { + System.out.println("index capped... " + mIndex); + } + if (mIndex < 0) { mIndex = 0; + System.out.println("index zeroed... "); } - System.out.println("index zeroed... "); } if (mPreviousIndex != mIndex) { @@ -300,7 +303,7 @@ private void updateItems() { if (mMotionLayout == null) { return; } - if (mAdapter.count() == 0){ + if (mAdapter.count() == 0) { return; } if (DEBUG) { @@ -311,8 +314,8 @@ private void updateItems() { // mIndex should map to i == startIndex View view = mList.get(i); int index = mIndex + i - startIndex; - if (index < 0) { - if (infiniteCarousel) { + if (infiniteCarousel) { + if (index < 0) { if (emptyViewBehavior != View.INVISIBLE) { updateViewVisibility(view, emptyViewBehavior); } else { @@ -323,11 +326,7 @@ private void updateItems() { } else { mAdapter.populate(view, mAdapter.count() + (index % mAdapter.count())); } - } else { - updateViewVisibility(view, emptyViewBehavior); - } - } else if (index >= mAdapter.count()) { - if (infiniteCarousel) { + } else if (index >= mAdapter.count()) { if (index == mAdapter.count()) { index = 0; } else if (index > mAdapter.count()) { @@ -340,11 +339,18 @@ private void updateItems() { } mAdapter.populate(view, index); } else { - updateViewVisibility(view, emptyViewBehavior); + updateViewVisibility(view, VISIBLE); + mAdapter.populate(view, index); } } else { - updateViewVisibility(view, VISIBLE); - mAdapter.populate(view, index); + if (index < 0) { + updateViewVisibility(view, emptyViewBehavior); + } else if (index >= mAdapter.count()) { + updateViewVisibility(view, emptyViewBehavior); + } else { + updateViewVisibility(view, VISIBLE); + mAdapter.populate(view, index); + } } } diff --git a/projects/CarouselExperiments/app/src/main/java/androidx/constraintlayout/experiments/CarouselHelperActivity.kt b/projects/CarouselExperiments/app/src/main/java/androidx/constraintlayout/experiments/CarouselHelperActivity.kt index 8679627a0..9c3ae8a59 100644 --- a/projects/CarouselExperiments/app/src/main/java/androidx/constraintlayout/experiments/CarouselHelperActivity.kt +++ b/projects/CarouselExperiments/app/src/main/java/androidx/constraintlayout/experiments/CarouselHelperActivity.kt @@ -1,3 +1,19 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package androidx.constraintlayout.experiments import android.graphics.Color @@ -7,7 +23,6 @@ import androidx.appcompat.app.AppCompatActivity import androidx.constraintlayout.helper.widget.Carousel import com.google.android.material.card.MaterialCardView - class CarouselHelperActivity : AppCompatActivity() { var colors = intArrayOf( Color.parseColor("#ffd54f"), diff --git a/projects/CarouselExperiments/app/src/main/java/androidx/constraintlayout/experiments/Loader.java b/projects/CarouselExperiments/app/src/main/java/androidx/constraintlayout/experiments/Loader.java index b99ec5470..a086666da 100644 --- a/projects/CarouselExperiments/app/src/main/java/androidx/constraintlayout/experiments/Loader.java +++ b/projects/CarouselExperiments/app/src/main/java/androidx/constraintlayout/experiments/Loader.java @@ -57,7 +57,7 @@ static MotionLayout findMotionLayout(ViewGroup group) { return null; } - static void normalMenuStartUp(MainActivity mainActivity) { + static void normalMenuStartUp(MainActivity mainActivity, Class[] activitiesDemo) { String[] layouts = getLayouts(s -> s.matches(LAYOUTS_MATCHES)); ScrollView sv = new ScrollView(mainActivity); LinearLayout linearLayout = new LinearLayout(mainActivity); @@ -69,13 +69,16 @@ static void normalMenuStartUp(MainActivity mainActivity) { linearLayout.addView(button); button.setOnClickListener(view -> launch(mainActivity, (String) view.getTag())); } - Button button = new Button(mainActivity); - button.setText("Carousel color demo"); - linearLayout.addView(button); - button.setOnClickListener(v -> { - Intent intent = new Intent(mainActivity, CarouselHelperActivity.class); - mainActivity.startActivity(intent); - }); + for (Class aClass : activitiesDemo) { + Button button = new Button(mainActivity); + button.setText("Demo from " + aClass.getSimpleName()); + linearLayout.addView(button); + button.setOnClickListener(v -> { + Intent intent = new Intent(mainActivity, aClass); + mainActivity.startActivity(intent); + }); + } + sv.addView(linearLayout); mainActivity.setContentView(sv); } diff --git a/projects/CarouselExperiments/app/src/main/java/androidx/constraintlayout/experiments/MainActivity.java b/projects/CarouselExperiments/app/src/main/java/androidx/constraintlayout/experiments/MainActivity.java index d6f9c9d07..a00df5da7 100644 --- a/projects/CarouselExperiments/app/src/main/java/androidx/constraintlayout/experiments/MainActivity.java +++ b/projects/CarouselExperiments/app/src/main/java/androidx/constraintlayout/experiments/MainActivity.java @@ -73,6 +73,11 @@ public class MainActivity extends AppCompatActivity { Color.parseColor("#45C0B8"), }; + // Array from Activities with more examples + Class activitiesDemo[] = { + CarouselHelperActivity.class + }; + //////////////////////////////////////////////////////////////// @Override @@ -80,7 +85,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); Bundle extra = getIntent().getExtras(); if (extra == null) { - Loader.normalMenuStartUp(this); + Loader.normalMenuStartUp(this, activitiesDemo); return; } setupActivity(extra); diff --git a/projects/CarouselExperiments/app/src/main/res/layout/demo_020_carousel.xml b/projects/CarouselExperiments/app/src/main/res/layout/demo_020_carousel.xml index 515a04aa8..21dbe4d11 100644 --- a/projects/CarouselExperiments/app/src/main/res/layout/demo_020_carousel.xml +++ b/projects/CarouselExperiments/app/src/main/res/layout/demo_020_carousel.xml @@ -87,7 +87,6 @@ app:carousel_firstView="@+id/imageView2" app:carousel_touchUpMode="carryVelocity" app:carousel_touchUp_dampeningFactor="0.8" - app:carousel_infinite="true" app:constraint_referenced_ids="imageView0,imageView1,imageView2,imageView3,imageView4" /> \ No newline at end of file diff --git a/projects/CarouselExperiments/app/src/main/res/layout/demo_050_carousel.xml b/projects/CarouselExperiments/app/src/main/res/layout/demo_050_carousel.xml index ebd313185..d6613388e 100644 --- a/projects/CarouselExperiments/app/src/main/res/layout/demo_050_carousel.xml +++ b/projects/CarouselExperiments/app/src/main/res/layout/demo_050_carousel.xml @@ -105,7 +105,6 @@ app:carousel_nextState="@+id/next" app:carousel_firstView="@+id/imageView2" app:carousel_emptyViewsBehavior="gone" - app:carousel_infinite="true" app:constraint_referenced_ids="imageView0,imageView1,imageView2,imageView3,imageView4" /> diff --git a/projects/CarouselExperiments/app/src/main/res/layout/demo_060_carousel.xml b/projects/CarouselExperiments/app/src/main/res/layout/demo_060_carousel.xml index e9f85e3bb..510035826 100644 --- a/projects/CarouselExperiments/app/src/main/res/layout/demo_060_carousel.xml +++ b/projects/CarouselExperiments/app/src/main/res/layout/demo_060_carousel.xml @@ -176,7 +176,6 @@ app:carousel_forwardTransition="@+id/forward" app:carousel_backwardTransition="@+id/backward" app:carousel_previousState="@+id/previous" - app:carousel_infinite="true" app:carousel_nextState="@+id/next" app:carousel_firstView="@+id/textView4" app:constraint_referenced_ids="textView0,textView1,textView2,textView3,textView4,textView5,textView6,textView7,textView8" /> From 6ead59aedef77d8cb8f8409766ce2dca6b87b7da Mon Sep 17 00:00:00 2001 From: rodrigomartindMeli Date: Mon, 30 Nov 2020 20:24:38 -0300 Subject: [PATCH 7/7] Resolve PR comments --- .../helper/widget/Carousel.java | 35 ++++++++----------- 1 file changed, 15 insertions(+), 20 deletions(-) diff --git a/constraintlayout/constraintlayout/src/main/java/androidx/constraintlayout/helper/widget/Carousel.java b/constraintlayout/constraintlayout/src/main/java/androidx/constraintlayout/helper/widget/Carousel.java index c9ae8fe0a..79ddf34ef 100644 --- a/constraintlayout/constraintlayout/src/main/java/androidx/constraintlayout/helper/widget/Carousel.java +++ b/constraintlayout/constraintlayout/src/main/java/androidx/constraintlayout/helper/widget/Carousel.java @@ -140,32 +140,25 @@ public void onTransitionChange(MotionLayout motionLayout, int startId, int endId @Override public void onTransitionCompleted(MotionLayout motionLayout, int currentId) { - System.out.println("on transition completed"); mPreviousIndex = mIndex; if (currentId == nextState) { mIndex++; - System.out.println("increment index..."); } else if (currentId == previousState) { mIndex--; - System.out.println("decrement index..."); } if (infiniteCarousel) { if (mIndex >= mAdapter.count()) { mIndex = 0; - System.out.println("index capped... " + mIndex); } if (mIndex < 0) { mIndex = mAdapter.count() - 1; - System.out.println("index zeroed... "); } } else { if (mIndex >= mAdapter.count()) { mIndex = mAdapter.count() - 1; - System.out.println("index capped... " + mIndex); } if (mIndex < 0) { mIndex = 0; - System.out.println("index zeroed... "); } } @@ -359,20 +352,22 @@ private void updateItems() { return; } + if (infiniteCarousel) { + return; + } + final int count = mAdapter.count(); - if (!infiniteCarousel) { - if (mIndex == 0) { - enableTransition(backwardTransition, false); - } else { - enableTransition(backwardTransition, true); - mMotionLayout.setTransition(backwardTransition); - } - if (mIndex == count - 1) { - enableTransition(forwardTransition, false); - } else { - enableTransition(forwardTransition, true); - mMotionLayout.setTransition(forwardTransition); - } + if (mIndex == 0) { + enableTransition(backwardTransition, false); + } else { + enableTransition(backwardTransition, true); + mMotionLayout.setTransition(backwardTransition); + } + if (mIndex == count - 1) { + enableTransition(forwardTransition, false); + } else { + enableTransition(forwardTransition, true); + mMotionLayout.setTransition(forwardTransition); } }