Refactor and cleanup
This commit is contained in:
@@ -16,8 +16,8 @@ android {
|
|||||||
applicationId 'org.koitharu.kotatsu'
|
applicationId 'org.koitharu.kotatsu'
|
||||||
minSdk = 21
|
minSdk = 21
|
||||||
targetSdk = 35
|
targetSdk = 35
|
||||||
versionCode = 659
|
versionCode = 660
|
||||||
versionName = '7.4.2'
|
versionName = '7.5-a1'
|
||||||
generatedDensities = []
|
generatedDensities = []
|
||||||
testInstrumentationRunner 'org.koitharu.kotatsu.HiltTestRunner'
|
testInstrumentationRunner 'org.koitharu.kotatsu.HiltTestRunner'
|
||||||
ksp {
|
ksp {
|
||||||
@@ -142,12 +142,10 @@ dependencies {
|
|||||||
|
|
||||||
implementation 'ch.acra:acra-http:5.11.3'
|
implementation 'ch.acra:acra-http:5.11.3'
|
||||||
implementation 'ch.acra:acra-dialog:5.11.3'
|
implementation 'ch.acra:acra-dialog:5.11.3'
|
||||||
compileOnly 'com.google.auto.service:auto-service-annotations:1.1.1'
|
|
||||||
ksp 'dev.zacsweers.autoservice:auto-service-ksp:1.1.0'
|
|
||||||
|
|
||||||
implementation 'org.conscrypt:conscrypt-android:2.5.2'
|
implementation 'org.conscrypt:conscrypt-android:2.5.2'
|
||||||
|
|
||||||
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.14'
|
debugImplementation 'com.squareup.leakcanary:leakcanary-android:3.0-alpha-8'
|
||||||
debugImplementation 'com.github.Koitharu:WorkInspector:5778dd1747'
|
debugImplementation 'com.github.Koitharu:WorkInspector:5778dd1747'
|
||||||
|
|
||||||
testImplementation 'junit:junit:4.13.2'
|
testImplementation 'junit:junit:4.13.2'
|
||||||
|
|||||||
@@ -1,24 +0,0 @@
|
|||||||
package org.koitharu.kotatsu.core
|
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import com.google.auto.service.AutoService
|
|
||||||
import org.acra.builder.ReportBuilder
|
|
||||||
import org.acra.config.CoreConfiguration
|
|
||||||
import org.acra.config.ReportingAdministrator
|
|
||||||
|
|
||||||
@AutoService(ReportingAdministrator::class)
|
|
||||||
class ErrorReportingAdmin : ReportingAdministrator {
|
|
||||||
|
|
||||||
override fun shouldStartCollecting(
|
|
||||||
context: Context,
|
|
||||||
config: CoreConfiguration,
|
|
||||||
reportBuilder: ReportBuilder
|
|
||||||
): Boolean {
|
|
||||||
return reportBuilder.exception?.isDeadOs() != true
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun Throwable.isDeadOs(): Boolean {
|
|
||||||
val className = javaClass.simpleName
|
|
||||||
return className == "DeadSystemException" || className == "DeadSystemRuntimeException" || cause?.isDeadOs() == true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -16,10 +16,6 @@ abstract class AlertDialogFragment<B : ViewBinding> : DialogFragment() {
|
|||||||
var viewBinding: B? = null
|
var viewBinding: B? = null
|
||||||
private set
|
private set
|
||||||
|
|
||||||
@Deprecated("", ReplaceWith("requireViewBinding()"))
|
|
||||||
protected val binding: B
|
|
||||||
get() = requireViewBinding()
|
|
||||||
|
|
||||||
final override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
|
final override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
|
||||||
val binding = onCreateViewBinding(layoutInflater, null)
|
val binding = onCreateViewBinding(layoutInflater, null)
|
||||||
viewBinding = binding
|
viewBinding = binding
|
||||||
@@ -51,9 +47,6 @@ abstract class AlertDialogFragment<B : ViewBinding> : DialogFragment() {
|
|||||||
|
|
||||||
open fun onDialogCreated(dialog: AlertDialog) = Unit
|
open fun onDialogCreated(dialog: AlertDialog) = Unit
|
||||||
|
|
||||||
@Deprecated("", ReplaceWith("viewBinding"))
|
|
||||||
protected fun bindingOrNull() = viewBinding
|
|
||||||
|
|
||||||
fun requireViewBinding(): B = checkNotNull(viewBinding) {
|
fun requireViewBinding(): B = checkNotNull(viewBinding) {
|
||||||
"Fragment $this did not return a ViewBinding from onCreateView() or this was called before onCreateView()."
|
"Fragment $this did not return a ViewBinding from onCreateView() or this was called before onCreateView()."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,10 +18,6 @@ abstract class BaseFragment<B : ViewBinding> :
|
|||||||
var viewBinding: B? = null
|
var viewBinding: B? = null
|
||||||
private set
|
private set
|
||||||
|
|
||||||
@Deprecated("", ReplaceWith("requireViewBinding()"))
|
|
||||||
protected val binding: B
|
|
||||||
get() = requireViewBinding()
|
|
||||||
|
|
||||||
@JvmField
|
@JvmField
|
||||||
protected val exceptionResolver = ExceptionResolver(this)
|
protected val exceptionResolver = ExceptionResolver(this)
|
||||||
|
|
||||||
@@ -59,9 +55,6 @@ abstract class BaseFragment<B : ViewBinding> :
|
|||||||
"Fragment $this did not return a ViewBinding from onCreateView() or this was called before onCreateView()."
|
"Fragment $this did not return a ViewBinding from onCreateView() or this was called before onCreateView()."
|
||||||
}
|
}
|
||||||
|
|
||||||
@Deprecated("", ReplaceWith("viewBinding"))
|
|
||||||
protected fun bindingOrNull() = viewBinding
|
|
||||||
|
|
||||||
protected abstract fun onCreateViewBinding(inflater: LayoutInflater, container: ViewGroup?): B
|
protected abstract fun onCreateViewBinding(inflater: LayoutInflater, container: ViewGroup?): B
|
||||||
|
|
||||||
protected open fun onViewBindingCreated(binding: B, savedInstanceState: Bundle?) = Unit
|
protected open fun onViewBindingCreated(binding: B, savedInstanceState: Bundle?) = Unit
|
||||||
|
|||||||
@@ -52,8 +52,8 @@ open class ReorderableListAdapter<T : ListModel> : ListDelegationAdapter<List<T>
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected class DiffCallback<T : ListModel>(
|
protected class DiffCallback<T : ListModel>(
|
||||||
val oldList: List<T>,
|
private val oldList: List<T>,
|
||||||
val newList: List<T>,
|
private val newList: List<T>,
|
||||||
) : DiffUtil.Callback() {
|
) : DiffUtil.Callback() {
|
||||||
|
|
||||||
override fun getOldListSize(): Int = oldList.size
|
override fun getOldListSize(): Int = oldList.size
|
||||||
|
|||||||
@@ -34,10 +34,6 @@ abstract class BaseAdaptiveSheet<B : ViewBinding> : AppCompatDialogFragment() {
|
|||||||
var viewBinding: B? = null
|
var viewBinding: B? = null
|
||||||
private set
|
private set
|
||||||
|
|
||||||
@Deprecated("", ReplaceWith("requireViewBinding()"))
|
|
||||||
protected val binding: B
|
|
||||||
get() = requireViewBinding()
|
|
||||||
|
|
||||||
protected val behavior: AdaptiveSheetBehavior?
|
protected val behavior: AdaptiveSheetBehavior?
|
||||||
get() = AdaptiveSheetBehavior.from(this)
|
get() = AdaptiveSheetBehavior.from(this)
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,5 @@ class MenuInvalidator(
|
|||||||
private val host: MenuHost,
|
private val host: MenuHost,
|
||||||
) : FlowCollector<Any?> {
|
) : FlowCollector<Any?> {
|
||||||
|
|
||||||
override suspend fun emit(value: Any?) {
|
override suspend fun emit(value: Any?) = host.invalidateMenu()
|
||||||
host.invalidateMenu()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,9 +5,9 @@ import kotlinx.coroutines.Dispatchers
|
|||||||
import kotlinx.coroutines.NonCancellable
|
import kotlinx.coroutines.NonCancellable
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
|
import org.koitharu.kotatsu.core.util.ext.printStackTraceDebug
|
||||||
import org.koitharu.kotatsu.core.util.ext.processLifecycleScope
|
import org.koitharu.kotatsu.core.util.ext.processLifecycleScope
|
||||||
import org.koitharu.kotatsu.parsers.util.runCatchingCancellable
|
import org.koitharu.kotatsu.parsers.util.runCatchingCancellable
|
||||||
import org.koitharu.kotatsu.core.util.ext.printStackTraceDebug
|
|
||||||
|
|
||||||
fun interface ReversibleHandle {
|
fun interface ReversibleHandle {
|
||||||
|
|
||||||
@@ -23,8 +23,3 @@ fun ReversibleHandle.reverseAsync() = processLifecycleScope.launch(Dispatchers.D
|
|||||||
it.printStackTraceDebug()
|
it.printStackTraceDebug()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
operator fun ReversibleHandle.plus(other: ReversibleHandle) = ReversibleHandle {
|
|
||||||
this.reverse()
|
|
||||||
other.reverse()
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ import android.database.SQLException
|
|||||||
import android.graphics.Bitmap
|
import android.graphics.Bitmap
|
||||||
import android.graphics.Color
|
import android.graphics.Color
|
||||||
import android.net.ConnectivityManager
|
import android.net.ConnectivityManager
|
||||||
import android.net.Uri
|
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.os.PowerManager
|
import android.os.PowerManager
|
||||||
@@ -31,7 +30,6 @@ import android.view.Window
|
|||||||
import android.webkit.WebView
|
import android.webkit.WebView
|
||||||
import androidx.activity.result.ActivityResultLauncher
|
import androidx.activity.result.ActivityResultLauncher
|
||||||
import androidx.annotation.IntegerRes
|
import androidx.annotation.IntegerRes
|
||||||
import androidx.annotation.WorkerThread
|
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.appcompat.app.AppCompatDelegate
|
import androidx.appcompat.app.AppCompatDelegate
|
||||||
import androidx.appcompat.app.AppCompatDialog
|
import androidx.appcompat.app.AppCompatDialog
|
||||||
@@ -79,8 +77,6 @@ val Context.powerManager: PowerManager?
|
|||||||
val Context.connectivityManager: ConnectivityManager
|
val Context.connectivityManager: ConnectivityManager
|
||||||
get() = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
|
get() = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
|
||||||
|
|
||||||
fun String.toUriOrNull() = if (isEmpty()) null else Uri.parse(this)
|
|
||||||
|
|
||||||
suspend fun CoroutineWorker.trySetForeground(): Boolean = runCatchingCancellable {
|
suspend fun CoroutineWorker.trySetForeground(): Boolean = runCatchingCancellable {
|
||||||
val info = getForegroundInfo()
|
val info = getForegroundInfo()
|
||||||
setForeground(info)
|
setForeground(info)
|
||||||
@@ -131,8 +127,7 @@ fun SyncResult.onError(error: Throwable) {
|
|||||||
when (error) {
|
when (error) {
|
||||||
is IOException -> stats.numIoExceptions++
|
is IOException -> stats.numIoExceptions++
|
||||||
is OperationApplicationException,
|
is OperationApplicationException,
|
||||||
is SQLException,
|
is SQLException -> databaseError = true
|
||||||
-> databaseError = true
|
|
||||||
|
|
||||||
is JSONException -> stats.numParseExceptions++
|
is JSONException -> stats.numParseExceptions++
|
||||||
else -> if (BuildConfig.DEBUG) throw error
|
else -> if (BuildConfig.DEBUG) throw error
|
||||||
@@ -253,7 +248,6 @@ fun Context.checkNotificationPermission(channelId: String?): Boolean {
|
|||||||
return hasPermission
|
return hasPermission
|
||||||
}
|
}
|
||||||
|
|
||||||
@WorkerThread
|
|
||||||
suspend fun Bitmap.compressToPNG(output: File) = runInterruptible(Dispatchers.IO) {
|
suspend fun Bitmap.compressToPNG(output: File) = runInterruptible(Dispatchers.IO) {
|
||||||
output.outputStream().use { os ->
|
output.outputStream().use { os ->
|
||||||
if (!compress(Bitmap.CompressFormat.PNG, 100, os)) {
|
if (!compress(Bitmap.CompressFormat.PNG, 100, os)) {
|
||||||
|
|||||||
@@ -1,23 +0,0 @@
|
|||||||
package org.koitharu.kotatsu.core.util.ext
|
|
||||||
|
|
||||||
import android.view.View
|
|
||||||
import com.google.android.material.bottomsheet.BottomSheetBehavior
|
|
||||||
import com.google.android.material.bottomsheet.BottomSheetBehavior.BottomSheetCallback
|
|
||||||
|
|
||||||
fun BottomSheetBehavior<*>.doOnExpansionsChanged(callback: (isExpanded: Boolean) -> Unit) {
|
|
||||||
var isExpended = state == BottomSheetBehavior.STATE_EXPANDED
|
|
||||||
callback(isExpended)
|
|
||||||
addBottomSheetCallback(
|
|
||||||
object : BottomSheetCallback() {
|
|
||||||
override fun onStateChanged(bottomSheet: View, newState: Int) {
|
|
||||||
val expanded = newState == BottomSheetBehavior.STATE_EXPANDED
|
|
||||||
if (expanded != isExpended) {
|
|
||||||
isExpended = expanded
|
|
||||||
callback(expanded)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onSlide(bottomSheet: View, slideOffset: Float) = Unit
|
|
||||||
},
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@@ -57,10 +57,6 @@ fun ImageResult.toBitmapOrNull() = when (this) {
|
|||||||
is ErrorResult -> null
|
is ErrorResult -> null
|
||||||
}
|
}
|
||||||
|
|
||||||
fun ImageRequest.Builder.indicator(indicator: BaseProgressIndicator<*>): ImageRequest.Builder {
|
|
||||||
return addListener(ImageRequestIndicatorListener(listOf(indicator)))
|
|
||||||
}
|
|
||||||
|
|
||||||
fun ImageRequest.Builder.indicator(indicators: List<BaseProgressIndicator<*>>): ImageRequest.Builder {
|
fun ImageRequest.Builder.indicator(indicators: List<BaseProgressIndicator<*>>): ImageRequest.Builder {
|
||||||
return addListener(ImageRequestIndicatorListener(indicators))
|
return addListener(ImageRequestIndicatorListener(indicators))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ import androidx.core.content.res.use
|
|||||||
import androidx.core.view.isGone
|
import androidx.core.view.isGone
|
||||||
import androidx.core.widget.TextViewCompat
|
import androidx.core.widget.TextViewCompat
|
||||||
|
|
||||||
|
|
||||||
var TextView.textAndVisible: CharSequence?
|
var TextView.textAndVisible: CharSequence?
|
||||||
get() = text?.takeIf { visibility == View.VISIBLE }
|
get() = text?.takeIf { visibility == View.VISIBLE }
|
||||||
set(value) {
|
set(value) {
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import androidx.core.net.toFile
|
|||||||
import okio.Source
|
import okio.Source
|
||||||
import okio.source
|
import okio.source
|
||||||
import okio.use
|
import okio.use
|
||||||
|
import org.jetbrains.annotations.Blocking
|
||||||
import org.koitharu.kotatsu.local.data.util.withExtraCloseable
|
import org.koitharu.kotatsu.local.data.util.withExtraCloseable
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.util.zip.ZipFile
|
import java.util.zip.ZipFile
|
||||||
@@ -12,6 +13,7 @@ import java.util.zip.ZipFile
|
|||||||
const val URI_SCHEME_FILE = "file"
|
const val URI_SCHEME_FILE = "file"
|
||||||
const val URI_SCHEME_ZIP = "file+zip"
|
const val URI_SCHEME_ZIP = "file+zip"
|
||||||
|
|
||||||
|
@Blocking
|
||||||
fun Uri.exists(): Boolean = when (scheme) {
|
fun Uri.exists(): Boolean = when (scheme) {
|
||||||
URI_SCHEME_FILE -> toFile().exists()
|
URI_SCHEME_FILE -> toFile().exists()
|
||||||
URI_SCHEME_ZIP -> {
|
URI_SCHEME_ZIP -> {
|
||||||
@@ -22,6 +24,7 @@ fun Uri.exists(): Boolean = when (scheme) {
|
|||||||
else -> unsupportedUri(this)
|
else -> unsupportedUri(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Blocking
|
||||||
fun Uri.isTargetNotEmpty(): Boolean = when (scheme) {
|
fun Uri.isTargetNotEmpty(): Boolean = when (scheme) {
|
||||||
URI_SCHEME_FILE -> toFile().isNotEmpty()
|
URI_SCHEME_FILE -> toFile().isNotEmpty()
|
||||||
URI_SCHEME_ZIP -> {
|
URI_SCHEME_ZIP -> {
|
||||||
@@ -32,6 +35,7 @@ fun Uri.isTargetNotEmpty(): Boolean = when (scheme) {
|
|||||||
else -> unsupportedUri(this)
|
else -> unsupportedUri(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Blocking
|
||||||
fun Uri.source(): Source = when (scheme) {
|
fun Uri.source(): Source = when (scheme) {
|
||||||
URI_SCHEME_FILE -> toFile().source()
|
URI_SCHEME_FILE -> toFile().source()
|
||||||
URI_SCHEME_ZIP -> {
|
URI_SCHEME_ZIP -> {
|
||||||
@@ -45,6 +49,8 @@ fun Uri.source(): Source = when (scheme) {
|
|||||||
|
|
||||||
fun File.toZipUri(entryName: String): Uri = Uri.parse("$URI_SCHEME_ZIP://$absolutePath#$entryName")
|
fun File.toZipUri(entryName: String): Uri = Uri.parse("$URI_SCHEME_ZIP://$absolutePath#$entryName")
|
||||||
|
|
||||||
|
fun String.toUriOrNull() = if (isEmpty()) null else Uri.parse(this)
|
||||||
|
|
||||||
private fun unsupportedUri(uri: Uri): Nothing {
|
private fun unsupportedUri(uri: Uri): Nothing {
|
||||||
throw IllegalArgumentException("Bad uri $uri: only schemes $URI_SCHEME_FILE and $URI_SCHEME_ZIP are supported")
|
throw IllegalArgumentException("Bad uri $uri: only schemes $URI_SCHEME_FILE and $URI_SCHEME_ZIP are supported")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import android.view.ViewGroup
|
|||||||
import android.widget.Checkable
|
import android.widget.Checkable
|
||||||
import androidx.appcompat.widget.ActionMenuView
|
import androidx.appcompat.widget.ActionMenuView
|
||||||
import androidx.appcompat.widget.Toolbar
|
import androidx.appcompat.widget.Toolbar
|
||||||
import androidx.core.view.SoftwareKeyboardControllerCompat
|
|
||||||
import androidx.core.view.children
|
import androidx.core.view.children
|
||||||
import androidx.core.view.descendants
|
import androidx.core.view.descendants
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
@@ -23,14 +22,6 @@ import com.google.android.material.slider.Slider
|
|||||||
import com.google.android.material.tabs.TabLayout
|
import com.google.android.material.tabs.TabLayout
|
||||||
import kotlin.math.roundToInt
|
import kotlin.math.roundToInt
|
||||||
|
|
||||||
fun View.hideKeyboard() {
|
|
||||||
SoftwareKeyboardControllerCompat(this).hide()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun View.showKeyboard() {
|
|
||||||
SoftwareKeyboardControllerCompat(this).show()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun View.hasGlobalPoint(x: Int, y: Int): Boolean {
|
fun View.hasGlobalPoint(x: Int, y: Int): Boolean {
|
||||||
if (visibility != View.VISIBLE) {
|
if (visibility != View.VISIBLE) {
|
||||||
return false
|
return false
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import androidx.appcompat.view.ActionMode
|
|||||||
import androidx.core.app.ActivityCompat
|
import androidx.core.app.ActivityCompat
|
||||||
import androidx.core.content.ContextCompat
|
import androidx.core.content.ContextCompat
|
||||||
import androidx.core.graphics.Insets
|
import androidx.core.graphics.Insets
|
||||||
|
import androidx.core.view.SoftwareKeyboardControllerCompat
|
||||||
import androidx.core.view.children
|
import androidx.core.view.children
|
||||||
import androidx.core.view.inputmethod.EditorInfoCompat
|
import androidx.core.view.inputmethod.EditorInfoCompat
|
||||||
import androidx.core.view.isInvisible
|
import androidx.core.view.isInvisible
|
||||||
@@ -46,7 +47,6 @@ import org.koitharu.kotatsu.core.ui.util.FadingAppbarMediator
|
|||||||
import org.koitharu.kotatsu.core.ui.util.MenuInvalidator
|
import org.koitharu.kotatsu.core.ui.util.MenuInvalidator
|
||||||
import org.koitharu.kotatsu.core.ui.util.OptionsMenuBadgeHelper
|
import org.koitharu.kotatsu.core.ui.util.OptionsMenuBadgeHelper
|
||||||
import org.koitharu.kotatsu.core.ui.widgets.SlidingBottomNavigationView
|
import org.koitharu.kotatsu.core.ui.widgets.SlidingBottomNavigationView
|
||||||
import org.koitharu.kotatsu.core.util.ext.hideKeyboard
|
|
||||||
import org.koitharu.kotatsu.core.util.ext.observe
|
import org.koitharu.kotatsu.core.util.ext.observe
|
||||||
import org.koitharu.kotatsu.core.util.ext.observeEvent
|
import org.koitharu.kotatsu.core.util.ext.observeEvent
|
||||||
import org.koitharu.kotatsu.core.util.ext.scaleUpActivityOptionsOf
|
import org.koitharu.kotatsu.core.util.ext.scaleUpActivityOptionsOf
|
||||||
@@ -332,7 +332,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>(), AppBarOwner, BottomNav
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun onSearchClosed() {
|
private fun onSearchClosed() {
|
||||||
viewBinding.searchView.hideKeyboard()
|
SoftwareKeyboardControllerCompat(viewBinding.searchView).hide()
|
||||||
adjustSearchUI(isOpened = false, animate = true)
|
adjustSearchUI(isOpened = false, animate = true)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import android.os.Bundle
|
|||||||
import androidx.activity.viewModels
|
import androidx.activity.viewModels
|
||||||
import androidx.appcompat.widget.SearchView
|
import androidx.appcompat.widget.SearchView
|
||||||
import androidx.core.graphics.Insets
|
import androidx.core.graphics.Insets
|
||||||
|
import androidx.core.view.SoftwareKeyboardControllerCompat
|
||||||
import androidx.core.view.inputmethod.EditorInfoCompat
|
import androidx.core.view.inputmethod.EditorInfoCompat
|
||||||
import androidx.core.view.updatePadding
|
import androidx.core.view.updatePadding
|
||||||
import androidx.fragment.app.commit
|
import androidx.fragment.app.commit
|
||||||
@@ -15,7 +16,6 @@ import org.koitharu.kotatsu.core.model.MangaSource
|
|||||||
import org.koitharu.kotatsu.core.model.getTitle
|
import org.koitharu.kotatsu.core.model.getTitle
|
||||||
import org.koitharu.kotatsu.core.ui.BaseActivity
|
import org.koitharu.kotatsu.core.ui.BaseActivity
|
||||||
import org.koitharu.kotatsu.core.util.ext.observe
|
import org.koitharu.kotatsu.core.util.ext.observe
|
||||||
import org.koitharu.kotatsu.core.util.ext.showKeyboard
|
|
||||||
import org.koitharu.kotatsu.databinding.ActivitySearchBinding
|
import org.koitharu.kotatsu.databinding.ActivitySearchBinding
|
||||||
import org.koitharu.kotatsu.parsers.model.MangaSource
|
import org.koitharu.kotatsu.parsers.model.MangaSource
|
||||||
import org.koitharu.kotatsu.search.ui.suggestion.SearchSuggestionViewModel
|
import org.koitharu.kotatsu.search.ui.suggestion.SearchSuggestionViewModel
|
||||||
@@ -39,7 +39,7 @@ class SearchActivity : BaseActivity<ActivitySearchBinding>(), SearchView.OnQuery
|
|||||||
|
|
||||||
if (query.isNullOrBlank()) {
|
if (query.isNullOrBlank()) {
|
||||||
requestFocus()
|
requestFocus()
|
||||||
showKeyboard()
|
SoftwareKeyboardControllerCompat(this).show()
|
||||||
} else {
|
} else {
|
||||||
setQuery(query, true)
|
setQuery(query, true)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user