mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-10-30 22:07:57 +01:00 
			
		
		
		
	Add an option to automatically update last chapter read and another one to ask before updating. Fixes #10
This commit is contained in:
		| @@ -38,6 +38,8 @@ public class MangaSync implements Serializable { | ||||
|     @StorIOSQLiteColumn(name = MangaSyncTable.COLUMN_STATUS) | ||||
|     public int status; | ||||
|  | ||||
|     public boolean update; | ||||
|  | ||||
|     public static MangaSync create(MangaSyncService service) { | ||||
|         MangaSync mangasync = new MangaSync(); | ||||
|         mangasync.sync_id = service.getId(); | ||||
|   | ||||
| @@ -101,6 +101,14 @@ public class PreferencesHelper { | ||||
|         return prefs.getBoolean(getKey(R.string.pref_update_only_non_completed_key), false); | ||||
|     } | ||||
|  | ||||
|     public boolean autoUpdateMangaSync() { | ||||
|         return prefs.getBoolean(getKey(R.string.pref_auto_update_manga_sync_key), true); | ||||
|     } | ||||
|  | ||||
|     public boolean askUpdateMangaSync() { | ||||
|         return prefs.getBoolean(getKey(R.string.pref_ask_update_manga_sync_key), false); | ||||
|     } | ||||
|  | ||||
|     public Preference<Integer> imageDecoder() { | ||||
|         return rxPrefs.getInteger(getKey(R.string.pref_image_decoder_key), 0); | ||||
|     } | ||||
|   | ||||
| @@ -81,8 +81,6 @@ public class LibraryPresenter extends BasePresenter<LibraryFragment> { | ||||
|                         .toMap(pair -> pair.first, pair -> pair.second)); | ||||
|     } | ||||
|  | ||||
|  | ||||
|  | ||||
|     public void onOpenManga(Manga manga) { | ||||
|         // Avoid further db updates for the library when it's not needed | ||||
|         stop(GET_LIBRARY); | ||||
|   | ||||
| @@ -16,6 +16,8 @@ import android.view.View; | ||||
| import android.view.WindowManager; | ||||
| import android.widget.TextView; | ||||
|  | ||||
| import com.afollestad.materialdialogs.MaterialDialog; | ||||
|  | ||||
| import java.util.List; | ||||
|  | ||||
| import javax.inject.Inject; | ||||
| @@ -126,6 +128,36 @@ public class ReaderActivity extends BaseRxActivity<ReaderPresenter> { | ||||
|         super.onSaveInstanceState(outState); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onBackPressed() { | ||||
|         if (viewer != null) | ||||
|             getPresenter().setCurrentPage(viewer.getCurrentPage()); | ||||
|         getPresenter().onChapterLeft(); | ||||
|  | ||||
|         int chapterToUpdate = getPresenter().getMangaSyncChapterToUpdate(); | ||||
|  | ||||
|         if (chapterToUpdate > 0) { | ||||
|             if (getPresenter().prefs.askUpdateMangaSync()) { | ||||
|                 new MaterialDialog.Builder(this) | ||||
|                         .content(getString(R.string.confirm_update_manga_sync, chapterToUpdate)) | ||||
|                         .positiveText(R.string.button_yes) | ||||
|                         .negativeText(R.string.button_no) | ||||
|                         .onPositive((dialog, which) -> { | ||||
|                             getPresenter().updateMangaSyncLastChapterRead(); | ||||
|                         }) | ||||
|                         .onAny((dialog1, which1) -> { | ||||
|                             finish(); | ||||
|                         }) | ||||
|                         .show(); | ||||
|             } else { | ||||
|                 getPresenter().updateMangaSyncLastChapterRead(); | ||||
|                 finish(); | ||||
|             } | ||||
|         } else { | ||||
|             super.onBackPressed(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public void onChapterError() { | ||||
|         finish(); | ||||
|         ToastUtil.showShort(this, R.string.page_list_error); | ||||
|   | ||||
| @@ -13,6 +13,7 @@ import de.greenrobot.event.EventBus; | ||||
| import eu.kanade.mangafeed.data.database.DatabaseHelper; | ||||
| import eu.kanade.mangafeed.data.database.models.Chapter; | ||||
| import eu.kanade.mangafeed.data.database.models.Manga; | ||||
| import eu.kanade.mangafeed.data.database.models.MangaSync; | ||||
| import eu.kanade.mangafeed.data.download.DownloadManager; | ||||
| import eu.kanade.mangafeed.data.mangasync.MangaSyncManager; | ||||
| import eu.kanade.mangafeed.data.mangasync.base.MangaSyncService; | ||||
| @@ -49,6 +50,7 @@ public class ReaderPresenter extends BasePresenter<ReaderActivity> { | ||||
|     private Chapter previousChapter; | ||||
|     private List<Page> pageList; | ||||
|     private List<Page> nextChapterPageList; | ||||
|     private List<MangaSync> mangaSyncList; | ||||
|  | ||||
|     private PublishSubject<Page> retryPageSubject; | ||||
|  | ||||
| @@ -57,6 +59,7 @@ public class ReaderPresenter extends BasePresenter<ReaderActivity> { | ||||
|     private static final int GET_ADJACENT_CHAPTERS = 3; | ||||
|     private static final int RETRY_IMAGES = 4; | ||||
|     private static final int PRELOAD_NEXT_CHAPTER = 5; | ||||
|     private static final int GET_MANGA_SYNC = 6; | ||||
|  | ||||
|     @Override | ||||
|     protected void onCreate(Bundle savedState) { | ||||
| @@ -99,22 +102,22 @@ public class ReaderPresenter extends BasePresenter<ReaderActivity> { | ||||
|                 (view, pages) -> view.onChapterReady(pages, manga, chapter, currentPage), | ||||
|                 (view, error) -> view.onChapterError()); | ||||
|  | ||||
|         restartableFirst(GET_MANGA_SYNC, this::getMangaSyncObservable, | ||||
|                 (view, mangaSync) -> {}, | ||||
|                 (view, error) -> {}); | ||||
|  | ||||
|         registerForStickyEvents(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     protected void onDestroy() { | ||||
|         unregisterForEvents(); | ||||
|         onChapterLeft(); | ||||
|         updateMangaSyncLastChapterRead(); | ||||
|         super.onDestroy(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     protected void onSave(@NonNull Bundle state) { | ||||
|         if (pageList != null && !isDownloaded) | ||||
|             source.savePageList(chapter.url, pageList); | ||||
|  | ||||
|         onChapterLeft(); | ||||
|         super.onSave(state); | ||||
|     } | ||||
|  | ||||
| @@ -135,6 +138,9 @@ public class ReaderPresenter extends BasePresenter<ReaderActivity> { | ||||
|         source = event.getSource(); | ||||
|         sourceId = source.getId(); | ||||
|         loadChapter(event.getChapter()); | ||||
|         if (prefs.autoUpdateMangaSync()) { | ||||
|             start(GET_MANGA_SYNC); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // Returns the page list of a chapter | ||||
| @@ -204,6 +210,11 @@ public class ReaderPresenter extends BasePresenter<ReaderActivity> { | ||||
|                 .doOnCompleted(this::stopPreloadingNextChapter); | ||||
|     } | ||||
|  | ||||
|     private Observable<List<MangaSync>> getMangaSyncObservable() { | ||||
|         return db.getMangasSync(manga).createObservable() | ||||
|                 .doOnNext(mangaSync -> this.mangaSyncList = mangaSync); | ||||
|     } | ||||
|  | ||||
|     // Loads the given chapter | ||||
|     private void loadChapter(Chapter chapter) { | ||||
|         // Before loading the chapter, stop preloading (if it's working) and save current progress | ||||
| @@ -238,11 +249,11 @@ public class ReaderPresenter extends BasePresenter<ReaderActivity> { | ||||
|  | ||||
|     // Called before loading another chapter or leaving the reader. It allows to do operations | ||||
|     // over the chapter read like saving progress | ||||
|     private void onChapterLeft() { | ||||
|     public void onChapterLeft() { | ||||
|         if (pageList == null) | ||||
|             return; | ||||
|  | ||||
|         // Cache page list for online chapters to allow a faster reopen | ||||
|         // Cache current page list progress for online chapters to allow a faster reopen | ||||
|         if (!isDownloaded) | ||||
|             source.savePageList(chapter.url, pageList); | ||||
|  | ||||
| @@ -259,33 +270,39 @@ public class ReaderPresenter extends BasePresenter<ReaderActivity> { | ||||
|         return !chapter.read && currentPage == pageList.size() - 1; | ||||
|     } | ||||
|  | ||||
|     private void updateMangaSyncLastChapterRead() { | ||||
|         if (pageList == null) | ||||
|             return; | ||||
|     public int getMangaSyncChapterToUpdate() { | ||||
|         if (pageList == null || mangaSyncList == null || mangaSyncList.isEmpty()) | ||||
|             return 0; | ||||
|  | ||||
|         db.getMangasSync(manga).createObservable() | ||||
|                 .take(1) | ||||
|                 .flatMap(Observable::from) | ||||
|                 .doOnNext(mangaSync -> { | ||||
|                     MangaSyncService service = syncManager.getSyncService(mangaSync.sync_id); | ||||
|                     if (!service.isLogged()) | ||||
|                         return; | ||||
|         int lastChapterReadLocal = 0; | ||||
|         // If the current chapter has been read, we check with this one | ||||
|         if (chapter.read) | ||||
|             lastChapterReadLocal = (int) Math.floor(chapter.chapter_number); | ||||
|         // If not, we check if the previous chapter has been read | ||||
|         else if (previousChapter != null && previousChapter.read) | ||||
|             lastChapterReadLocal = (int) Math.floor(previousChapter.chapter_number); | ||||
|  | ||||
|                     int lastChapterReadLocal = 0; | ||||
|                     // If the current chapter has been read, we check with this one | ||||
|                     if (chapter.read) | ||||
|                         lastChapterReadLocal = (int) Math.floor(chapter.chapter_number); | ||||
|                     // If not, we check if the previous chapter has been read | ||||
|                     else if (previousChapter != null && previousChapter.read) | ||||
|                         lastChapterReadLocal = (int) Math.floor(previousChapter.chapter_number); | ||||
|         // We know the chapter we have to check, but we don't know yet if an update is required. | ||||
|         // This boolean is used to return 0 if no update is required | ||||
|         boolean hasToUpdate = false; | ||||
|  | ||||
|                     if (lastChapterReadLocal > mangaSync.last_chapter_read) { | ||||
|                         mangaSync.last_chapter_read = lastChapterReadLocal; | ||||
|                         UpdateMangaSyncService.start(getContext(), mangaSync); | ||||
|                     } | ||||
|                 }) | ||||
|                 .subscribe(next -> {}, | ||||
|                         error -> Timber.e(error.getCause(), error.getMessage())); | ||||
|         for (MangaSync mangaSync : mangaSyncList) { | ||||
|             if (lastChapterReadLocal > mangaSync.last_chapter_read) { | ||||
|                 mangaSync.last_chapter_read = lastChapterReadLocal; | ||||
|                 mangaSync.update = true; | ||||
|                 hasToUpdate = true; | ||||
|             } | ||||
|         } | ||||
|         return hasToUpdate ? lastChapterReadLocal : 0; | ||||
|     } | ||||
|  | ||||
|     public void updateMangaSyncLastChapterRead() { | ||||
|         for (MangaSync mangaSync : mangaSyncList) { | ||||
|             MangaSyncService service = syncManager.getSyncService(mangaSync.sync_id); | ||||
|             if (service.isLogged() && mangaSync.update) { | ||||
|                 UpdateMangaSyncService.start(getContext(), mangaSync); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public void setCurrentPage(int currentPage) { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user