PixelDroid-App-Android/app/src/main/java/com/h/pixeldroid/searchDiscover/SearchDiscoverFragment.kt

134 lines
4.8 KiB
Kotlin
Raw Normal View History

package com.h.pixeldroid.searchDiscover
import android.app.SearchManager
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
2020-10-31 11:21:56 +01:00
import androidx.annotation.StringRes
2020-12-29 22:14:32 +01:00
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.h.pixeldroid.R
2021-01-13 22:46:00 +01:00
import com.h.pixeldroid.databinding.FragmentSearchBinding
import com.h.pixeldroid.profile.ProfilePostViewHolder
import com.h.pixeldroid.utils.api.PixelfedAPI
import com.h.pixeldroid.utils.api.objects.Status
import com.h.pixeldroid.posts.PostActivity
import com.h.pixeldroid.utils.BaseFragment
import com.h.pixeldroid.utils.ImageConverter
2021-01-13 22:46:00 +01:00
import com.h.pixeldroid.utils.bindingLifecycleAware
2020-12-29 22:14:32 +01:00
import retrofit2.HttpException
import java.io.IOException
/**
* This fragment lets you search and use Pixelfed's Discover feature
*/
2020-12-11 16:53:12 +01:00
class SearchDiscoverFragment : BaseFragment() {
private lateinit var api: PixelfedAPI
private lateinit var recycler : RecyclerView
private lateinit var adapter : DiscoverRecyclerViewAdapter
2021-01-13 22:46:00 +01:00
var binding: FragmentSearchBinding by bindingLifecycleAware()
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
2021-01-13 22:46:00 +01:00
): View {
binding = FragmentSearchBinding.inflate(inflater, container, false)
2021-01-13 22:46:00 +01:00
// Configure the search widget (see https://developer.android.com/guide/topics/search/search-dialog#ConfiguringWidget)
val searchManager = requireActivity().getSystemService(Context.SEARCH_SERVICE) as SearchManager
2021-01-13 22:46:00 +01:00
binding.search.apply {
setSearchableInfo(searchManager.getSearchableInfo(requireActivity().componentName))
isSubmitButtonEnabled = true
}
// Set posts RecyclerView as a grid with 3 columns
2021-01-13 22:46:00 +01:00
recycler = binding.discoverList
recycler.layoutManager = GridLayoutManager(requireContext(), 3)
adapter = DiscoverRecyclerViewAdapter()
recycler.adapter = adapter
2021-01-13 22:46:00 +01:00
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
api = apiHolder.api ?: apiHolder.setToCurrentUser()
getDiscover()
2021-01-13 22:46:00 +01:00
binding.discoverRefreshLayout.setOnRefreshListener {
getDiscover()
}
}
2020-10-31 11:21:56 +01:00
fun showError(@StringRes errorText: Int = R.string.loading_toast, show: Boolean = true){
2021-01-13 22:46:00 +01:00
binding.motionLayout.apply {
if(show){
transitionToEnd()
} else {
transitionToStart()
}
2020-10-31 11:21:56 +01:00
}
2021-01-13 22:46:00 +01:00
binding.discoverRefreshLayout.isRefreshing = false
binding.discoverProgressBar.visibility = View.GONE
2020-10-31 11:21:56 +01:00
}
private fun getDiscover() {
2020-12-29 22:14:32 +01:00
lifecycleScope.launchWhenCreated {
try {
val discoverPosts = api.discover()
2020-12-29 22:14:32 +01:00
adapter.addPosts(discoverPosts.posts)
showError(show = false)
} catch (exception: IOException) {
showError()
} catch (exception: HttpException) {
showError()
}
}
}
/**
2021-02-09 20:47:04 +01:00
* [RecyclerView.Adapter] that can display a list of [Status]s' thumbnails for the discover view
*/
class DiscoverRecyclerViewAdapter: RecyclerView.Adapter<ProfilePostViewHolder>() {
2021-02-09 20:47:04 +01:00
private val posts: ArrayList<Status> = ArrayList()
2021-02-09 20:47:04 +01:00
fun addPosts(newPosts : List<Status>) {
posts.clear()
posts.addAll(newPosts)
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ProfilePostViewHolder {
val view = LayoutInflater.from(parent.context)
.inflate(R.layout.fragment_profile_posts, parent, false)
return ProfilePostViewHolder(view)
}
override fun onBindViewHolder(holder: ProfilePostViewHolder, position: Int) {
val post = posts[position]
2021-02-09 20:47:04 +01:00
if(post.media_attachments?.size ?: 0 > 1) {
holder.albumIcon.visibility = View.VISIBLE
} else {
holder.albumIcon.visibility = View.GONE
}
2021-02-09 23:28:08 +01:00
ImageConverter.setSquareImageFromURL(holder.postView, post.media_attachments?.firstOrNull()?.preview_url, holder.postPreview, post.media_attachments?.firstOrNull()?.blurhash)
holder.postPreview.setOnClickListener {
val intent = Intent(holder.postView.context, PostActivity::class.java)
2021-02-09 20:47:04 +01:00
intent.putExtra(Status.POST_TAG, post)
holder.postView.context.startActivity(intent)
}
}
override fun getItemCount(): Int = posts.size
}
}