aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAllan Wang <me@allanwang.ca>2019-07-01 20:33:36 -0700
committerGitHub <noreply@github.com>2019-07-01 20:33:36 -0700
commit646a3a1b2849dd8a8cb7cc9d6da4f303f5bd939e (patch)
tree625ebddb2a21c5306751045aa34b6ba416125996
parent35305f7a83daabf535d3fb22938eb5dd68fd2c19 (diff)
parent70b42ba365d00f7ec19abe1050c51aee9931045b (diff)
downloadfrost-646a3a1b2849dd8a8cb7cc9d6da4f303f5bd939e.tar.gz
frost-646a3a1b2849dd8a8cb7cc9d6da4f303f5bd939e.tar.bz2
frost-646a3a1b2849dd8a8cb7cc9d6da4f303f5bd939e.zip
Merge pull request #1457 from AllanWang/enhancement/refresh
Disable refresh if not at the top, resolves #1450
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/activities/LoginActivity.kt1
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/views/SwipeRefreshLayout.kt87
-rw-r--r--app/src/main/play/en-US/whatsnew11
-rw-r--r--app/src/main/res/layout/activity_debug.xml4
-rw-r--r--app/src/main/res/layout/login_webview.xml4
-rw-r--r--app/src/main/res/layout/view_content_base_recycler.xml4
-rw-r--r--app/src/main/res/layout/view_content_base_web.xml4
-rw-r--r--app/src/main/res/xml/frost_changelog.xml7
-rw-r--r--docs/Changelog.md4
9 files changed, 109 insertions, 17 deletions
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/activities/LoginActivity.kt b/app/src/main/kotlin/com/pitchedapps/frost/activities/LoginActivity.kt
index ed207896..0fb24f7e 100644
--- a/app/src/main/kotlin/com/pitchedapps/frost/activities/LoginActivity.kt
+++ b/app/src/main/kotlin/com/pitchedapps/frost/activities/LoginActivity.kt
@@ -41,7 +41,6 @@ import com.pitchedapps.frost.facebook.FbItem
import com.pitchedapps.frost.facebook.profilePictureUrl
import com.pitchedapps.frost.glide.FrostGlide
import com.pitchedapps.frost.glide.GlideApp
-import com.pitchedapps.frost.glide.transform
import com.pitchedapps.frost.utils.L
import com.pitchedapps.frost.utils.Showcase
import com.pitchedapps.frost.utils.frostEvent
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/views/SwipeRefreshLayout.kt b/app/src/main/kotlin/com/pitchedapps/frost/views/SwipeRefreshLayout.kt
new file mode 100644
index 00000000..2154ce2d
--- /dev/null
+++ b/app/src/main/kotlin/com/pitchedapps/frost/views/SwipeRefreshLayout.kt
@@ -0,0 +1,87 @@
+package com.pitchedapps.frost.views
+
+import android.content.Context
+import android.util.AttributeSet
+import android.view.MotionEvent
+import android.view.View
+import android.view.ViewConfiguration
+import android.webkit.WebView
+import android.widget.ListView
+import androidx.core.widget.ListViewCompat
+import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
+import androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnChildScrollUpCallback
+import com.pitchedapps.frost.utils.L
+
+/**
+ * Variant that forbids refreshing if child layout is not at the top
+ * Inspired by https://github.com/slapperwan/gh4a/blob/master/app/src/main/java/com/gh4a/widget/SwipeRefreshLayout.java
+ *
+ */
+class SwipeRefreshLayout @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) :
+ SwipeRefreshLayout(context, attrs) {
+
+ private var preventRefresh: Boolean = false
+ private var downY: Float = -1f
+ private val touchSlop = ViewConfiguration.get(context).scaledTouchSlop
+
+ private var nestedCanChildScrollUp: OnChildScrollUpCallback? = null
+
+ /**
+ * Copy of [canChildScrollUp], with additional support if necessary
+ */
+ private val canChildScrollUp = OnChildScrollUpCallback { parent, child ->
+ nestedCanChildScrollUp?.canChildScrollUp(parent, child) ?: when (child) {
+ is WebView -> child.canScrollVertically(-1).apply {
+ L.d { "Webview can scroll up $this" }
+ }
+ is ListView -> ListViewCompat.canScrollList(child, -1)
+ // Supports webviews as well
+ else -> child?.canScrollVertically(-1) ?: false
+ }
+ }
+
+ init {
+ setOnChildScrollUpCallback(canChildScrollUp)
+ }
+
+ override fun setOnChildScrollUpCallback(callback: OnChildScrollUpCallback?) {
+ this.nestedCanChildScrollUp = callback
+ }
+
+ override fun onInterceptTouchEvent(ev: MotionEvent): Boolean {
+ if (ev.action != MotionEvent.ACTION_DOWN && preventRefresh) {
+ return false
+ }
+ when (ev.action) {
+ MotionEvent.ACTION_DOWN -> {
+ downY = ev.y
+ preventRefresh = canChildScrollUp()
+ }
+ MotionEvent.ACTION_MOVE -> {
+ if (downY - ev.y > touchSlop) {
+ preventRefresh = true
+ return false
+ }
+ }
+ }
+ return super.onInterceptTouchEvent(ev)
+ }
+
+ override fun onNestedScroll(target: View, dxConsumed: Int, dyConsumed: Int, dxUnconsumed: Int, dyUnconsumed: Int) {
+ if (preventRefresh) {
+ /*
+ * Ignoring offsetInWindow since
+ * 1. It doesn't seem to matter in the typical use case
+ * 2. It isn't being transferred to the underlying array used by the super class
+ */
+ dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, null)
+ } else {
+ super.onNestedScroll(target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed)
+ }
+ }
+
+ /**
+ * Alias for adding on refresh listener
+ */
+ interface OnRefreshListener : SwipeRefreshLayout.OnRefreshListener
+} \ No newline at end of file
diff --git a/app/src/main/play/en-US/whatsnew b/app/src/main/play/en-US/whatsnew
index 009f4196..cd43de9e 100644
--- a/app/src/main/play/en-US/whatsnew
+++ b/app/src/main/play/en-US/whatsnew
@@ -1,9 +1,4 @@
-v2.3.0
+v2.3.1
-* Converted internals of Facebook data storage; auto migration will only work from 2.2.x to 2.3.x
-* Added notification widget
-* Update theme
-* Update translations
-* Add fingerprint unlock screen
-* Fix messenger redirect
-* Lots of internal updates \ No newline at end of file
+* Hide all story panels if enabled
+* Prevent swipe to refresh if not at the very top \ No newline at end of file
diff --git a/app/src/main/res/layout/activity_debug.xml b/app/src/main/res/layout/activity_debug.xml
index 55553f42..c3818749 100644
--- a/app/src/main/res/layout/activity_debug.xml
+++ b/app/src/main/res/layout/activity_debug.xml
@@ -16,7 +16,7 @@
app:layout_scrollFlags="scroll|enterAlways"
app:popupTheme="@style/AppTheme.PopupOverlay" />
- <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
+ <com.pitchedapps.frost.views.SwipeRefreshLayout
android:id="@+id/swipe_refresh"
android:layout_width="match_parent"
android:layout_height="match_parent"
@@ -29,7 +29,7 @@
android:focusable="true"
android:focusableInTouchMode="true" />
- </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
+ </com.pitchedapps.frost.views.SwipeRefreshLayout>
<include layout="@layout/view_main_fab" />
diff --git a/app/src/main/res/layout/login_webview.xml b/app/src/main/res/layout/login_webview.xml
index 8816383a..48d48589 100644
--- a/app/src/main/res/layout/login_webview.xml
+++ b/app/src/main/res/layout/login_webview.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<androidx.swiperefreshlayout.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<com.pitchedapps.frost.views.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/swipe_refresh"
android:layout_width="match_parent"
android:layout_height="match_parent">
@@ -36,4 +36,4 @@
</RelativeLayout>
-</androidx.swiperefreshlayout.widget.SwipeRefreshLayout> \ No newline at end of file
+</com.pitchedapps.frost.views.SwipeRefreshLayout> \ No newline at end of file
diff --git a/app/src/main/res/layout/view_content_base_recycler.xml b/app/src/main/res/layout/view_content_base_recycler.xml
index 05b14215..ce33ce13 100644
--- a/app/src/main/res/layout/view_content_base_recycler.xml
+++ b/app/src/main/res/layout/view_content_base_recycler.xml
@@ -6,7 +6,7 @@
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
- <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
+ <com.pitchedapps.frost.views.SwipeRefreshLayout
android:id="@id/content_refresh"
android:layout_width="match_parent"
android:layout_height="wrap_content">
@@ -19,7 +19,7 @@
android:focusableInTouchMode="true"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
- </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
+ </com.pitchedapps.frost.views.SwipeRefreshLayout>
<ProgressBar
android:id="@id/content_progress"
diff --git a/app/src/main/res/layout/view_content_base_web.xml b/app/src/main/res/layout/view_content_base_web.xml
index 9360b9f3..641ce918 100644
--- a/app/src/main/res/layout/view_content_base_web.xml
+++ b/app/src/main/res/layout/view_content_base_web.xml
@@ -6,7 +6,7 @@
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
- <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
+ <com.pitchedapps.frost.views.SwipeRefreshLayout
android:id="@id/content_refresh"
android:layout_width="match_parent"
android:layout_height="wrap_content">
@@ -19,7 +19,7 @@
android:focusableInTouchMode="true"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
- </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
+ </com.pitchedapps.frost.views.SwipeRefreshLayout>
<ProgressBar
android:id="@id/content_progress"
diff --git a/app/src/main/res/xml/frost_changelog.xml b/app/src/main/res/xml/frost_changelog.xml
index 94c4fcdf..c059c532 100644
--- a/app/src/main/res/xml/frost_changelog.xml
+++ b/app/src/main/res/xml/frost_changelog.xml
@@ -6,6 +6,13 @@
<item text="" />
-->
+ <version title="v2.3.1" />
+ <item text="Hide all story panels if enabled" />
+ <item text="Prevent swipe to refresh if not at the very top" />
+ <item text="" />
+ <item text="" />
+ <item text="" />
+
<version title="v2.3.0" />
<item text="Converted internals of Facebook data storage; auto migration will only work from 2.2.x to 2.3.x" />
<item text="Added notification widget" />
diff --git a/docs/Changelog.md b/docs/Changelog.md
index c54156d4..c581c0e1 100644
--- a/docs/Changelog.md
+++ b/docs/Changelog.md
@@ -1,5 +1,9 @@
# Changelog
+## v2.3.1
+* Hide all story panels if enabled
+* Prevent swipe to refresh if not at the very top
+
## v2.3.0
* Converted internals of Facebook data storage; auto migration will only work from 2.2.x to 2.3.x
* Added notification widget