Use Jetpack Compose for interceptor activity

This commit is contained in:
Jobobby04 2022-08-22 12:56:02 -04:00
parent bda2f81c66
commit 9051178701
2 changed files with 60 additions and 80 deletions

View File

@ -2,19 +2,33 @@ package exh.ui.intercept
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.view.MenuItem import androidx.compose.foundation.layout.Arrangement
import androidx.core.view.isVisible import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import eu.kanade.domain.chapter.model.Chapter import eu.kanade.domain.chapter.model.Chapter
import eu.kanade.domain.manga.model.Manga import eu.kanade.domain.manga.model.Manga
import eu.kanade.presentation.components.AppBar
import eu.kanade.presentation.components.Scaffold
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.databinding.EhActivityInterceptBinding
import eu.kanade.tachiyomi.source.online.UrlImportableSource import eu.kanade.tachiyomi.source.online.UrlImportableSource
import eu.kanade.tachiyomi.ui.base.activity.BaseActivity import eu.kanade.tachiyomi.ui.base.activity.BaseActivity
import eu.kanade.tachiyomi.ui.main.MainActivity import eu.kanade.tachiyomi.ui.main.MainActivity
import eu.kanade.tachiyomi.ui.manga.MangaController import eu.kanade.tachiyomi.ui.manga.MangaController
import eu.kanade.tachiyomi.ui.reader.ReaderActivity import eu.kanade.tachiyomi.ui.reader.ReaderActivity
import eu.kanade.tachiyomi.util.view.setComposeContent
import exh.GalleryAddEvent import exh.GalleryAddEvent
import exh.GalleryAdder import exh.GalleryAdder
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@ -27,35 +41,60 @@ import kotlinx.coroutines.launch
class InterceptActivity : BaseActivity() { class InterceptActivity : BaseActivity() {
private var statusJob: Job? = null private var statusJob: Job? = null
lateinit var binding: EhActivityInterceptBinding private val status: MutableStateFlow<InterceptResult> = MutableStateFlow(InterceptResult.Idle)
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
binding = EhActivityInterceptBinding.inflate(layoutInflater) setComposeContent {
setContentView(binding.root) InterceptActivityContent(status.collectAsState().value)
}
// Show back button
setSupportActionBar(binding.toolbar)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
processLink() processLink()
} }
private fun processLink() { @Composable
if (Intent.ACTION_VIEW == intent.action) { private fun InterceptActivityContent(status: InterceptResult) {
binding.interceptProgress.isVisible = true Scaffold(
binding.interceptStatus.setText(R.string.loading_manga) topBar = {
loadGallery(intent.dataString!!) AppBar(
title = stringResource(R.string.app_name),
navigateUp = ::onBackPressed,
)
},
) {
Column(
modifier = Modifier
.fillMaxSize()
.padding(it),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.spacedBy(8.dp, Alignment.CenterVertically),
) {
when (status) {
InterceptResult.Idle, InterceptResult.Loading -> {
Text(
text = stringResource(R.string.loading_manga),
style = MaterialTheme.typography.titleLarge,
)
CircularProgressIndicator(modifier = Modifier.size(56.dp))
}
is InterceptResult.Success -> Text(
text = stringResource(R.string.launching_app),
style = MaterialTheme.typography.titleLarge,
)
is InterceptResult.Failure -> Text(
text = stringResource(R.string.error_with_reason, status.reason),
style = MaterialTheme.typography.titleLarge,
)
}
}
} }
} }
override fun onOptionsItemSelected(item: MenuItem): Boolean { private fun processLink() {
when (item.itemId) { if (Intent.ACTION_VIEW == intent.action) {
android.R.id.home -> onBackPressed() loadGallery(intent.dataString!!)
else -> return super.onOptionsItemSelected(item)
} }
return true
} }
override fun onStart() { override fun onStart() {
@ -65,8 +104,6 @@ class InterceptActivity : BaseActivity() {
.onEach { .onEach {
when (it) { when (it) {
is InterceptResult.Success -> { is InterceptResult.Success -> {
binding.interceptProgress.isVisible = false
binding.interceptStatus.setText(R.string.launching_app)
onBackPressed() onBackPressed()
startActivity( startActivity(
if (it.chapter != null) { if (it.chapter != null) {
@ -80,8 +117,6 @@ class InterceptActivity : BaseActivity() {
) )
} }
is InterceptResult.Failure -> { is InterceptResult.Failure -> {
binding.interceptProgress.isVisible = false
binding.interceptStatus.text = getString(R.string.error_with_reason, it.reason)
MaterialAlertDialogBuilder(this) MaterialAlertDialogBuilder(this)
.setTitle(R.string.chapter_error) .setTitle(R.string.chapter_error)
.setMessage(getString(R.string.could_not_open_manga, it.reason)) .setMessage(getString(R.string.could_not_open_manga, it.reason))
@ -90,8 +125,7 @@ class InterceptActivity : BaseActivity() {
.setOnDismissListener { onBackPressed() } .setOnDismissListener { onBackPressed() }
.show() .show()
} }
InterceptResult.Idle -> Unit else -> Unit
InterceptResult.Loading -> Unit
} }
} }
.launchIn(lifecycleScope) .launchIn(lifecycleScope)
@ -104,8 +138,6 @@ class InterceptActivity : BaseActivity() {
private val galleryAdder = GalleryAdder() private val galleryAdder = GalleryAdder()
val status: MutableStateFlow<InterceptResult> = MutableStateFlow(InterceptResult.Idle)
@Synchronized @Synchronized
fun loadGallery(gallery: String) { fun loadGallery(gallery: String) {
// Do not load gallery if already loading // Do not load gallery if already loading
@ -126,7 +158,6 @@ class InterceptActivity : BaseActivity() {
} }
} }
@Synchronized
private fun loadGalleryEnd(gallery: String, source: UrlImportableSource? = null) { private fun loadGalleryEnd(gallery: String, source: UrlImportableSource? = null) {
// Load gallery async // Load gallery async
lifecycleScope.launch(Dispatchers.IO) { lifecycleScope.launch(Dispatchers.IO) {

View File

@ -1,51 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.google.android.material.appbar.TachiyomiAppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:elevation="0dp">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:theme="?attr/actionBarTheme"/>
</com.google.android.material.appbar.TachiyomiAppBarLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:gravity="center"
android:orientation="vertical">
<TextView
android:id="@+id/intercept_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:text="@string/loading_manga"
android:textAppearance="?attr/textAppearanceTitleLarge" />
<com.google.android.material.progressindicator.CircularProgressIndicator
android:id="@+id/intercept_progress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:indeterminate="true"
app:indicatorSize="56dp"/>
</LinearLayout>
</LinearLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>