浏览代码

Show tracker status in button

arkon 4 年之前
父节点
当前提交
a443dc3040

+ 4 - 0
app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt

@@ -356,6 +356,10 @@ class MangaController :
         activity?.toast(error.message)
     }
 
+    fun onTrackingCount(trackCount: Int) {
+        mangaInfoAdapter?.setTrackingCount(trackCount)
+    }
+
     fun openMangaInWebView() {
         val source = presenter.source as? HttpSource ?: return
 

+ 20 - 1
app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaPresenter.kt

@@ -13,6 +13,7 @@ import eu.kanade.tachiyomi.data.database.models.MangaCategory
 import eu.kanade.tachiyomi.data.download.DownloadManager
 import eu.kanade.tachiyomi.data.download.model.Download
 import eu.kanade.tachiyomi.data.preference.PreferencesHelper
+import eu.kanade.tachiyomi.data.track.TrackManager
 import eu.kanade.tachiyomi.source.LocalSource
 import eu.kanade.tachiyomi.source.Source
 import eu.kanade.tachiyomi.ui.base.presenter.BasePresenter
@@ -39,6 +40,7 @@ class MangaPresenter(
     val source: Source,
     val preferences: PreferencesHelper = Injekt.get(),
     private val db: DatabaseHelper = Injekt.get(),
+    private val trackManager: TrackManager = Injekt.get(),
     private val downloadManager: DownloadManager = Injekt.get(),
     private val coverCache: CoverCache = Injekt.get()
 ) : BasePresenter<MangaController>() {
@@ -83,8 +85,13 @@ class MangaPresenter(
         // Manga info - start
 
         getMangaObservable()
+            .observeOn(AndroidSchedulers.mainThread())
             .subscribeLatestCache({ view, manga -> view.onNextMangaInfo(manga, source) })
 
+        getTrackingObservable()
+            .observeOn(AndroidSchedulers.mainThread())
+            .subscribeLatestCache(MangaController::onTrackingCount) { _, error -> Timber.e(error) }
+
         // Prepare the relay.
         chaptersRelay.flatMap { applyChapterFilters(it) }
             .observeOn(AndroidSchedulers.mainThread())
@@ -122,7 +129,19 @@ class MangaPresenter(
 
     private fun getMangaObservable(): Observable<Manga> {
         return db.getManga(manga.url, manga.source).asRxObservable()
-            .observeOn(AndroidSchedulers.mainThread())
+    }
+
+    private fun getTrackingObservable(): Observable<Int> {
+        if (!trackManager.hasLoggedServices()) {
+            return Observable.just(0)
+        }
+
+        return db.getTracks(manga).asRxObservable()
+            .map { tracks ->
+                val loggedServices = trackManager.services.filter { it.isLogged }.map { it.id }
+                tracks.filter { it.sync_id in loggedServices }
+            }
+            .map { it.size }
     }
 
     /**

+ 27 - 8
app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoHeaderAdapter.kt

@@ -14,7 +14,6 @@ import eu.kanade.tachiyomi.data.database.models.Manga
 import eu.kanade.tachiyomi.data.glide.GlideApp
 import eu.kanade.tachiyomi.data.glide.MangaThumbnail
 import eu.kanade.tachiyomi.data.glide.toMangaThumbnail
-import eu.kanade.tachiyomi.data.track.TrackManager
 import eu.kanade.tachiyomi.databinding.MangaInfoHeaderBinding
 import eu.kanade.tachiyomi.source.Source
 import eu.kanade.tachiyomi.source.SourceManager
@@ -47,6 +46,7 @@ class MangaInfoHeaderAdapter(
 
     private var manga: Manga = controller.presenter.manga
     private var source: Source = controller.presenter.source
+    private var trackCount: Int = 0
 
     private val scope = CoroutineScope(Job() + Dispatchers.Main)
     private lateinit var binding: MangaInfoHeaderBinding
@@ -78,6 +78,12 @@ class MangaInfoHeaderAdapter(
         notifyDataSetChanged()
     }
 
+    fun setTrackingCount(trackCount: Int) {
+        this.trackCount = trackCount
+
+        notifyDataSetChanged()
+    }
+
     inner class HeaderViewHolder(private val view: View) : RecyclerView.ViewHolder(view) {
         fun bind() {
             // For rounded corners
@@ -93,13 +99,26 @@ class MangaInfoHeaderAdapter(
                     .launchIn(scope)
             }
 
-            if (controller.presenter.manga.favorite && Injekt.get<TrackManager>().hasLoggedServices()) {
-                binding.btnTracking.visible()
-                binding.btnTracking.clicks()
-                    .onEach { controller.onTrackingClick() }
-                    .launchIn(scope)
-            } else {
-                binding.btnTracking.gone()
+            with(binding.btnTracking) {
+                if (controller.presenter.manga.favorite) {
+                    visible()
+
+                    if (trackCount > 0) {
+                        setIconResource(R.drawable.ic_done_24dp)
+                        text = view.context.resources.getQuantityString(R.plurals.num_trackers, trackCount, trackCount)
+                        isChecked = true
+                    } else {
+                        setIconResource(R.drawable.ic_sync_24dp)
+                        text = view.context.getString(R.string.manga_tracking_tab)
+                        isChecked = false
+                    }
+
+                    clicks()
+                        .onEach { controller.onTrackingClick() }
+                        .launchIn(scope)
+                } else {
+                    gone()
+                }
             }
 
             if (controller.presenter.source is HttpSource) {

+ 0 - 9
app/src/main/res/drawable/ic_done_white_18dp.xml

@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="18dp"
-    android:height="18dp"
-    android:viewportWidth="24.0"
-    android:viewportHeight="24.0">
-    <path
-        android:fillColor="#FFFFFFFF"
-        android:pathData="M9,16.2L4.8,12l-1.4,1.4L9,19 21,7l-1.4,-1.4L9,16.2z"/>
-</vector>

+ 4 - 0
app/src/main/res/values/strings.xml

@@ -514,6 +514,10 @@
 
     <!-- Tracking Screen -->
     <string name="manga_tracking_tab">Tracking</string>
+    <plurals name="num_trackers">
+        <item quantity="one">1 tracker</item>
+        <item quantity="other">%d trackers</item>
+    </plurals>
     <string name="add_tracking">Add tracking</string>
     <string name="reading">Reading</string>
     <string name="currently_reading">Currently reading</string>