Cleanup some code

This commit is contained in:
Jobobby04 2020-08-21 20:26:56 -04:00
parent 4333999b85
commit 4b12e977c0
8 changed files with 111 additions and 84 deletions

View File

@ -34,6 +34,7 @@ import exh.debug.DebugToggles
import exh.log.CrashlyticsPrinter import exh.log.CrashlyticsPrinter
import exh.log.EHDebugModeOverlay import exh.log.EHDebugModeOverlay
import exh.log.EHLogLevel import exh.log.EHLogLevel
import exh.syDebugVersion
import io.realm.Realm import io.realm.Realm
import io.realm.RealmConfiguration import io.realm.RealmConfiguration
import java.io.File import java.io.File
@ -183,7 +184,7 @@ open class App : Application(), LifecycleObserver {
.Builder(logFolder.absolutePath) .Builder(logFolder.absolutePath)
.fileNameGenerator(object : DateFileNameGenerator() { .fileNameGenerator(object : DateFileNameGenerator() {
override fun generateFileName(logLevel: Int, timestamp: Long): String { override fun generateFileName(logLevel: Int, timestamp: Long): String {
return super.generateFileName(logLevel, timestamp) + "-${BuildConfig.BUILD_TYPE}" return super.generateFileName(logLevel, timestamp) + "-${BuildConfig.BUILD_TYPE}.log"
} }
}) })
.cleanStrategy(FileLastModifiedCleanStrategy(7.days.inMilliseconds.longValue)) .cleanStrategy(FileLastModifiedCleanStrategy(7.days.inMilliseconds.longValue))
@ -201,6 +202,17 @@ open class App : Application(), LifecycleObserver {
) )
XLog.d("Application booting...") XLog.d("Application booting...")
XLog.nst().d(
"App version: ${BuildConfig.VERSION_NAME} (${BuildConfig.FLAVOR}, ${BuildConfig.COMMIT_SHA}, ${BuildConfig.VERSION_CODE})\n" +
"Preview build: $syDebugVersion\n" +
"Android version: ${Build.VERSION.RELEASE} (SDK ${Build.VERSION.SDK_INT}) \n" +
"Android build ID: ${Build.DISPLAY}\n" +
"Device brand: ${Build.BRAND}\n" +
"Device manufacturer: ${Build.MANUFACTURER}\n" +
"Device name: ${Build.DEVICE}\n" +
"Device model: ${Build.MODEL}\n" +
"Device product name: ${Build.PRODUCT}"
)
} }
// EXH // EXH

View File

@ -31,7 +31,7 @@ import rx.Observable
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get import uy.kohesive.injekt.api.get
@ExperimentalSerializationApi @OptIn(ExperimentalSerializationApi::class)
class MangaPlus(delegate: HttpSource, val context: Context) : class MangaPlus(delegate: HttpSource, val context: Context) :
DelegatedHttpSource(delegate), DelegatedHttpSource(delegate),
ConfigurableSource { ConfigurableSource {

View File

@ -23,22 +23,20 @@ import kotlinx.android.synthetic.main.migration_bottom_sheet.mig_categories
import kotlinx.android.synthetic.main.migration_bottom_sheet.mig_chapters import kotlinx.android.synthetic.main.migration_bottom_sheet.mig_chapters
import kotlinx.android.synthetic.main.migration_bottom_sheet.mig_tracking import kotlinx.android.synthetic.main.migration_bottom_sheet.mig_tracking
import kotlinx.android.synthetic.main.migration_bottom_sheet.use_smart_search import kotlinx.android.synthetic.main.migration_bottom_sheet.use_smart_search
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import reactivecircus.flowbinding.android.view.clicks
import uy.kohesive.injekt.injectLazy import uy.kohesive.injekt.injectLazy
class MigrationBottomSheetDialog( class MigrationBottomSheetDialog(activity: Activity, theme: Int, private val listener: StartMigrationListener) : BottomSheetDialog(activity, theme) {
activity: Activity,
theme: Int,
private val listener:
StartMigrationListener
) :
BottomSheetDialog(
activity,
theme
) {
/** /**
* Preferences helper. * Preferences helper.
*/ */
private val preferences by injectLazy<PreferencesHelper>() private val preferences by injectLazy<PreferencesHelper>()
private val scope = CoroutineScope(Job() + Dispatchers.Main)
init { init {
// Use activity theme for this layout // Use activity theme for this layout
@ -61,7 +59,7 @@ class MigrationBottomSheetDialog(
initPreferences() initPreferences()
fab.setOnClickListener { fab.clicks().onEach {
preferences.skipPreMigration().set(skip_step.isChecked) preferences.skipPreMigration().set(skip_step.isChecked)
listener.startMigration( listener.startMigration(
if (use_smart_search.isChecked && extra_search_param_text.text.isNotBlank()) { if (use_smart_search.isChecked && extra_search_param_text.text.isNotBlank()) {
@ -69,7 +67,7 @@ class MigrationBottomSheetDialog(
} else null } else null
) )
dismiss() dismiss()
} }.launchIn(scope)
} }
/** /**

View File

@ -9,9 +9,11 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.FrameLayout import android.widget.FrameLayout
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.bluelinelabs.conductor.Router import com.bluelinelabs.conductor.Router
import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.bottomsheet.BottomSheetDialog
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
import eu.davidea.flexibleadapter.FlexibleAdapter import eu.davidea.flexibleadapter.FlexibleAdapter
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.PreferencesHelper
@ -19,17 +21,23 @@ import eu.kanade.tachiyomi.databinding.PreMigrationControllerBinding
import eu.kanade.tachiyomi.source.SourceManager import eu.kanade.tachiyomi.source.SourceManager
import eu.kanade.tachiyomi.source.online.HttpSource import eu.kanade.tachiyomi.source.online.HttpSource
import eu.kanade.tachiyomi.ui.base.controller.BaseController import eu.kanade.tachiyomi.ui.base.controller.BaseController
import eu.kanade.tachiyomi.ui.base.controller.FabController
import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction
import eu.kanade.tachiyomi.ui.browse.migration.advanced.process.MigrationListController import eu.kanade.tachiyomi.ui.browse.migration.advanced.process.MigrationListController
import eu.kanade.tachiyomi.ui.browse.migration.advanced.process.MigrationProcedureConfig import eu.kanade.tachiyomi.ui.browse.migration.advanced.process.MigrationProcedureConfig
import eu.kanade.tachiyomi.ui.main.offsetAppbarHeight
import eu.kanade.tachiyomi.util.view.shrinkOnScroll import eu.kanade.tachiyomi.util.view.shrinkOnScroll
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import reactivecircus.flowbinding.android.view.clicks
import uy.kohesive.injekt.injectLazy import uy.kohesive.injekt.injectLazy
class PreMigrationController(bundle: Bundle? = null) : class PreMigrationController(bundle: Bundle? = null) :
BaseController<PreMigrationControllerBinding>(bundle), BaseController<PreMigrationControllerBinding>(bundle),
FlexibleAdapter FlexibleAdapter.OnItemClickListener,
.OnItemClickListener, FabController,
StartMigrationListener { StartMigrationListener {
private val sourceManager: SourceManager by injectLazy() private val sourceManager: SourceManager by injectLazy()
private val prefs: PreferencesHelper by injectLazy() private val prefs: PreferencesHelper by injectLazy()
@ -38,7 +46,10 @@ class PreMigrationController(bundle: Bundle? = null) :
private val config: LongArray = args.getLongArray(MANGA_IDS_EXTRA) ?: LongArray(0) private val config: LongArray = args.getLongArray(MANGA_IDS_EXTRA) ?: LongArray(0)
private var showingOptions = false val scope = CoroutineScope(Job() + Dispatchers.Main)
private var actionFab: ExtendedFloatingActionButton? = null
private var actionFabScrollListener: RecyclerView.OnScrollListener? = null
private var dialog: BottomSheetDialog? = null private var dialog: BottomSheetDialog? = null
@ -64,9 +75,15 @@ class PreMigrationController(bundle: Bundle? = null) :
ourAdapter.isHandleDragEnabled = true ourAdapter.isHandleDragEnabled = true
dialog = null dialog = null
binding.fab.shrinkOnScroll(binding.recycler) actionFabScrollListener = actionFab?.shrinkOnScroll(binding.recycler)
}
binding.fab.setOnClickListener { override fun configureFab(fab: ExtendedFloatingActionButton) {
actionFab = fab
fab.setText(R.string.action_migrate)
fab.setIconResource(R.drawable.ic_arrow_forward_24dp)
fab.clicks()
.onEach {
if (dialog?.isShowing != true) { if (dialog?.isShowing != true) {
dialog = MigrationBottomSheetDialog(activity!!, R.style.SheetDialog, this) dialog = MigrationBottomSheetDialog(activity!!, R.style.SheetDialog, this)
dialog?.show() dialog?.show()
@ -80,8 +97,12 @@ class PreMigrationController(bundle: Bundle? = null) :
} }
} }
} }
binding.fab.shrinkOnScroll(binding.recycler) .launchIn(scope)
binding.fab.offsetAppbarHeight(activity!!) }
override fun cleanupFab(fab: ExtendedFloatingActionButton) {
actionFabScrollListener?.let { binding.recycler.removeOnScrollListener(it) }
actionFab = null
} }
override fun startMigration(extraParam: String?) { override fun startMigration(extraParam: String?) {
@ -127,20 +148,12 @@ class PreMigrationController(bundle: Bundle? = null) :
private fun getEnabledSources(): List<HttpSource> { private fun getEnabledSources(): List<HttpSource> {
val languages = prefs.enabledLanguages().get() val languages = prefs.enabledLanguages().get()
val sourcesSaved = prefs.migrationSources().get().split("/") val sourcesSaved = prefs.migrationSources().get().split("/")
var sources = sourceManager.getVisibleCatalogueSources() val sources = sourceManager.getVisibleCatalogueSources()
.filterIsInstance<HttpSource>() .filterIsInstance<HttpSource>()
.filter { it.lang in languages } .filter { it.lang in languages }
.sortedBy { "(${it.lang}) ${it.name}" } .sortedBy { "(${it.lang}) ${it.name}" }
sources =
sources.filter { isEnabled(it.id.toString()) }.sortedBy {
sourcesSaved.indexOf(
it.id
.toString()
)
} +
sources.filterNot { isEnabled(it.id.toString()) }
return sources return sources.filter { isEnabled(it.id.toString()) }.sortedBy { sourcesSaved.indexOf(it.id.toString()) } + sources.filterNot { isEnabled(it.id.toString()) }
} }
fun isEnabled(id: String): Boolean { fun isEnabled(id: String): Boolean {

View File

@ -33,8 +33,13 @@ import kotlinx.android.synthetic.main.migration_process_item.migration_manga_car
import kotlinx.android.synthetic.main.migration_process_item.migration_manga_card_to import kotlinx.android.synthetic.main.migration_process_item.migration_manga_card_to
import kotlinx.android.synthetic.main.migration_process_item.migration_menu import kotlinx.android.synthetic.main.migration_process_item.migration_menu
import kotlinx.android.synthetic.main.migration_process_item.skip_manga import kotlinx.android.synthetic.main.migration_process_item.skip_manga
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import reactivecircus.flowbinding.android.view.clicks
import uy.kohesive.injekt.api.get import uy.kohesive.injekt.api.get
import uy.kohesive.injekt.injectLazy import uy.kohesive.injekt.injectLazy
@ -47,6 +52,7 @@ class MigrationProcessHolder(
private val sourceManager: SourceManager by injectLazy() private val sourceManager: SourceManager by injectLazy()
private var item: MigrationProcessItem? = null private var item: MigrationProcessItem? = null
private val gson: Gson by injectLazy() private val gson: Gson by injectLazy()
private val scope = CoroutineScope(Job() + Dispatchers.Main)
init { init {
// We need to post a Runnable to show the popup to make sure that the PopupMenu is // We need to post a Runnable to show the popup to make sure that the PopupMenu is
@ -80,14 +86,15 @@ class MigrationProcessHolder(
if (manga != null) { if (manga != null) {
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
migration_manga_card_from.attachManga(manga, source) migration_manga_card_from.attachManga(manga, source)
migration_manga_card_from.setOnClickListener { migration_manga_card_from.clicks()
.onEach {
adapter.controller.router.pushController( adapter.controller.router.pushController(
MangaController( MangaController(
manga, manga,
true true
).withFadeTransaction() ).withFadeTransaction()
) )
} }.launchIn(scope)
} }
/*launchUI { /*launchUI {
@ -115,13 +122,14 @@ class MigrationProcessHolder(
} }
if (searchResult != null && resultSource != null) { if (searchResult != null && resultSource != null) {
migration_manga_card_to.attachManga(searchResult, resultSource) migration_manga_card_to.attachManga(searchResult, resultSource)
migration_manga_card_to.setOnClickListener { migration_manga_card_to.clicks()
.onEach {
adapter.controller.router.pushController( adapter.controller.router.pushController(
MangaController( MangaController(
searchResult, true searchResult, true
).withFadeTransaction() ).withFadeTransaction()
) )
} }.launchIn(scope)
} else { } else {
migration_manga_card_to.loading_group.isVisible = false migration_manga_card_to.loading_group.isVisible = false
migration_manga_card_to.title.text = view.context.applicationContext migration_manga_card_to.title.text = view.context.applicationContext
@ -143,7 +151,7 @@ class MigrationProcessHolder(
manga_chapters.text = "" manga_chapters.text = ""
manga_chapters.isVisible = false manga_chapters.isVisible = false
manga_last_chapter_label.text = "" manga_last_chapter_label.text = ""
migration_manga_card_to.setOnClickListener(null) migration_manga_card_to.clicks()
} }
private fun View.attachManga(manga: Manga, source: Source) { private fun View.attachManga(manga: Manga, source: Source) {

View File

@ -32,6 +32,7 @@ import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.filterIsInstance import kotlinx.coroutines.flow.filterIsInstance
import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onEach
import reactivecircus.flowbinding.android.view.clicks
import reactivecircus.flowbinding.appcompat.QueryTextEvent import reactivecircus.flowbinding.appcompat.QueryTextEvent
import reactivecircus.flowbinding.appcompat.queryTextEvents import reactivecircus.flowbinding.appcompat.queryTextEvents
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
@ -245,7 +246,9 @@ open class IndexController :
filterSheet?.setOnShowListener { actionFab?.isVisible = false } filterSheet?.setOnShowListener { actionFab?.isVisible = false }
filterSheet?.setOnDismissListener { actionFab?.isVisible = true } filterSheet?.setOnDismissListener { actionFab?.isVisible = true }
actionFab?.setOnClickListener { filterSheet?.show() } actionFab?.clicks()
?.onEach { filterSheet?.show() }
?.launchIn(scope)
actionFab?.isVisible = true actionFab?.isVisible = true
} }

View File

@ -34,6 +34,9 @@ import kotlinx.android.synthetic.main.edit_manga_dialog.view.manga_genres_tags
import kotlinx.android.synthetic.main.edit_manga_dialog.view.reset_cover import kotlinx.android.synthetic.main.edit_manga_dialog.view.reset_cover
import kotlinx.android.synthetic.main.edit_manga_dialog.view.reset_tags import kotlinx.android.synthetic.main.edit_manga_dialog.view.reset_tags
import kotlinx.android.synthetic.main.edit_manga_dialog.view.title import kotlinx.android.synthetic.main.edit_manga_dialog.view.title
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import reactivecircus.flowbinding.android.view.clicks
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get import uy.kohesive.injekt.api.get
@ -131,16 +134,19 @@ class EditMangaDialog : DialogController {
} }
} }
view.manga_genres_tags.clearFocus() view.manga_genres_tags.clearFocus()
view.cover_layout.setOnClickListener { view.cover_layout.clicks()
infoController.changeCover() .onEach { infoController.changeCover() }
} .launchIn(infoController.scope)
view.reset_tags.setOnClickListener { resetTags() } view.reset_tags.clicks()
.onEach { resetTags() }
.launchIn(infoController.scope)
view.reset_cover.isVisible = !isLocal view.reset_cover.isVisible = !isLocal
view.reset_cover.setOnClickListener { view.reset_cover.clicks()
.onEach {
view.context.toast(R.string.cover_reset_toast) view.context.toast(R.string.cover_reset_toast)
customCoverUri = null customCoverUri = null
willResetCover = true willResetCover = true
} }.launchIn(infoController.scope)
} }
private fun resetTags() { private fun resetTags() {
@ -198,7 +204,7 @@ class EditMangaDialog : DialogController {
chipIcon?.setTint(context.getResourceColor(R.attr.colorAccent)) chipIcon?.setTint(context.getResourceColor(R.attr.colorAccent))
textStartPadding = 0F textStartPadding = 0F
setOnClickListener { clicks().onEach {
MaterialDialog(context) MaterialDialog(context)
.title(R.string.add_tag) .title(R.string.add_tag)
.input(inputType = InputType.TYPE_CLASS_TEXT) .input(inputType = InputType.TYPE_CLASS_TEXT)
@ -210,7 +216,7 @@ class EditMangaDialog : DialogController {
} }
.negativeButton(android.R.string.cancel) .negativeButton(android.R.string.cancel)
.show() .show()
} }.launchIn(infoController.scope)
} }
addView(addTagChip) addView(addTagChip)
} }

View File

@ -20,17 +20,4 @@
</androidx.recyclerview.widget.RecyclerView> </androidx.recyclerview.widget.RecyclerView>
<com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
android:id="@+id/fab"
style="@style/Theme.Widget.FAB"
android:clickable="true"
android:focusable="true"
android:src="@drawable/ic_arrow_forward_24dp"
android:text="@string/action_migrate"
app:icon="@drawable/ic_arrow_forward_24dp"
app:layout_anchor="@id/recycler"
app:layout_anchorGravity="bottom|right|end"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>