Add comments, clean up
This commit is contained in:
parent
5f349e1cfd
commit
1a684b7a47
@ -10,7 +10,6 @@ import android.view.ViewGroup
|
|||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.lifecycle.LiveData
|
import androidx.lifecycle.LiveData
|
||||||
import androidx.paging.DataSource
|
|
||||||
import androidx.paging.ItemKeyedDataSource
|
import androidx.paging.ItemKeyedDataSource
|
||||||
import androidx.paging.PagedList
|
import androidx.paging.PagedList
|
||||||
import androidx.paging.PagedListAdapter
|
import androidx.paging.PagedListAdapter
|
||||||
@ -23,10 +22,8 @@ import com.h.pixeldroid.BuildConfig
|
|||||||
import com.h.pixeldroid.R
|
import com.h.pixeldroid.R
|
||||||
import com.h.pixeldroid.api.PixelfedAPI
|
import com.h.pixeldroid.api.PixelfedAPI
|
||||||
import com.h.pixeldroid.objects.FeedContent
|
import com.h.pixeldroid.objects.FeedContent
|
||||||
import com.h.pixeldroid.objects.Notification
|
|
||||||
import kotlinx.android.synthetic.main.fragment_feed.*
|
import kotlinx.android.synthetic.main.fragment_feed.*
|
||||||
import kotlinx.android.synthetic.main.fragment_feed.view.*
|
import kotlinx.android.synthetic.main.fragment_feed.view.*
|
||||||
import kotlinx.android.synthetic.main.fragment_feed.view.progressBar
|
|
||||||
import retrofit2.Call
|
import retrofit2.Call
|
||||||
import retrofit2.Callback
|
import retrofit2.Callback
|
||||||
import retrofit2.Response
|
import retrofit2.Response
|
||||||
@ -105,19 +102,6 @@ abstract class FeedsRecyclerViewAdapter<T: FeedContent, VH : RecyclerView.ViewHo
|
|||||||
}
|
}
|
||||||
), PreloadModelProvider<T> {
|
), PreloadModelProvider<T> {
|
||||||
|
|
||||||
protected val feedContent: ArrayList<T> = arrayListOf()
|
|
||||||
protected lateinit var context: Context
|
protected lateinit var context: Context
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
abstract class FeedDataSource: ItemKeyedDataSource<String, FeedContent>() {
|
|
||||||
|
|
||||||
override fun getKey(item: FeedContent): String {
|
|
||||||
return item.id
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
abstract class FeedDataSourceFactory: DataSource.Factory<String, FeedContent>()
|
|
@ -9,6 +9,7 @@ import android.view.View
|
|||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.widget.ImageView
|
import android.widget.ImageView
|
||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
|
import androidx.lifecycle.MutableLiveData
|
||||||
import androidx.lifecycle.Observer
|
import androidx.lifecycle.Observer
|
||||||
import androidx.paging.DataSource
|
import androidx.paging.DataSource
|
||||||
import androidx.paging.ItemKeyedDataSource
|
import androidx.paging.ItemKeyedDataSource
|
||||||
@ -29,6 +30,7 @@ import kotlinx.android.synthetic.main.fragment_home.*
|
|||||||
class HomeFragment : FeedFragment<Status, HomeFragment.HomeRecyclerViewAdapter.ViewHolder>() {
|
class HomeFragment : FeedFragment<Status, HomeFragment.HomeRecyclerViewAdapter.ViewHolder>() {
|
||||||
|
|
||||||
lateinit var picRequest: RequestBuilder<Drawable>
|
lateinit var picRequest: RequestBuilder<Drawable>
|
||||||
|
lateinit var factory: HomeDataSourceFactory
|
||||||
|
|
||||||
|
|
||||||
override fun onCreateView(
|
override fun onCreateView(
|
||||||
@ -38,10 +40,10 @@ class HomeFragment : FeedFragment<Status, HomeFragment.HomeRecyclerViewAdapter.V
|
|||||||
val view = super.onCreateView(inflater, container, savedInstanceState)
|
val view = super.onCreateView(inflater, container, savedInstanceState)
|
||||||
|
|
||||||
val config: PagedList.Config = PagedList.Config.Builder().setPageSize(10).build()
|
val config: PagedList.Config = PagedList.Config.Builder().setPageSize(10).build()
|
||||||
val factory = HomeDataSourceFactory()
|
factory = HomeDataSourceFactory()
|
||||||
|
|
||||||
content = LivePagedListBuilder(factory, config).build()
|
content = LivePagedListBuilder(factory, config).build()
|
||||||
|
|
||||||
|
//RequestBuilder that is re-used for every image
|
||||||
picRequest = Glide.with(this)
|
picRequest = Glide.with(this)
|
||||||
.asDrawable().fitCenter()
|
.asDrawable().fitCenter()
|
||||||
.placeholder(ColorDrawable(Color.GRAY))
|
.placeholder(ColorDrawable(Color.GRAY))
|
||||||
@ -50,8 +52,13 @@ class HomeFragment : FeedFragment<Status, HomeFragment.HomeRecyclerViewAdapter.V
|
|||||||
list.adapter = adapter
|
list.adapter = adapter
|
||||||
|
|
||||||
content.observe(viewLifecycleOwner,
|
content.observe(viewLifecycleOwner,
|
||||||
Observer { c -> adapter.submitList(c); })
|
Observer { c ->
|
||||||
|
adapter.submitList(c)
|
||||||
|
//after a refresh is done we need to stop the pull to refresh spinner
|
||||||
|
swipeRefreshLayout.isRefreshing = false
|
||||||
|
})
|
||||||
|
|
||||||
|
//Make Glide be aware of the recyclerview and pre-load images
|
||||||
val sizeProvider: ListPreloader.PreloadSizeProvider<Status> = ViewPreloadSizeProvider()
|
val sizeProvider: ListPreloader.PreloadSizeProvider<Status> = ViewPreloadSizeProvider()
|
||||||
val preloader: RecyclerViewPreloader<Status> = RecyclerViewPreloader(
|
val preloader: RecyclerViewPreloader<Status> = RecyclerViewPreloader(
|
||||||
Glide.with(this), adapter, sizeProvider, 4
|
Glide.with(this), adapter, sizeProvider, 4
|
||||||
@ -64,10 +71,9 @@ class HomeFragment : FeedFragment<Status, HomeFragment.HomeRecyclerViewAdapter.V
|
|||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
super.onViewCreated(view, savedInstanceState)
|
super.onViewCreated(view, savedInstanceState)
|
||||||
|
|
||||||
|
|
||||||
swipeRefreshLayout.setOnRefreshListener {
|
swipeRefreshLayout.setOnRefreshListener {
|
||||||
val call = pixelfedAPI.timelineHome("Bearer $accessToken", limit = "20")
|
//by invalidating data, loadInitial will be called again
|
||||||
//TODO
|
factory.postLiveData.value!!.invalidate()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -137,9 +143,11 @@ class HomeFragment : FeedFragment<Status, HomeFragment.HomeRecyclerViewAdapter.V
|
|||||||
|
|
||||||
inner class HomeDataSource: ItemKeyedDataSource<String, Status>() {
|
inner class HomeDataSource: ItemKeyedDataSource<String, Status>() {
|
||||||
|
|
||||||
|
//We use the id as the key
|
||||||
override fun getKey(item: Status): String {
|
override fun getKey(item: Status): String {
|
||||||
return item.id
|
return item.id
|
||||||
}
|
}
|
||||||
|
//This is called to initialize the list, so we want some of the latest statuses
|
||||||
override fun loadInitial(
|
override fun loadInitial(
|
||||||
params: LoadInitialParams<String>,
|
params: LoadInitialParams<String>,
|
||||||
callback: LoadInitialCallback<Status>
|
callback: LoadInitialCallback<Status>
|
||||||
@ -149,6 +157,8 @@ class HomeFragment : FeedFragment<Status, HomeFragment.HomeRecyclerViewAdapter.V
|
|||||||
enqueueCall(call, callback)
|
enqueueCall(call, callback)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//This is called to when we get to the bottom of the loaded content, so we want statuses
|
||||||
|
//older than the given key (params.key)
|
||||||
override fun loadAfter(params: LoadParams<String>, callback: LoadCallback<Status>) {
|
override fun loadAfter(params: LoadParams<String>, callback: LoadCallback<Status>) {
|
||||||
val call = pixelfedAPI
|
val call = pixelfedAPI
|
||||||
.timelineHome("Bearer $accessToken", max_id=params.key,
|
.timelineHome("Bearer $accessToken", max_id=params.key,
|
||||||
@ -157,13 +167,19 @@ class HomeFragment : FeedFragment<Status, HomeFragment.HomeRecyclerViewAdapter.V
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun loadBefore(params: LoadParams<String>, callback: LoadCallback<Status>) {
|
override fun loadBefore(params: LoadParams<String>, callback: LoadCallback<Status>) {
|
||||||
//do nothing here, it is expected to pull to refresh to load newer notifications
|
//do nothing here, it is expected to pull to refresh to load newer content
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
inner class HomeDataSourceFactory: DataSource.Factory<String, Status>() {
|
inner class HomeDataSourceFactory: DataSource.Factory<String, Status>() {
|
||||||
|
|
||||||
|
lateinit var postLiveData: MutableLiveData<HomeDataSource>
|
||||||
|
|
||||||
override fun create(): DataSource<String, Status> {
|
override fun create(): DataSource<String, Status> {
|
||||||
return HomeDataSource()
|
val dataSource = HomeDataSource()
|
||||||
|
postLiveData = MutableLiveData()
|
||||||
|
postLiveData.postValue(dataSource)
|
||||||
|
return dataSource
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -5,13 +5,13 @@ import android.content.Intent
|
|||||||
import android.graphics.drawable.Drawable
|
import android.graphics.drawable.Drawable
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.util.Log
|
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.widget.ImageView
|
import android.widget.ImageView
|
||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
|
import androidx.lifecycle.MutableLiveData
|
||||||
import androidx.lifecycle.Observer
|
import androidx.lifecycle.Observer
|
||||||
import androidx.paging.DataSource
|
import androidx.paging.DataSource
|
||||||
import androidx.paging.ItemKeyedDataSource
|
import androidx.paging.ItemKeyedDataSource
|
||||||
@ -29,10 +29,9 @@ import com.h.pixeldroid.R
|
|||||||
import com.h.pixeldroid.objects.Notification
|
import com.h.pixeldroid.objects.Notification
|
||||||
import com.h.pixeldroid.objects.Status
|
import com.h.pixeldroid.objects.Status
|
||||||
import kotlinx.android.synthetic.main.fragment_feed.*
|
import kotlinx.android.synthetic.main.fragment_feed.*
|
||||||
|
import kotlinx.android.synthetic.main.fragment_feed.swipeRefreshLayout
|
||||||
|
import kotlinx.android.synthetic.main.fragment_home.*
|
||||||
import kotlinx.android.synthetic.main.fragment_notifications.view.*
|
import kotlinx.android.synthetic.main.fragment_notifications.view.*
|
||||||
import retrofit2.Call
|
|
||||||
import retrofit2.Callback
|
|
||||||
import retrofit2.Response
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A fragment representing a list of Items.
|
* A fragment representing a list of Items.
|
||||||
@ -40,6 +39,8 @@ import retrofit2.Response
|
|||||||
class NotificationsFragment : FeedFragment<Notification, NotificationsFragment.NotificationsRecyclerViewAdapter.ViewHolder>() {
|
class NotificationsFragment : FeedFragment<Notification, NotificationsFragment.NotificationsRecyclerViewAdapter.ViewHolder>() {
|
||||||
|
|
||||||
lateinit var profilePicRequest: RequestBuilder<Drawable>
|
lateinit var profilePicRequest: RequestBuilder<Drawable>
|
||||||
|
lateinit var factory: NotificationsDataSourceFactory
|
||||||
|
|
||||||
|
|
||||||
override fun onCreateView(
|
override fun onCreateView(
|
||||||
inflater: LayoutInflater, container: ViewGroup?,
|
inflater: LayoutInflater, container: ViewGroup?,
|
||||||
@ -49,10 +50,10 @@ class NotificationsFragment : FeedFragment<Notification, NotificationsFragment.N
|
|||||||
val view = super.onCreateView(inflater, container, savedInstanceState)
|
val view = super.onCreateView(inflater, container, savedInstanceState)
|
||||||
|
|
||||||
val config: PagedList.Config = PagedList.Config.Builder().setPageSize(10).build()
|
val config: PagedList.Config = PagedList.Config.Builder().setPageSize(10).build()
|
||||||
val factory = NotificationsDataSourceFactory()
|
factory = NotificationsDataSourceFactory()
|
||||||
|
|
||||||
content = LivePagedListBuilder(factory, config).build()
|
content = LivePagedListBuilder(factory, config).build()
|
||||||
|
|
||||||
|
//RequestBuilder that is re-used for every image
|
||||||
profilePicRequest = Glide.with(this)
|
profilePicRequest = Glide.with(this)
|
||||||
.asDrawable().apply(RequestOptions().circleCrop())
|
.asDrawable().apply(RequestOptions().circleCrop())
|
||||||
.placeholder(R.drawable.ic_default_user)
|
.placeholder(R.drawable.ic_default_user)
|
||||||
@ -61,8 +62,13 @@ class NotificationsFragment : FeedFragment<Notification, NotificationsFragment.N
|
|||||||
list.adapter = adapter
|
list.adapter = adapter
|
||||||
|
|
||||||
content.observe(viewLifecycleOwner,
|
content.observe(viewLifecycleOwner,
|
||||||
Observer { c -> adapter.submitList(c); })
|
Observer { c ->
|
||||||
|
adapter.submitList(c)
|
||||||
|
//after a refresh is done we need to stop the pull to refresh spinner
|
||||||
|
swipeRefreshLayout.isRefreshing = false
|
||||||
|
})
|
||||||
|
|
||||||
|
//Make Glide be aware of the recyclerview and pre-load images
|
||||||
val sizeProvider: ListPreloader.PreloadSizeProvider<Notification> = ViewPreloadSizeProvider()
|
val sizeProvider: ListPreloader.PreloadSizeProvider<Notification> = ViewPreloadSizeProvider()
|
||||||
val preloader: RecyclerViewPreloader<Notification> = RecyclerViewPreloader(
|
val preloader: RecyclerViewPreloader<Notification> = RecyclerViewPreloader(
|
||||||
Glide.with(this), adapter, sizeProvider, 4
|
Glide.with(this), adapter, sizeProvider, 4
|
||||||
@ -77,8 +83,7 @@ class NotificationsFragment : FeedFragment<Notification, NotificationsFragment.N
|
|||||||
|
|
||||||
|
|
||||||
swipeRefreshLayout.setOnRefreshListener {
|
swipeRefreshLayout.setOnRefreshListener {
|
||||||
val call = pixelfedAPI.notifications("Bearer $accessToken", min_id="1")
|
factory.notificationsLiveData.value!!.invalidate()
|
||||||
//TODO
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -193,9 +198,11 @@ class NotificationsFragment : FeedFragment<Notification, NotificationsFragment.N
|
|||||||
|
|
||||||
inner class NotificationsDataSource: ItemKeyedDataSource<String, Notification>() {
|
inner class NotificationsDataSource: ItemKeyedDataSource<String, Notification>() {
|
||||||
|
|
||||||
|
//We use the id as the key
|
||||||
override fun getKey(item: Notification): String {
|
override fun getKey(item: Notification): String {
|
||||||
return item.id
|
return item.id
|
||||||
}
|
}
|
||||||
|
//This is called to initialize the list, so we want some of the latest statuses
|
||||||
override fun loadInitial(
|
override fun loadInitial(
|
||||||
params: LoadInitialParams<String>,
|
params: LoadInitialParams<String>,
|
||||||
callback: LoadInitialCallback<Notification>
|
callback: LoadInitialCallback<Notification>
|
||||||
@ -204,7 +211,8 @@ class NotificationsFragment : FeedFragment<Notification, NotificationsFragment.N
|
|||||||
.notifications("Bearer $accessToken", min_id="1", limit="${params.requestedLoadSize}")
|
.notifications("Bearer $accessToken", min_id="1", limit="${params.requestedLoadSize}")
|
||||||
enqueueCall(call, callback)
|
enqueueCall(call, callback)
|
||||||
}
|
}
|
||||||
|
//This is called to when we get to the bottom of the loaded content, so we want statuses
|
||||||
|
//older than the given key (params.key)
|
||||||
override fun loadAfter(params: LoadParams<String>, callback: LoadCallback<Notification>) {
|
override fun loadAfter(params: LoadParams<String>, callback: LoadCallback<Notification>) {
|
||||||
val call = pixelfedAPI
|
val call = pixelfedAPI
|
||||||
.notifications("Bearer $accessToken", max_id=params.key, limit="${params.requestedLoadSize}")
|
.notifications("Bearer $accessToken", max_id=params.key, limit="${params.requestedLoadSize}")
|
||||||
@ -218,8 +226,13 @@ class NotificationsFragment : FeedFragment<Notification, NotificationsFragment.N
|
|||||||
|
|
||||||
}
|
}
|
||||||
inner class NotificationsDataSourceFactory: DataSource.Factory<String, Notification>() {
|
inner class NotificationsDataSourceFactory: DataSource.Factory<String, Notification>() {
|
||||||
|
lateinit var notificationsLiveData: MutableLiveData<NotificationsDataSource>
|
||||||
|
|
||||||
override fun create(): DataSource<String, Notification> {
|
override fun create(): DataSource<String, Notification> {
|
||||||
return NotificationsDataSource()
|
val dataSource = NotificationsDataSource()
|
||||||
|
notificationsLiveData = MutableLiveData()
|
||||||
|
notificationsLiveData.postValue(dataSource)
|
||||||
|
return dataSource
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user