From 03e58f9ef29cfd1af02f908ccc259ba0e1390977 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Sat, 18 Mar 2017 23:57:54 -0400 Subject: [PATCH] Preserve position of ScrollableChart on configuration changes Fixes #240 --- .../common/dialogs/HistoryEditorDialog.java | 3 + .../common/views/BundleSavedState.java | 63 +++++++++++++++++++ .../common/views/ScrollableChart.java | 24 +++++++ 3 files changed, 90 insertions(+) create mode 100644 app/src/main/java/org/isoron/uhabits/activities/common/views/BundleSavedState.java diff --git a/app/src/main/java/org/isoron/uhabits/activities/common/dialogs/HistoryEditorDialog.java b/app/src/main/java/org/isoron/uhabits/activities/common/dialogs/HistoryEditorDialog.java index 7aac7e87a..9de7af377 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/common/dialogs/HistoryEditorDialog.java +++ b/app/src/main/java/org/isoron/uhabits/activities/common/dialogs/HistoryEditorDialog.java @@ -78,6 +78,8 @@ public class HistoryEditorDialog extends AppCompatDialogFragment { long id = savedInstanceState.getLong("habit", -1); if (id > 0) this.habit = habitList.getById(id); + historyChart.onRestoreInstanceState( + savedInstanceState.getParcelable("historyChart")); } int padding = @@ -129,6 +131,7 @@ public class HistoryEditorDialog extends AppCompatDialogFragment public void onSaveInstanceState(Bundle outState) { outState.putLong("habit", habit.getId()); + outState.putParcelable("historyChart", historyChart.onSaveInstanceState()); } public void setController(@NonNull Controller controller) diff --git a/app/src/main/java/org/isoron/uhabits/activities/common/views/BundleSavedState.java b/app/src/main/java/org/isoron/uhabits/activities/common/views/BundleSavedState.java new file mode 100644 index 000000000..16eb77d88 --- /dev/null +++ b/app/src/main/java/org/isoron/uhabits/activities/common/views/BundleSavedState.java @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2017 Álinson Santos Xavier + * + * This file is part of Loop Habit Tracker. + * + * Loop Habit Tracker is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by the + * Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * Loop Habit Tracker is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +package org.isoron.uhabits.activities.common.views; + +import android.os.*; +import android.view.*; + +public class BundleSavedState extends View.BaseSavedState +{ + public static final Parcelable.Creator CREATOR = + new Parcelable.Creator() + { + @Override + public BundleSavedState createFromParcel(Parcel source) + { + return new BundleSavedState(source); + } + + @Override + public BundleSavedState[] newArray(int size) + { + return new BundleSavedState[size]; + } + }; + + final Bundle bundle; + + public BundleSavedState(Parcelable superState, Bundle bundle) + { + super(superState); + this.bundle = bundle; + } + + public BundleSavedState(Parcel source) + { + super(source); + this.bundle = source.readBundle(); + } + + @Override + public void writeToParcel(Parcel out, int flags) + { + super.writeToParcel(out, flags); + out.writeBundle(bundle); + } +} \ No newline at end of file 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 a762ecf86..5cbda9bd4 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 @@ -21,6 +21,7 @@ package org.isoron.uhabits.activities.common.views; import android.animation.*; import android.content.*; +import android.os.*; import android.util.*; import android.view.*; import android.widget.*; @@ -143,6 +144,29 @@ public abstract class ScrollableChart extends View this.scrollerBucketSize = scrollerBucketSize; } + @Override + public void onRestoreInstanceState(Parcelable state) + { + BundleSavedState bss = (BundleSavedState) state; + int x = bss.bundle.getInt("x"); + int y = bss.bundle.getInt("y"); + dataOffset = bss.bundle.getInt("dataOffset"); + scroller.startScroll(0, 0, x, y, 0); + scroller.computeScrollOffset(); + super.onRestoreInstanceState(bss.getSuperState()); + } + + @Override + public Parcelable onSaveInstanceState() + { + Parcelable superState = super.onSaveInstanceState(); + Bundle bundle = new Bundle(); + bundle.putInt("x", scroller.getCurrX()); + bundle.putInt("y", scroller.getCurrY()); + bundle.putInt("dataOffset", dataOffset); + return new BundleSavedState(superState, bundle); + } + private void init(Context context) { detector = new GestureDetector(context, this);