2020-04-30 17:54:21 +02:00
|
|
|
package com.h.pixeldroid.fragments
|
|
|
|
|
2020-10-04 23:27:06 +02:00
|
|
|
import android.app.SearchManager
|
|
|
|
import android.content.Context
|
2020-04-30 17:54:21 +02:00
|
|
|
import android.content.Intent
|
|
|
|
import android.os.Bundle
|
2020-05-03 14:30:01 +02:00
|
|
|
import android.util.Log
|
2020-04-30 17:54:21 +02:00
|
|
|
import android.view.LayoutInflater
|
|
|
|
import android.view.View
|
|
|
|
import android.view.ViewGroup
|
2020-10-04 23:27:06 +02:00
|
|
|
import android.widget.*
|
|
|
|
import androidx.appcompat.widget.SearchView
|
|
|
|
import androidx.core.content.ContextCompat.getSystemService
|
2020-04-30 17:54:21 +02:00
|
|
|
import androidx.fragment.app.Fragment
|
2020-05-03 14:30:01 +02:00
|
|
|
import androidx.recyclerview.widget.GridLayoutManager
|
|
|
|
import androidx.recyclerview.widget.RecyclerView
|
|
|
|
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
|
2020-10-04 23:27:06 +02:00
|
|
|
import com.google.android.material.textview.MaterialTextView
|
2020-07-26 20:56:01 +02:00
|
|
|
import com.h.pixeldroid.Pixeldroid
|
2020-05-03 14:30:01 +02:00
|
|
|
import com.h.pixeldroid.PostActivity
|
2020-04-30 17:54:21 +02:00
|
|
|
import com.h.pixeldroid.R
|
|
|
|
import com.h.pixeldroid.SearchActivity
|
|
|
|
import com.h.pixeldroid.api.PixelfedAPI
|
2020-07-26 20:56:01 +02:00
|
|
|
import com.h.pixeldroid.db.AppDatabase
|
|
|
|
import com.h.pixeldroid.di.PixelfedAPIHolder
|
2020-05-03 14:30:01 +02:00
|
|
|
import com.h.pixeldroid.objects.DiscoverPost
|
|
|
|
import com.h.pixeldroid.objects.DiscoverPosts
|
|
|
|
import com.h.pixeldroid.objects.Status
|
2020-05-19 09:49:34 +02:00
|
|
|
import com.h.pixeldroid.utils.DBUtils
|
2020-05-03 14:30:01 +02:00
|
|
|
import com.h.pixeldroid.utils.ImageConverter
|
2020-10-04 23:27:06 +02:00
|
|
|
import com.mikepenz.iconics.IconicsDrawable
|
|
|
|
import com.mikepenz.iconics.typeface.library.googlematerial.GoogleMaterial
|
|
|
|
import com.mikepenz.iconics.utils.padding
|
|
|
|
import com.mikepenz.iconics.utils.paddingDp
|
|
|
|
import com.mikepenz.iconics.utils.sizeDp
|
|
|
|
import kotlinx.android.synthetic.main.fragment_search.*
|
2020-05-03 14:30:01 +02:00
|
|
|
import retrofit2.Call
|
|
|
|
import retrofit2.Callback
|
|
|
|
import retrofit2.Response
|
2020-07-26 20:56:01 +02:00
|
|
|
import javax.inject.Inject
|
2020-04-30 17:54:21 +02:00
|
|
|
|
|
|
|
/**
|
2020-05-03 14:30:01 +02:00
|
|
|
* This fragment lets you search and use Pixelfed's Discover feature
|
2020-04-30 17:54:21 +02:00
|
|
|
*/
|
|
|
|
|
|
|
|
class SearchDiscoverFragment : Fragment() {
|
2020-05-03 14:30:01 +02:00
|
|
|
private lateinit var api: PixelfedAPI
|
|
|
|
private lateinit var recycler : RecyclerView
|
|
|
|
private lateinit var adapter : DiscoverRecyclerViewAdapter
|
2020-04-30 17:54:21 +02:00
|
|
|
private lateinit var accessToken: String
|
2020-05-03 14:30:01 +02:00
|
|
|
private lateinit var discoverProgressBar: ProgressBar
|
|
|
|
private lateinit var discoverRefreshLayout: SwipeRefreshLayout
|
2020-07-26 20:56:01 +02:00
|
|
|
@Inject
|
|
|
|
lateinit var db: AppDatabase
|
|
|
|
|
|
|
|
@Inject
|
|
|
|
lateinit var apiHolder: PixelfedAPIHolder
|
|
|
|
|
2020-05-03 14:30:01 +02:00
|
|
|
|
2020-04-30 17:54:21 +02:00
|
|
|
|
|
|
|
override fun onCreateView(
|
|
|
|
inflater: LayoutInflater, container: ViewGroup?,
|
|
|
|
savedInstanceState: Bundle?
|
|
|
|
): View? {
|
|
|
|
val view = inflater.inflate(R.layout.fragment_search, container, false)
|
2020-10-04 23:27:06 +02:00
|
|
|
val search = view.findViewById<SearchView>(R.id.search)
|
2020-07-26 20:56:01 +02:00
|
|
|
|
|
|
|
(requireActivity().application as Pixeldroid).getAppComponent().inject(this)
|
|
|
|
|
2020-10-04 23:27:06 +02: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
|
|
|
|
search.setSearchableInfo(searchManager.getSearchableInfo(requireActivity().componentName))
|
|
|
|
|
|
|
|
search.isSubmitButtonEnabled = true
|
|
|
|
|
2020-05-03 14:30:01 +02:00
|
|
|
// Set posts RecyclerView as a grid with 3 columns
|
|
|
|
recycler = view.findViewById(R.id.discoverList)
|
|
|
|
recycler.layoutManager = GridLayoutManager(requireContext(), 3)
|
|
|
|
adapter = DiscoverRecyclerViewAdapter()
|
|
|
|
recycler.adapter = adapter
|
2020-04-30 17:54:21 +02:00
|
|
|
|
2020-10-04 23:27:06 +02:00
|
|
|
val discoverText = view.findViewById<TextView>(R.id.discoverText)
|
|
|
|
|
|
|
|
discoverText.setCompoundDrawables(IconicsDrawable(requireContext(), GoogleMaterial.Icon.gmd_explore).apply {
|
|
|
|
sizeDp = 24
|
|
|
|
paddingDp = 20
|
|
|
|
}, null, null, null)
|
|
|
|
|
2020-04-30 17:54:21 +02:00
|
|
|
return view
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
|
|
|
super.onViewCreated(view, savedInstanceState)
|
2020-05-19 09:49:34 +02:00
|
|
|
|
2020-07-26 20:56:01 +02:00
|
|
|
api = apiHolder.api ?: apiHolder.setDomainToCurrentUser(db)
|
2020-05-19 09:49:34 +02:00
|
|
|
|
2020-07-26 20:56:01 +02:00
|
|
|
accessToken = db.userDao().getActiveUser()?.accessToken.orEmpty()
|
2020-04-30 17:54:21 +02:00
|
|
|
|
2020-05-03 14:30:01 +02:00
|
|
|
discoverProgressBar = view.findViewById(R.id.discoverProgressBar)
|
|
|
|
discoverRefreshLayout = view.findViewById(R.id.discoverRefreshLayout)
|
|
|
|
|
|
|
|
getDiscover()
|
|
|
|
|
|
|
|
discoverRefreshLayout.setOnRefreshListener {
|
|
|
|
getDiscover()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private fun getDiscover() {
|
|
|
|
|
|
|
|
api.discover("Bearer $accessToken")
|
|
|
|
.enqueue(object : Callback<DiscoverPosts> {
|
|
|
|
|
|
|
|
override fun onFailure(call: Call<DiscoverPosts>, t: Throwable) {
|
|
|
|
Log.e("SearchDiscoverFragment:", t.toString())
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onResponse(call: Call<DiscoverPosts>, response: Response<DiscoverPosts>) {
|
|
|
|
if(response.code() == 200) {
|
|
|
|
val discoverPosts = response.body()!!
|
|
|
|
adapter.addPosts(discoverPosts.posts)
|
|
|
|
discoverProgressBar.visibility = View.GONE
|
|
|
|
discoverRefreshLayout.isRefreshing = false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
/**
|
|
|
|
* [RecyclerView.Adapter] that can display a list of [DiscoverPost]s
|
|
|
|
*/
|
|
|
|
class DiscoverRecyclerViewAdapter: RecyclerView.Adapter<DiscoverRecyclerViewAdapter.ViewHolder>() {
|
|
|
|
private val posts: ArrayList<DiscoverPost> = ArrayList()
|
|
|
|
|
|
|
|
fun addPosts(newPosts : List<DiscoverPost>) {
|
|
|
|
posts.clear()
|
|
|
|
posts.addAll(newPosts)
|
|
|
|
notifyDataSetChanged()
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
|
|
|
|
val view = LayoutInflater.from(parent.context)
|
|
|
|
.inflate(R.layout.fragment_profile_posts, parent, false)
|
|
|
|
return ViewHolder(view)
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
|
|
|
|
val post = posts[position]
|
|
|
|
ImageConverter.setSquareImageFromURL(holder.postView, post.thumb, holder.postPreview)
|
|
|
|
holder.postPreview.setOnClickListener {
|
|
|
|
val intent = Intent(holder.postView.context, PostActivity::class.java)
|
|
|
|
intent.putExtra(Status.DISCOVER_TAG, post)
|
|
|
|
holder.postView.context.startActivity(intent)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun getItemCount(): Int = posts.size
|
|
|
|
|
|
|
|
inner class ViewHolder(val postView: View) : RecyclerView.ViewHolder(postView) {
|
|
|
|
val postPreview: ImageView = postView.findViewById(R.id.postPreview)
|
|
|
|
}
|
2020-04-30 17:54:21 +02:00
|
|
|
}
|
|
|
|
}
|