diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaDetailsController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaDetailsController.kt index 18df4708c7..0f09e24e73 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaDetailsController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaDetailsController.kt @@ -156,6 +156,7 @@ class MangaDetailsController : BaseController, private var trackingBottomSheet: TrackingBottomSheet? = null private var startingDLChapterPos: Int? = null private var editMangaDialog: EditMangaDialog? = null + var refreshTracker: Int? = null /** * Adapter containing a list of chapters. @@ -256,6 +257,7 @@ class MangaDetailsController : BaseController, }) setPaletteColor() + swipe_refresh.isRefreshing = presenter.isLoading if (manga?.initialized != true) swipe_refresh.post { swipe_refresh.isRefreshing = true } @@ -305,7 +307,12 @@ class MangaDetailsController : BaseController, super.onActivityResumed(activity) presenter.isLockedFromSearch = SecureActivityDelegate.shouldBeLocked() presenter.headerItem.isLocked = presenter.isLockedFromSearch - presenter.fetchChapters() + presenter.fetchChapters(refreshTracker == null) + if (refreshTracker != null) { + trackingBottomSheet?.refreshItem(refreshTracker ?: 0) + presenter.refreshTrackers() + refreshTracker = null + } val isCurrentController = router?.backstack?.lastOrNull()?.controller() == this if (isCurrentController) { @@ -334,7 +341,10 @@ class MangaDetailsController : BaseController, } else if (type == ControllerChangeType.PUSH_EXIT || type == ControllerChangeType.POP_EXIT) { if (router.backstack.lastOrNull()?.controller() is DialogController) return - if (type == ControllerChangeType.POP_EXIT) setHasOptionsMenu(false) + if (type == ControllerChangeType.POP_EXIT) { + setHasOptionsMenu(false) + presenter.cancelScope() + } colorAnimator?.cancel() val colorPrimary = activity?.getResourceColor( diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaDetailsPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaDetailsPresenter.kt index fa70000133..cdbadd0003 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaDetailsPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaDetailsPresenter.kt @@ -90,13 +90,16 @@ class MangaDetailsPresenter( fun onDestroy() { downloadManager.removeListener(this) LibraryUpdateService.removeListener(this) + } + + fun cancelScope() { scope.cancel() } - fun fetchChapters() { + fun fetchChapters(andTracking: Boolean = true) { scope.launch { getChapters() - refreshTracking() + if (andTracking) refreshTracking() withContext(Dispatchers.Main) { controller.updateChapters(chapters) } } } @@ -648,7 +651,7 @@ class MangaDetailsPresenter( fun refreshTrackers() { scope.launch { - val list = trackList.filter { it.track != null }.map { item -> + trackList.filter { it.track != null }.map { item -> withContext(Dispatchers.IO) { val trackItem = try { item.service.refresh(item.track!!) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/TrackingBottomSheet.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/TrackingBottomSheet.kt index dde04130f7..de23276b04 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/TrackingBottomSheet.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/TrackingBottomSheet.kt @@ -119,6 +119,7 @@ class TrackingBottomSheet(private val controller: MangaDetailsController) : Bott activity.toast(R.string.url_not_set) } else { activity.startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(track.tracking_url))) + controller.refreshTracker = position } } @@ -158,6 +159,10 @@ class TrackingBottomSheet(private val controller: MangaDetailsController) : Bott refreshTrack(item.service) } + fun refreshItem(index: Int) { + (track_recycler.findViewHolderForAdapterPosition(index) as? TrackHolder)?.setProgress(true) + } + fun refreshTrack(item: TrackService?) { val index = adapter?.indexOf(item) ?: -1 if (index > -1) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackHolder.kt index d56d97eea6..3d69ccaab3 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackHolder.kt @@ -2,7 +2,10 @@ package eu.kanade.tachiyomi.ui.manga.track import android.annotation.SuppressLint import android.view.View +import androidx.constraintlayout.widget.ConstraintLayout +import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.base.holder.BaseViewHolder +import eu.kanade.tachiyomi.util.view.updateLayoutParams import eu.kanade.tachiyomi.util.view.visibleIf import kotlinx.android.synthetic.main.track_item.* @@ -11,9 +14,10 @@ class TrackHolder(view: View, adapter: TrackAdapter) : BaseViewHolder(view) { init { val listener = adapter.rowClickListener logo_container.setOnClickListener { listener.onLogoClick(adapterPosition) } - track_set.setOnClickListener { listener.onSetClick(adapterPosition) } - status_container.setOnClickListener { listener.onStatusClick(adapterPosition) } - chapters_container.setOnClickListener { listener.onChaptersClick(adapterPosition) } + add_tracking.setOnClickListener { listener.onSetClick(adapterPosition) } + track_title.setOnClickListener { listener.onSetClick(adapterPosition) } + track_status.setOnClickListener { listener.onStatusClick(adapterPosition) } + track_chapters.setOnClickListener { listener.onChaptersClick(adapterPosition) } score_container.setOnClickListener { listener.onScoreClick(adapterPosition) } } @@ -22,11 +26,28 @@ class TrackHolder(view: View, adapter: TrackAdapter) : BaseViewHolder(view) { val track = item.track track_logo.setImageResource(item.service.getLogo()) logo_container.setBackgroundColor(item.service.getLogoColor()) + logo_container.updateLayoutParams { + bottomToBottom = if (track != null) divider.id else track_details.id + } + track_logo.contentDescription = item.service.name track_group.visibleIf(track != null) + add_tracking.visibleIf(track == null) if (track != null) { - track_chapters.text = "${track.last_chapter_read}/" + - if (track.total_chapters > 0) track.total_chapters else "-" - track_status.text = item.service.getStatus(track.status) + track_title.text = track.title + with(track_chapters) { + text = when { + track.total_chapters > 0 -> context.getString( + R.string.chapter_x_of_y, track.last_chapter_read, track.total_chapters + ) + track.last_chapter_read > 0 -> context.getString( + R.string.chapter_x, track.last_chapter_read + ) + else -> context.getString(R.string.action_filter_not_started) + } + } + val status = item.service.getStatus(track.status) + if (status.isEmpty()) track_status.setText(R.string.unknown_status) + else track_status.text = item.service.getStatus(track.status) track_score.text = if (track.score == 0f) "-" else item.service.displayScore(track) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackSearchDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackSearchDialog.kt index 1530c6e04a..7d54782449 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackSearchDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackSearchDialog.kt @@ -64,9 +64,7 @@ class TrackSearchDialog : DialogController { val dialog = MaterialDialog(activity!!).apply { customView(viewRes = R.layout.track_search_dialog, scrollable = false) negativeButton(android.R.string.cancel) - positiveButton( - if (wasPreviouslyTracked) R.string.action_clear - else R.string.action_track) { onPositiveButtonClick() } + positiveButton(R.string.action_clear) { onPositiveButtonClick() } setActionButtonEnabled(WhichButton.POSITIVE, wasPreviouslyTracked) } @@ -90,9 +88,7 @@ class TrackSearchDialog : DialogController { selectedItem = null subscriptions += view.track_search_list.itemClicks().subscribe { position -> - selectedItem = adapter.getItem(position) - (dialog as? MaterialDialog)?.positiveButton(R.string.action_track) - (dialog as? MaterialDialog)?.setActionButtonEnabled(WhichButton.POSITIVE, true) + trackItem(position) } // Do an initial search based on the manga's title @@ -103,6 +99,13 @@ class TrackSearchDialog : DialogController { } } + private fun trackItem(position: Int) { + selectedItem = adapter?.getItem(position) + bottomSheet.refreshTrack(service) + presenter.registerTracking(selectedItem, service) + dismissDialog() + } + override fun onDestroyView(view: View) { super.onDestroyView(view) subscriptions.unsubscribe() @@ -139,9 +142,7 @@ class TrackSearchDialog : DialogController { view.track_search_list.visibility = View.VISIBLE adapter?.setItems(results) if (results.size == 1 && !wasPreviouslyTracked) { - selectedItem = adapter?.getItem(0) - (dialog as? MaterialDialog)?.positiveButton(R.string.action_track) - (dialog as? MaterialDialog)?.setActionButtonEnabled(WhichButton.POSITIVE, true) + trackItem(0) } } @@ -154,7 +155,7 @@ class TrackSearchDialog : DialogController { private fun onPositiveButtonClick() { bottomSheet.refreshTrack(service) - presenter.registerTracking(selectedItem, + presenter.registerTracking(null, service) } diff --git a/app/src/main/res/drawable/card_item_selector.xml b/app/src/main/res/drawable/card_item_selector.xml new file mode 100644 index 0000000000..6e46394f7c --- /dev/null +++ b/app/src/main/res/drawable/card_item_selector.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_star_12dp.xml b/app/src/main/res/drawable/ic_star_12dp.xml new file mode 100644 index 0000000000..69b488db9d --- /dev/null +++ b/app/src/main/res/drawable/ic_star_12dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/track_item.xml b/app/src/main/res/layout/track_item.xml index f0a71d0f1e..757e45606b 100644 --- a/app/src/main/res/layout/track_item.xml +++ b/app/src/main/res/layout/track_item.xml @@ -7,28 +7,31 @@ android:padding="0dp"> + android:layout_weight="1" + android:background="@color/dialog"> @@ -39,129 +42,164 @@ android:layout_height="wrap_content" android:layout_gravity="center" android:padding="4dp" - android:visibility="gone"/> + android:visibility="gone" /> + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + android:visibility="gone" + app:constraint_referenced_ids="sub_tracking_layout,status_container,divider" /> diff --git a/app/src/main/res/layout/tracking_bottom_sheet.xml b/app/src/main/res/layout/tracking_bottom_sheet.xml index 2bb015b59c..83aae85657 100644 --- a/app/src/main/res/layout/tracking_bottom_sheet.xml +++ b/app/src/main/res/layout/tracking_bottom_sheet.xml @@ -3,12 +3,13 @@ xmlns:tools="http://schemas.android.com/tools" android:id="@+id/display_bottom_sheet" android:layout_width="match_parent" + android:background="@drawable/bg_bottom_sheet_dialog_fragment" android:layout_height="match_parent"> \ No newline at end of file diff --git a/app/src/main/res/values-night/colors.xml b/app/src/main/res/values-night/colors.xml index 8528e7ec47..0ba0654581 100644 --- a/app/src/main/res/values-night/colors.xml +++ b/app/src/main/res/values-night/colors.xml @@ -12,7 +12,7 @@ #212121 @color/md_white_1000_20 #707070 - @color/md_grey_800 + #171717 #3399FF #212121 @color/md_white_1000_38 @@ -28,7 +28,7 @@ @color/md_white_1000_12 #1C1C1D - @color/md_grey_800 + #212121 @color/md_blue_A200_50 @color/md_white_1000_54 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c538c7abde..64272b289e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -593,6 +593,9 @@ Started Type Manga URL not set, please click title and select manga again + Add Tracking + Chapter %1$d of %2$d + Chapter %1$d A category with this name already exists!