Add pull down to refresh in subscriptions tab

Added the SwipeRefreshLayout in the fragment_subscriptions.xml to
refresh the content when user pulls down.

I keep the when user click in the tab it refresh the feed, because
I don't know which UX do you prefer.
This commit is contained in:
Relwi 2022-03-17 18:08:23 +01:00
parent 4933c13681
commit efabce5967
No known key found for this signature in database
GPG Key ID: 3316DC3D260D0163
2 changed files with 56 additions and 29 deletions

View File

@ -14,6 +14,7 @@ import androidx.preference.PreferenceManager
import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.github.libretube.adapters.SubscriptionAdapter import com.github.libretube.adapters.SubscriptionAdapter
import com.github.libretube.adapters.SubscriptionChannelAdapter import com.github.libretube.adapters.SubscriptionChannelAdapter
import com.github.libretube.adapters.TrendingAdapter import com.github.libretube.adapters.TrendingAdapter
@ -25,6 +26,7 @@ class Subscriptions : Fragment() {
lateinit var token: String lateinit var token: String
var isLoaded = false var isLoaded = false
private var subscriptionAdapter: SubscriptionAdapter? =null private var subscriptionAdapter: SubscriptionAdapter? =null
private var refreshLayout: SwipeRefreshLayout? = null
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
arguments?.let { arguments?.let {
@ -44,8 +46,11 @@ class Subscriptions : Fragment() {
val sharedPref = context?.getSharedPreferences("token", Context.MODE_PRIVATE) val sharedPref = context?.getSharedPreferences("token", Context.MODE_PRIVATE)
token = sharedPref?.getString("token","")!! token = sharedPref?.getString("token","")!!
Log.e(TAG,token) Log.e(TAG,token)
refreshLayout = view.findViewById(R.id.sub_refresh)
if(token!=""){ if(token!=""){
view.findViewById<RelativeLayout>(R.id.loginOrRegister).visibility=View.GONE view.findViewById<RelativeLayout>(R.id.loginOrRegister).visibility=View.GONE
refreshLayout?.isEnabled = true
var progressBar = view.findViewById<ProgressBar>(R.id.sub_progress) var progressBar = view.findViewById<ProgressBar>(R.id.sub_progress)
progressBar.visibility=View.VISIBLE progressBar.visibility=View.VISIBLE
@ -57,6 +62,11 @@ class Subscriptions : Fragment() {
feedRecView.layoutManager = GridLayoutManager(view.context, resources.getInteger(R.integer.grid_items)) feedRecView.layoutManager = GridLayoutManager(view.context, resources.getInteger(R.integer.grid_items))
fetchFeed(feedRecView, progressBar) fetchFeed(feedRecView, progressBar)
refreshLayout?.setOnRefreshListener {
fetchChannels(channelRecView)
fetchFeed(feedRecView, progressBar)
}
val scrollView = view.findViewById<ScrollView>(R.id.scrollview_sub) val scrollView = view.findViewById<ScrollView>(R.id.scrollview_sub)
scrollView.viewTreeObserver scrollView.viewTreeObserver
.addOnScrollChangedListener { .addOnScrollChangedListener {
@ -64,11 +74,15 @@ class Subscriptions : Fragment() {
== (scrollView.height + scrollView.scrollY)) { == (scrollView.height + scrollView.scrollY)) {
//scroll view is at bottom //scroll view is at bottom
if(isLoaded){ if(isLoaded){
refreshLayout?.isRefreshing = true
subscriptionAdapter?.updateItems() subscriptionAdapter?.updateItems()
refreshLayout?.isRefreshing = false
} }
} }
} }
} else {
refreshLayout?.isEnabled = false
} }
} }
@ -84,6 +98,8 @@ class Subscriptions : Fragment() {
} catch (e: HttpException) { } catch (e: HttpException) {
Log.e(TAG, "HttpException, unexpected response") Log.e(TAG, "HttpException, unexpected response")
return@launchWhenCreated return@launchWhenCreated
} finally {
refreshLayout?.isRefreshing = false
} }
if (response.isNotEmpty()){ if (response.isNotEmpty()){
subscriptionAdapter = SubscriptionAdapter(response) subscriptionAdapter = SubscriptionAdapter(response)
@ -109,6 +125,8 @@ class Subscriptions : Fragment() {
} catch (e: HttpException) { } catch (e: HttpException) {
Log.e(TAG, "HttpException, unexpected response") Log.e(TAG, "HttpException, unexpected response")
return@launchWhenCreated return@launchWhenCreated
} finally {
refreshLayout?.isRefreshing = false
} }
if (response.isNotEmpty()){ if (response.isNotEmpty()){
channelRecView?.adapter=SubscriptionChannelAdapter(response.toMutableList()) channelRecView?.adapter=SubscriptionChannelAdapter(response.toMutableList())
@ -131,4 +149,4 @@ class Subscriptions : Fragment() {
super.onDestroy() super.onDestroy()
} }
} }

View File

@ -4,22 +4,21 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context=".Subscriptions"> tools:context=".Subscriptions">
<ProgressBar <ProgressBar
android:id="@+id/sub_progress" android:id="@+id/sub_progress"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" android:layout_centerHorizontal="true"
android:visibility="gone" android:layout_centerVertical="true"
/> android:visibility="gone" />
<RelativeLayout <RelativeLayout
android:id="@+id/loginOrRegister" android:id="@+id/loginOrRegister"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" android:layout_centerHorizontal="true"
> android:layout_centerVertical="true">
<ImageView <ImageView
android:id="@+id/boogh" android:id="@+id/boogh"
@ -40,36 +39,46 @@
android:textSize="20sp" android:textSize="20sp"
android:textStyle="bold" /> android:textStyle="bold" />
</RelativeLayout> </RelativeLayout>
<ScrollView
android:id="@+id/scrollview_sub" <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/sub_refresh"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<LinearLayout
<ScrollView
android:id="@+id/scrollview_sub"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent">
android:orientation="vertical">
<RelativeLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:descendantFocusability="blocksDescendants"> android:orientation="vertical">
<androidx.recyclerview.widget.RecyclerView <RelativeLayout
android:id="@+id/sub_channels"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:nestedScrollingEnabled="false" /> android:descendantFocusability="blocksDescendants">
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:descendantFocusability="blocksDescendants">
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/sub_feed" android:id="@+id/sub_channels"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:nestedScrollingEnabled="false" />
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="wrap_content"
android:nestedScrollingEnabled="false" /> android:descendantFocusability="blocksDescendants">
</RelativeLayout>
</LinearLayout> <androidx.recyclerview.widget.RecyclerView
</ScrollView> android:id="@+id/sub_feed"
</RelativeLayout> android:layout_width="match_parent"
android:layout_height="match_parent"
android:nestedScrollingEnabled="false" />
</RelativeLayout>
</LinearLayout>
</ScrollView>
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
</RelativeLayout>