From 3fe09efe9b7624fda9b3d93ce0ef3928330e807c Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Sun, 19 Mar 2017 20:36:16 -0400 Subject: [PATCH] Scroll checkmarks --- .../common/views/ScrollableChart.java | 32 ++++++++++++++--- .../habits/list/ListHabitsRootView.java | 10 +++++- .../list/model/HabitCardListAdapter.java | 14 ++++++++ .../habits/list/views/CheckmarkPanelView.java | 26 ++++++++++---- .../habits/list/views/HabitCardListView.java | 35 ++++++++++++++++--- .../habits/list/views/HabitCardView.java | 15 +++++++- 6 files changed, 115 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/org/isoron/uhabits/activities/common/views/ScrollableChart.java b/app/src/main/java/org/isoron/uhabits/activities/common/views/ScrollableChart.java index 5cbda9bd4..0e77043b7 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/common/views/ScrollableChart.java +++ b/app/src/main/java/org/isoron/uhabits/activities/common/views/ScrollableChart.java @@ -41,6 +41,13 @@ public abstract class ScrollableChart extends View private ValueAnimator scrollAnimator; + private ScrollController scrollController; + + public void setScrollController(ScrollController scrollController) + { + this.scrollController = scrollController; + } + public ScrollableChart(Context context) { super(context); @@ -64,8 +71,7 @@ public abstract class ScrollableChart extends View if (!scroller.isFinished()) { scroller.computeScrollOffset(); - dataOffset = Math.max(0, scroller.getCurrX() / scrollerBucketSize); - postInvalidate(); + updateDataOffset(); } else { @@ -73,6 +79,19 @@ public abstract class ScrollableChart extends View } } + private void updateDataOffset() + { + int newDataOffset = + Math.max(0, scroller.getCurrX() / scrollerBucketSize); + + if(newDataOffset != dataOffset) + { + dataOffset = newDataOffset; + scrollController.onDataOffsetChanged(dataOffset); + postInvalidate(); + } + } + @Override public boolean onDown(MotionEvent e) { @@ -115,8 +134,7 @@ public abstract class ScrollableChart extends View scroller.startScroll(scroller.getCurrX(), scroller.getCurrY(), (int) -dx, (int) dy, 0); scroller.computeScrollOffset(); - dataOffset = Math.max(0, scroller.getCurrX() / scrollerBucketSize); - postInvalidate(); + updateDataOffset(); return true; } @@ -173,5 +191,11 @@ public abstract class ScrollableChart extends View scroller = new Scroller(context, null, true); scrollAnimator = ValueAnimator.ofFloat(0, 1); scrollAnimator.addUpdateListener(this); + scrollController = new ScrollController(){}; + } + + public interface ScrollController + { + default void onDataOffsetChanged(int newDataOffset) {} } } diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsRootView.java b/app/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsRootView.java index d25d5d4fd..4a3c1ee73 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsRootView.java +++ b/app/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsRootView.java @@ -28,6 +28,7 @@ import android.widget.*; import org.isoron.uhabits.R; import org.isoron.uhabits.activities.*; +import org.isoron.uhabits.activities.common.views.*; import org.isoron.uhabits.activities.habits.list.controllers.*; import org.isoron.uhabits.activities.habits.list.model.*; import org.isoron.uhabits.activities.habits.list.views.*; @@ -43,7 +44,7 @@ import butterknife.*; public class ListHabitsRootView extends BaseRootView implements ModelObservable.Listener, TaskRunner.Listener { - public static final int MAX_CHECKMARK_COUNT = 21; + public static final int MAX_CHECKMARK_COUNT = 60; @BindView(R.id.listView) HabitCardListView listView; @@ -132,6 +133,13 @@ public class ListHabitsRootView extends BaseRootView listController.setSelectionListener(menu); listView.setController(listController); menu.setListController(listController); + header.setScrollController(new ScrollableChart.ScrollController() { + @Override + public void onDataOffsetChanged(int newDataOffset) + { + listView.setDataOffset(newDataOffset); + } + }); } @Override diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/list/model/HabitCardListAdapter.java b/app/src/main/java/org/isoron/uhabits/activities/habits/list/model/HabitCardListAdapter.java index 55656b542..1245668a0 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/list/model/HabitCardListAdapter.java +++ b/app/src/main/java/org/isoron/uhabits/activities/habits/list/model/HabitCardListAdapter.java @@ -178,6 +178,20 @@ public class HabitCardListAdapter listView.bindCardView(holder, habit, score, checkmarks, selected); } + @Override + public void onViewAttachedToWindow(@Nullable HabitCardViewHolder holder) + { + if (listView == null) return; + listView.attachCardView(holder); + } + + @Override + public void onViewDetachedFromWindow(@Nullable HabitCardViewHolder holder) + { + if (listView == null) return; + listView.detachCardView(holder); + } + @Override public HabitCardViewHolder onCreateViewHolder(ViewGroup parent, int viewType) diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkPanelView.java b/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkPanelView.java index e5b47800c..b569f9208 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkPanelView.java +++ b/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkPanelView.java @@ -53,6 +53,8 @@ public class CheckmarkPanelView extends LinearLayout implements Preferences.List @NonNull private Habit habit; + private int dataOffset; + public CheckmarkPanelView(Context context) { super(context); @@ -75,19 +77,23 @@ public class CheckmarkPanelView extends LinearLayout implements Preferences.List return (CheckmarkButtonView) getChildAt(position); } - public void setCheckmarkValues(int[] checkmarkValues) + public void setButtonCount(int newButtonCount) { - this.checkmarkValues = checkmarkValues; - - if (this.nButtons != checkmarkValues.length) + if(nButtons != newButtonCount) { - this.nButtons = checkmarkValues.length; + nButtons = newButtonCount; addCheckmarkButtons(); } setupCheckmarkButtons(); } + public void setCheckmarkValues(int[] checkmarkValues) + { + this.checkmarkValues = checkmarkValues; + setupCheckmarkButtons(); + } + public void setColor(int color) { this.color = color; @@ -100,6 +106,12 @@ public class CheckmarkPanelView extends LinearLayout implements Preferences.List setupCheckmarkButtons(); } + public void setDataOffset(int dataOffset) + { + this.dataOffset = dataOffset; + setupCheckmarkButtons(); + } + public void setHabit(@NonNull Habit habit) { this.habit = habit; @@ -170,11 +182,13 @@ public class CheckmarkPanelView extends LinearLayout implements Preferences.List { long timestamp = DateUtils.getStartOfToday(); long day = DateUtils.millisecondsInOneDay; + timestamp -= day * dataOffset; for (int i = 0; i < nButtons; i++) { CheckmarkButtonView buttonView = indexToButton(i); - buttonView.setValue(checkmarkValues[i]); + if(i + dataOffset >= checkmarkValues.length) break; + buttonView.setValue(checkmarkValues[i + dataOffset]); buttonView.setColor(color); setupButtonControllers(timestamp, buttonView); timestamp -= day; diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListView.java b/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListView.java index fab2680eb..4034e2cbf 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListView.java +++ b/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListView.java @@ -26,9 +26,9 @@ import android.support.v7.widget.helper.*; import android.util.*; import android.view.*; -import org.isoron.uhabits.models.*; import org.isoron.uhabits.activities.habits.list.controllers.*; import org.isoron.uhabits.activities.habits.list.model.*; +import org.isoron.uhabits.models.*; import java.util.*; @@ -44,6 +44,10 @@ public class HabitCardListView extends RecyclerView private int checkmarkCount; + private int dataOffset; + + private LinkedList attachedHolders; + public HabitCardListView(Context context, AttributeSet attrs) { super(context, attrs); @@ -54,6 +58,13 @@ public class HabitCardListView extends RecyclerView TouchHelperCallback callback = new TouchHelperCallback(); touchHelper = new ItemTouchHelper(callback); touchHelper.attachToRecyclerView(this); + + attachedHolders = new LinkedList<>(); + } + + public void attachCardView(HabitCardViewHolder holder) + { + attachedHolders.add(holder); } /** @@ -75,13 +86,12 @@ public class HabitCardListView extends RecyclerView int[] checkmarks, boolean selected) { - int visibleCheckmarks[] = - Arrays.copyOfRange(checkmarks, 0, checkmarkCount); - HabitCardView cardView = (HabitCardView) holder.itemView; cardView.setHabit(habit); cardView.setSelected(selected); - cardView.setCheckmarkValues(visibleCheckmarks); + cardView.setCheckmarkValues(checkmarks); + cardView.setCheckmarkCount(checkmarkCount); + cardView.setDataOffset(dataOffset); cardView.setScore(score); if (controller != null) setupCardViewController(holder); return cardView; @@ -92,6 +102,11 @@ public class HabitCardListView extends RecyclerView return new HabitCardView(getContext()); } + public void detachCardView(HabitCardViewHolder holder) + { + attachedHolders.remove(holder); + } + @Override public void setAdapter(RecyclerView.Adapter adapter) { @@ -109,6 +124,16 @@ public class HabitCardListView extends RecyclerView this.controller = controller; } + public void setDataOffset(int dataOffset) + { + this.dataOffset = dataOffset; + for(HabitCardViewHolder holder : attachedHolders) + { + HabitCardView cardView = (HabitCardView) holder.itemView; + cardView.setDataOffset(dataOffset); + } + } + @Override protected void onAttachedToWindow() { diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.java b/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.java index bc2123c7c..d57e0a71c 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.java +++ b/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.java @@ -72,6 +72,8 @@ public class HabitCardView extends FrameLayout @Nullable private Habit habit; + private int dataOffset; + public HabitCardView(Context context) { super(context); @@ -90,6 +92,11 @@ public class HabitCardView extends FrameLayout new Handler(Looper.getMainLooper()).post(() -> refresh()); } + public void setCheckmarkCount(int checkmarkCount) + { + checkmarkPanel.setButtonCount(checkmarkCount); + } + public void setCheckmarkValues(int checkmarks[]) { checkmarkPanel.setCheckmarkValues(checkmarks); @@ -103,6 +110,12 @@ public class HabitCardView extends FrameLayout checkmarkPanel.setController(controller); } + public void setDataOffset(int dataOffset) + { + this.dataOffset = dataOffset; + checkmarkPanel.setDataOffset(dataOffset); + } + public void setHabit(@NonNull Habit habit) { if (this.habit != null) detachFromHabit(); @@ -134,7 +147,7 @@ public class HabitCardView extends FrameLayout { long today = DateUtils.getStartOfToday(); long day = DateUtils.millisecondsInOneDay; - int offset = (int) ((today - timestamp) / day); + int offset = (int) ((today - timestamp) / day) - dataOffset; CheckmarkButtonView button = checkmarkPanel.indexToButton(offset); float y = button.getHeight() / 2.0f;