diff --git a/app/build.gradle b/app/build.gradle index 0d622f3a32..5b70f7d41e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -102,7 +102,7 @@ dependencies { compile 'com.github.inorichi:junrar-android:634c1f5' // Android support library - final support_library_version = '25.1.1' + final support_library_version = '25.2.0' compile "com.android.support:support-v4:$support_library_version" compile "com.android.support:appcompat-v7:$support_library_version" compile "com.android.support:cardview-v7:$support_library_version" @@ -111,7 +111,7 @@ dependencies { compile "com.android.support:support-annotations:$support_library_version" compile "com.android.support:customtabs:$support_library_version" - compile 'com.android.support.constraint:constraint-layout:1.0.0-beta4' + compile 'com.android.support.constraint:constraint-layout:1.0.0' compile 'com.android.support:multidex:1.0.1' @@ -127,7 +127,7 @@ dependencies { compile 'com.squareup.okio:okio:1.11.0' // REST - final retrofit_version = '2.1.0' + final retrofit_version = '2.2.0' compile "com.squareup.retrofit2:retrofit:$retrofit_version" compile "com.squareup.retrofit2:converter-gson:$retrofit_version" compile "com.squareup.retrofit2:adapter-rxjava:$retrofit_version" @@ -151,13 +151,13 @@ dependencies { // Job scheduling compile 'com.evernote:android-job:1.1.6' - compile 'com.google.android.gms:play-services-gcm:10.0.1' + compile 'com.google.android.gms:play-services-gcm:10.2.0' // Changelog compile 'com.github.gabrielemariotti.changeloglib:changelog:2.1.0' // Database - compile "com.pushtorefresh.storio:sqlite:1.12.2" + compile "com.pushtorefresh.storio:sqlite:1.12.3" // Model View Presenter final nucleus_version = '3.0.0' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3881d5b3d3..6a536ee6ce 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -98,9 +98,6 @@ android:name=".data.download.DownloadService" android:exported="false" /> - diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/database/models/Track.kt b/app/src/main/java/eu/kanade/tachiyomi/data/database/models/Track.kt index ce04b53039..5068f899e4 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/database/models/Track.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/database/models/Track.kt @@ -22,8 +22,6 @@ interface Track : Serializable { var status: Int - var update: Boolean - fun copyPersonalFrom(other: Track) { last_chapter_read = other.last_chapter_read score = other.score diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/database/models/TrackImpl.kt b/app/src/main/java/eu/kanade/tachiyomi/data/database/models/TrackImpl.kt index f94c85993d..4ae4723aa8 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/database/models/TrackImpl.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/database/models/TrackImpl.kt @@ -20,8 +20,6 @@ class TrackImpl : Track { override var status: Int = 0 - override var update: Boolean = false - override fun equals(other: Any?): Boolean { if (this === other) return true if (other == null || javaClass != other.javaClass) return false diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/TrackUpdateService.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/TrackUpdateService.kt deleted file mode 100644 index 06609cfc62..0000000000 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/TrackUpdateService.kt +++ /dev/null @@ -1,74 +0,0 @@ -package eu.kanade.tachiyomi.data.track - -import android.app.Service -import android.content.Context -import android.content.Intent -import android.os.IBinder -import eu.kanade.tachiyomi.data.database.DatabaseHelper -import eu.kanade.tachiyomi.data.database.models.Track -import rx.Observable -import rx.android.schedulers.AndroidSchedulers -import rx.schedulers.Schedulers -import rx.subscriptions.CompositeSubscription -import uy.kohesive.injekt.injectLazy - -class TrackUpdateService : Service() { - - val trackManager: TrackManager by injectLazy() - val db: DatabaseHelper by injectLazy() - - private lateinit var subscriptions: CompositeSubscription - - override fun onCreate() { - super.onCreate() - subscriptions = CompositeSubscription() - } - - override fun onDestroy() { - subscriptions.unsubscribe() - super.onDestroy() - } - - override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int { - val track = intent.getSerializableExtra(EXTRA_TRACK) - if (track != null) { - updateLastChapterRead(track as Track, startId) - return Service.START_REDELIVER_INTENT - } else { - stopSelf(startId) - return Service.START_NOT_STICKY - } - } - - override fun onBind(intent: Intent): IBinder? { - return null - } - - private fun updateLastChapterRead(track: Track, startId: Int) { - val sync = trackManager.getService(track.sync_id) - if (sync == null) { - stopSelf(startId) - return - } - - subscriptions.add(Observable.defer { sync.update(track) } - .flatMap { db.insertTrack(track).asRxObservable() } - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ stopSelf(startId) }, - { stopSelf(startId) })) - } - - companion object { - - private val EXTRA_TRACK = "extra_track" - - @JvmStatic - fun start(context: Context, track: Track) { - val intent = Intent(context, TrackUpdateService::class.java) - intent.putExtra(EXTRA_TRACK, track) - context.startService(intent) - } - } - -} diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackFragment.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackFragment.kt index fa4feb475b..017ef8703a 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackFragment.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackFragment.kt @@ -45,7 +45,7 @@ class TrackFragment : BaseRxFragment() { private fun findSearchFragmentIfNeeded() { if (dialog == null) { - dialog = childFragmentManager.findFragmentByTag(searchFragmentTag) as TrackSearchDialog + dialog = childFragmentManager.findFragmentByTag(searchFragmentTag) as? TrackSearchDialog } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt index 36b121b526..11b27c6238 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt @@ -171,11 +171,11 @@ class ReaderActivity : BaseRxActivity() { .content(getString(R.string.confirm_update_manga_sync, chapterToUpdate)) .positiveText(android.R.string.yes) .negativeText(android.R.string.no) - .onPositive { dialog, which -> presenter.updateTrackLastChapterRead() } + .onPositive { dialog, which -> presenter.updateTrackLastChapterRead(chapterToUpdate) } .onAny { dialog1, which1 -> super.onBackPressed() } .show() } else { - presenter.updateTrackLastChapterRead() + presenter.updateTrackLastChapterRead(chapterToUpdate) super.onBackPressed() } } else { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.kt index 860371cf70..56bcdc9343 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.kt @@ -14,7 +14,6 @@ import eu.kanade.tachiyomi.data.database.models.Track import eu.kanade.tachiyomi.data.download.DownloadManager import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.track.TrackManager -import eu.kanade.tachiyomi.data.track.TrackUpdateService import eu.kanade.tachiyomi.source.LocalSource import eu.kanade.tachiyomi.source.SourceManager import eu.kanade.tachiyomi.source.model.Page @@ -452,27 +451,31 @@ class ReaderPresenter : BasePresenter() { Math.floor(chapter.chapter_number.toDouble()).toInt() else if (prevChapter != null && prevChapter.read) Math.floor(prevChapter.chapter_number.toDouble()).toInt() + else + return 0 + + return if (trackList.any { lastChapterRead > it.last_chapter_read }) + lastChapterRead else 0 - - trackList.forEach { sync -> - if (lastChapterRead > sync.last_chapter_read) { - sync.last_chapter_read = lastChapterRead - sync.update = true - } - } - - return if (trackList.any { it.update }) lastChapterRead else 0 } /** * Starts the service that updates the last chapter read in sync services */ - fun updateTrackLastChapterRead() { - trackList?.forEach { sync -> - val service = trackManager.getService(sync.sync_id) - if (service != null && service.isLogged && sync.update) { - TrackUpdateService.start(context, sync) + fun updateTrackLastChapterRead(lastChapterRead: Int) { + trackList?.forEach { track -> + val service = trackManager.getService(track.sync_id) + if (service != null && service.isLogged && lastChapterRead > track.last_chapter_read) { + track.last_chapter_read = lastChapterRead + + // We wan't these to execute even if the presenter is destroyed and leaks for a + // while. The view can still be garbage collected. + Observable.defer { service.update(track) } + .map { db.insertTrack(track).executeAsBlocking() } + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe({}, { Timber.e(it) }) } } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/recent_updates/RecentChaptersAdapter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/recent_updates/RecentChaptersAdapter.kt index 61c4ac3b0a..ebd1b7e694 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/recent_updates/RecentChaptersAdapter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/recent_updates/RecentChaptersAdapter.kt @@ -1,9 +1,10 @@ package eu.kanade.tachiyomi.ui.recent_updates import eu.davidea.flexibleadapter.FlexibleAdapter +import eu.davidea.flexibleadapter.items.IFlexible class RecentChaptersAdapter(val fragment: RecentChaptersFragment) : - FlexibleAdapter(null, fragment, true) { + FlexibleAdapter>(null, fragment, true) { init { setDisplayHeadersAtStartUp(true) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/recent_updates/RecentChaptersFragment.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/recent_updates/RecentChaptersFragment.kt index db100abf97..607f732b95 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/recent_updates/RecentChaptersFragment.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/recent_updates/RecentChaptersFragment.kt @@ -9,6 +9,7 @@ import android.support.v7.widget.RecyclerView import android.view.* import com.afollestad.materialdialogs.MaterialDialog import eu.davidea.flexibleadapter.FlexibleAdapter +import eu.davidea.flexibleadapter.items.IFlexible import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.download.model.Download import eu.kanade.tachiyomi.data.library.LibraryUpdateService @@ -116,7 +117,7 @@ class RecentChaptersFragment: * @return list of selected chapters */ fun getSelectedChapters(): List { - return adapter.selectedPositions.mapNotNull { adapter.getItem(it) } + return adapter.selectedPositions.mapNotNull { adapter.getItem(it) as? RecentChapterItem } } /** @@ -125,7 +126,7 @@ class RecentChaptersFragment: */ override fun onItemClick(position: Int): Boolean { // Get item from position - val item = adapter.getItem(position) + val item = adapter.getItem(position) as? RecentChapterItem ?: return false if (actionMode != null && adapter.mode == FlexibleAdapter.MODE_MULTI) { toggleSelection(position) return true @@ -183,7 +184,7 @@ class RecentChaptersFragment: * Populate adapter with chapters * @param chapters list of [Any] */ - fun onNextRecentChapters(chapters: List) { + fun onNextRecentChapters(chapters: List>) { (activity as MainActivity).updateEmptyView(chapters.isEmpty(), R.string.information_no_recent, R.drawable.ic_update_black_128dp) @@ -291,6 +292,8 @@ class RecentChaptersFragment: * @param item item from ActionMode. */ override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean { + if (!isAdded) return true + when (item.itemId) { R.id.action_mark_as_read -> markAsRead(getSelectedChapters()) R.id.action_mark_as_unread -> markAsUnread(getSelectedChapters()) diff --git a/app/src/main/res/layout/item_track.xml b/app/src/main/res/layout/item_track.xml index 4260f4c0e4..d05955c750 100644 --- a/app/src/main/res/layout/item_track.xml +++ b/app/src/main/res/layout/item_track.xml @@ -28,7 +28,7 @@ - + android:text="@string/title"/> - + - - + - - + - - +