package ani.dantotsu.media import android.annotation.SuppressLint import android.content.Intent import android.os.Bundle import android.text.SpannableString import android.view.MotionEvent import android.view.View import android.view.ViewGroup import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat import androidx.core.view.isVisible import androidx.core.view.updateLayoutParams import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager import ani.dantotsu.R import ani.dantotsu.connections.anilist.Anilist import ani.dantotsu.connections.anilist.api.Query import ani.dantotsu.databinding.ActivityFollowBinding import ani.dantotsu.initActivity import ani.dantotsu.navBarHeight import ani.dantotsu.profile.FollowerItem import ani.dantotsu.statusBarHeight import ani.dantotsu.themes.ThemeManager import ani.dantotsu.util.MarkdownCreatorActivity import com.xwray.groupie.GroupieAdapter import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext class ReviewActivity : AppCompatActivity() { private lateinit var binding: ActivityFollowBinding val adapter = GroupieAdapter() private val reviews = mutableListOf() var mediaId = 0 private var currentPage: Int = 1 private var hasNextPage: Boolean = true @SuppressLint("ClickableViewAccessibility") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) ThemeManager(this).applyTheme() initActivity(this) binding = ActivityFollowBinding.inflate(layoutInflater) binding.listToolbar.updateLayoutParams { topMargin = statusBarHeight } binding.listFrameLayout.updateLayoutParams { bottomMargin = navBarHeight } setContentView(binding.root) mediaId = intent.getIntExtra("mediaId", -1) if (mediaId == -1) { finish() return } binding.followerGrid.visibility = View.GONE binding.followerList.visibility = View.GONE binding.followFilterButton.setImageResource(R.drawable.ic_add) binding.followFilterButton.setOnClickListener { ContextCompat.startActivity( this, Intent(this, MarkdownCreatorActivity::class.java) .putExtra("type", "review"), null ) } binding.followFilterButton.visibility = View.GONE binding.listTitle.text = getString(R.string.reviews) binding.listRecyclerView.adapter = adapter binding.listRecyclerView.layoutManager = LinearLayoutManager( this, LinearLayoutManager.VERTICAL, false ) binding.listProgressBar.visibility = View.VISIBLE binding.listBack.setOnClickListener { onBackPressedDispatcher.onBackPressed() } lifecycleScope.launch(Dispatchers.IO) { val response = Anilist.query.getReviews(mediaId) withContext(Dispatchers.Main) { binding.listProgressBar.visibility = View.GONE binding.listRecyclerView.setOnTouchListener { _, event -> if (event?.action == MotionEvent.ACTION_UP) { if (hasNextPage && !binding.listRecyclerView.canScrollVertically(1) && !binding.followRefresh.isVisible && binding.listRecyclerView.adapter!!.itemCount != 0 && (binding.listRecyclerView.layoutManager as LinearLayoutManager).findLastVisibleItemPosition() == (binding.listRecyclerView.adapter!!.itemCount - 1) ) { binding.followRefresh.visibility = ViewGroup.VISIBLE loadPage(++currentPage) { binding.followRefresh.visibility = ViewGroup.GONE } } } false } currentPage = response?.data?.page?.pageInfo?.currentPage ?: 1 hasNextPage = response?.data?.page?.pageInfo?.hasNextPage ?: false response?.data?.page?.reviews?.let { reviews.addAll(it) fillList() } } } } private fun loadPage(page: Int, callback: () -> Unit) { lifecycleScope.launch(Dispatchers.IO) { val response = Anilist.query.getReviews(mediaId, page) currentPage = response?.data?.page?.pageInfo?.currentPage ?: 1 hasNextPage = response?.data?.page?.pageInfo?.hasNextPage ?: false withContext(Dispatchers.Main) { response?.data?.page?.reviews?.let { reviews.addAll(it) fillList() } callback() } } } private fun fillList() { adapter.clear() reviews.forEach { val username = it.user?.name ?: "Unknown" val name = SpannableString(username + " - " + it.score) //change the size of the score name.setSpan( android.text.style.RelativeSizeSpan(0.9f), 0, name.length, android.text.Spannable.SPAN_EXCLUSIVE_EXCLUSIVE ) //give the text an underline name.setSpan( android.text.style.UnderlineSpan(), username.length + 3, name.length, android.text.Spannable.SPAN_EXCLUSIVE_EXCLUSIVE ) adapter.add( FollowerItem( it.id, name, it.user?.avatar?.medium, it.user?.bannerImage, it.summary, this::onUserClick ) ) } } private fun onUserClick(userId: Int) { val review = reviews.find { it.id == userId } if (review != null) { startActivity(Intent(this, ReviewViewActivity::class.java).putExtra("review", review)) } } }