2020-03-21 18:12:00 +01:00
|
|
|
package com.h.pixeldroid.fragments.feeds
|
|
|
|
|
2020-04-02 19:57:07 +02:00
|
|
|
import android.graphics.Color
|
|
|
|
import android.graphics.drawable.ColorDrawable
|
|
|
|
import android.graphics.drawable.Drawable
|
2020-03-21 18:12:00 +01:00
|
|
|
import android.os.Bundle
|
|
|
|
import android.view.LayoutInflater
|
|
|
|
import android.view.View
|
|
|
|
import android.view.ViewGroup
|
2020-04-02 19:57:07 +02:00
|
|
|
import android.widget.ImageView
|
|
|
|
import android.widget.TextView
|
2020-04-03 09:11:57 +02:00
|
|
|
import androidx.lifecycle.LiveData
|
2020-04-02 19:57:07 +02:00
|
|
|
import androidx.lifecycle.Observer
|
|
|
|
import androidx.paging.LivePagedListBuilder
|
|
|
|
import androidx.paging.PagedList
|
|
|
|
import androidx.recyclerview.widget.RecyclerView
|
|
|
|
import com.bumptech.glide.Glide
|
|
|
|
import com.bumptech.glide.ListPreloader
|
|
|
|
import com.bumptech.glide.RequestBuilder
|
|
|
|
import com.bumptech.glide.integration.recyclerview.RecyclerViewPreloader
|
|
|
|
import com.bumptech.glide.util.ViewPreloadSizeProvider
|
|
|
|
import com.h.pixeldroid.R
|
2020-03-21 18:12:00 +01:00
|
|
|
import com.h.pixeldroid.objects.Status
|
2020-04-02 19:57:07 +02:00
|
|
|
import com.h.pixeldroid.utils.ImageConverter
|
2020-03-21 18:12:00 +01:00
|
|
|
import kotlinx.android.synthetic.main.fragment_home.*
|
2020-04-03 09:11:57 +02:00
|
|
|
import retrofit2.Call
|
2020-03-21 18:12:00 +01:00
|
|
|
|
|
|
|
|
2020-04-02 19:57:07 +02:00
|
|
|
class HomeFragment : FeedFragment<Status, HomeFragment.HomeRecyclerViewAdapter.ViewHolder>() {
|
|
|
|
|
|
|
|
lateinit var picRequest: RequestBuilder<Drawable>
|
|
|
|
|
2020-03-21 18:12:00 +01:00
|
|
|
override fun onCreateView(
|
|
|
|
inflater: LayoutInflater, container: ViewGroup?,
|
|
|
|
savedInstanceState: Bundle?
|
|
|
|
): View? {
|
2020-04-02 19:57:07 +02:00
|
|
|
val view = super.onCreateView(inflater, container, savedInstanceState)
|
|
|
|
|
2020-04-03 09:11:57 +02:00
|
|
|
content = makeContent()
|
2020-04-02 19:57:07 +02:00
|
|
|
|
2020-04-02 22:16:03 +02:00
|
|
|
//RequestBuilder that is re-used for every image
|
2020-04-02 19:57:07 +02:00
|
|
|
picRequest = Glide.with(this)
|
|
|
|
.asDrawable().fitCenter()
|
|
|
|
.placeholder(ColorDrawable(Color.GRAY))
|
|
|
|
|
2020-03-21 18:12:00 +01:00
|
|
|
adapter = HomeRecyclerViewAdapter()
|
|
|
|
list.adapter = adapter
|
2020-04-02 19:57:07 +02:00
|
|
|
|
|
|
|
content.observe(viewLifecycleOwner,
|
2020-04-02 22:16:03 +02:00
|
|
|
Observer { c ->
|
|
|
|
adapter.submitList(c)
|
|
|
|
//after a refresh is done we need to stop the pull to refresh spinner
|
|
|
|
swipeRefreshLayout.isRefreshing = false
|
|
|
|
})
|
2020-04-02 19:57:07 +02:00
|
|
|
|
2020-04-02 22:16:03 +02:00
|
|
|
//Make Glide be aware of the recyclerview and pre-load images
|
2020-04-02 19:57:07 +02:00
|
|
|
val sizeProvider: ListPreloader.PreloadSizeProvider<Status> = ViewPreloadSizeProvider()
|
|
|
|
val preloader: RecyclerViewPreloader<Status> = RecyclerViewPreloader(
|
|
|
|
Glide.with(this), adapter, sizeProvider, 4
|
|
|
|
)
|
|
|
|
list.addOnScrollListener(preloader)
|
|
|
|
|
2020-03-21 18:12:00 +01:00
|
|
|
return view
|
|
|
|
}
|
|
|
|
|
2020-04-03 09:11:57 +02:00
|
|
|
private fun makeContent(): LiveData<PagedList<Status>> {
|
|
|
|
fun makeInitialCall(requestedLoadSize: Int): Call<List<Status>> {
|
|
|
|
return pixelfedAPI
|
|
|
|
.timelineHome("Bearer $accessToken", limit="$requestedLoadSize")
|
|
|
|
}
|
|
|
|
fun makeAfterCall(requestedLoadSize: Int, key: String): Call<List<Status>> {
|
|
|
|
return pixelfedAPI
|
|
|
|
.timelineHome("Bearer $accessToken", max_id=key,
|
|
|
|
limit="$requestedLoadSize")
|
|
|
|
}
|
|
|
|
val config: PagedList.Config = PagedList.Config.Builder().setPageSize(10).build()
|
|
|
|
factory = FeedDataSourceFactory(::makeInitialCall, ::makeAfterCall)
|
|
|
|
return LivePagedListBuilder(factory, config).build()
|
|
|
|
}
|
|
|
|
|
2020-04-02 19:57:07 +02:00
|
|
|
/**
|
|
|
|
* [RecyclerView.Adapter] that can display a list of Statuses
|
|
|
|
*/
|
|
|
|
inner class HomeRecyclerViewAdapter: FeedsRecyclerViewAdapter<Status, HomeRecyclerViewAdapter.ViewHolder>() {
|
|
|
|
|
|
|
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
|
|
|
|
val view = LayoutInflater.from(parent.context)
|
|
|
|
.inflate(R.layout.post_fragment, parent, false)
|
|
|
|
context = view.context
|
|
|
|
return ViewHolder(view)
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Binds the different elements of the Post Model to the view holder
|
|
|
|
*/
|
|
|
|
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
|
|
|
|
val post = getItem(position) ?: return
|
|
|
|
val metrics = context.resources.displayMetrics
|
|
|
|
//Limit the height of the different images
|
2020-04-09 22:36:59 +02:00
|
|
|
holder.profilePic.maxHeight = metrics.heightPixels
|
2020-04-02 19:57:07 +02:00
|
|
|
holder.postPic.maxHeight = metrics.heightPixels
|
|
|
|
|
2020-04-09 22:36:59 +02:00
|
|
|
//Set up the the post
|
|
|
|
post.setupPost(holder.postView, picRequest, holder.postPic, holder.profilePic)
|
2020-04-02 19:57:07 +02:00
|
|
|
|
|
|
|
//Set the image back to a placeholder if the original is too big
|
|
|
|
if(holder.postPic.height > metrics.heightPixels) {
|
|
|
|
ImageConverter.setDefaultImage(holder.postView, holder.postPic)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Represents the posts that will be contained within the feed
|
|
|
|
*/
|
|
|
|
inner class ViewHolder(val postView: View) : RecyclerView.ViewHolder(postView) {
|
2020-04-09 22:36:59 +02:00
|
|
|
val profilePic : ImageView = postView.findViewById(R.id.profilePic)
|
2020-04-02 19:57:07 +02:00
|
|
|
val postPic : ImageView = postView.findViewById(R.id.postPicture)
|
|
|
|
val username : TextView = postView.findViewById(R.id.username)
|
|
|
|
val usernameDesc: TextView = postView.findViewById(R.id.usernameDesc)
|
|
|
|
val description : TextView = postView.findViewById(R.id.description)
|
|
|
|
val nlikes : TextView = postView.findViewById(R.id.nlikes)
|
|
|
|
val nshares : TextView = postView.findViewById(R.id.nshares)
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun getPreloadItems(position: Int): MutableList<Status> {
|
|
|
|
val status = getItem(position) ?: return mutableListOf()
|
|
|
|
return mutableListOf(status)
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun getPreloadRequestBuilder(item: Status): RequestBuilder<*>? {
|
|
|
|
return picRequest.load(item.getPostUrl())
|
|
|
|
}
|
|
|
|
}
|
2020-03-21 18:12:00 +01:00
|
|
|
}
|