diff options
author | Allan Wang <me@allanwang.ca> | 2019-07-01 20:33:36 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-07-01 20:33:36 -0700 |
commit | 646a3a1b2849dd8a8cb7cc9d6da4f303f5bd939e (patch) | |
tree | 625ebddb2a21c5306751045aa34b6ba416125996 /app/src/main | |
parent | 35305f7a83daabf535d3fb22938eb5dd68fd2c19 (diff) | |
parent | 70b42ba365d00f7ec19abe1050c51aee9931045b (diff) | |
download | frost-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
Diffstat (limited to 'app/src/main')
8 files changed, 105 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" /> |