浏览代码

Update dependencies. Update last chapter read in MAL only when the reader is left, instead of on every chapter change. Other minor improvements.

inorichi 9 年之前
父节点
当前提交
04d9176c3c

+ 6 - 8
app/build.gradle

@@ -79,7 +79,6 @@ dependencies {
     final HAMCREST_VERSION = '1.3'
     final MOCKITO_VERSION = '1.10.19'
     final STORIO_VERSION = '1.6.1'
-    final NUCLEUS_VERSION = '2.0.3'
     final ICEPICK_VERSION = '3.1.0'
 
     compile fileTree(dir: 'libs', include: ['*.jar'])
@@ -90,25 +89,24 @@ dependencies {
     compile "com.android.support:design:$SUPPORT_LIBRARY_VERSION"
     compile "com.android.support:recyclerview-v7:$SUPPORT_LIBRARY_VERSION"
     compile "com.android.support:support-annotations:$SUPPORT_LIBRARY_VERSION"
-    compile 'com.squareup.okhttp:okhttp-urlconnection:2.6.0'
-    compile 'com.squareup.okhttp:okhttp:2.6.0'
+    compile 'com.squareup.okhttp:okhttp-urlconnection:2.7.0'
+    compile 'com.squareup.okhttp:okhttp:2.7.0'
     compile 'com.squareup.okio:okio:1.6.0'
     compile 'com.google.code.gson:gson:2.4'
     compile 'com.jakewharton:disklrucache:2.0.2'
     compile 'org.jsoup:jsoup:1.8.3'
-    compile 'io.reactivex:rxandroid:1.0.1'
+    compile 'io.reactivex:rxandroid:1.1.0'
     compile 'io.reactivex:rxjava:1.1.0'
     compile 'com.f2prateek.rx.preferences:rx-preferences:1.0.1'
     compile "com.pushtorefresh.storio:sqlite:$STORIO_VERSION"
     compile "com.pushtorefresh.storio:sqlite-annotations:$STORIO_VERSION"
-    compile "info.android15.nucleus:nucleus:$NUCLEUS_VERSION"
+    compile 'info.android15.nucleus:nucleus:2.0.4'
     compile 'de.greenrobot:eventbus:2.4.0'
     compile 'com.github.bumptech.glide:glide:3.6.1'
     compile 'com.jakewharton:butterknife:7.0.1'
     compile 'com.jakewharton.timber:timber:4.1.0'
     compile 'uk.co.ribot:easyadapter:1.5.0@aar'
-    compile 'ch.acra:acra:4.6.2'
-    compile 'com.github.castorflex.verticalviewpager:library:19.0.1'
+    compile 'ch.acra:acra:4.7.0'
     compile 'com.davemorrissey.labs:subsampling-scale-image-view:3.4.1'
     compile "frankiesardo:icepick:$ICEPICK_VERSION"
     provided "frankiesardo:icepick-processor:$ICEPICK_VERSION"
@@ -121,7 +119,7 @@ dependencies {
     apt "com.pushtorefresh.storio:sqlite-annotations-processor:$STORIO_VERSION"
     provided 'org.glassfish:javax.annotation:10.0-b28'
 
-    compile('com.mikepenz:materialdrawer:4.4.8@aar') {
+    compile('com.mikepenz:materialdrawer:4.5.9@aar') {
         transitive = true
     }
     compile('com.github.afollestad.material-dialogs:core:0.8.5.2@aar') {

+ 13 - 3
app/src/main/java/eu/kanade/mangafeed/data/database/DatabaseHelper.java

@@ -17,7 +17,7 @@ import com.pushtorefresh.storio.sqlite.queries.RawQuery;
 import java.util.List;
 
 import eu.kanade.mangafeed.data.database.models.MangaSync;
-import eu.kanade.mangafeed.data.mangasync.base.BaseMangaSync;
+import eu.kanade.mangafeed.data.mangasync.base.MangaSyncService;
 import eu.kanade.mangafeed.data.database.models.Chapter;
 import eu.kanade.mangafeed.data.database.models.ChapterStorIOSQLiteDeleteResolver;
 import eu.kanade.mangafeed.data.database.models.ChapterStorIOSQLiteGetResolver;
@@ -303,8 +303,7 @@ public class DatabaseHelper {
 
     // Manga sync related queries
 
-    public PreparedGetListOfObjects<MangaSync> getMangaSync(Manga manga, BaseMangaSync sync) {
-
+    public PreparedGetListOfObjects<MangaSync> getMangaSync(Manga manga, MangaSyncService sync) {
         return db.get()
                 .listOfObjects(MangaSync.class)
                 .withQuery(Query.builder()
@@ -316,6 +315,17 @@ public class DatabaseHelper {
                 .prepare();
     }
 
+    public PreparedGetListOfObjects<MangaSync> getMangaSync(Manga manga) {
+        return db.get()
+                .listOfObjects(MangaSync.class)
+                .withQuery(Query.builder()
+                        .table(MangaSyncTable.TABLE)
+                        .where(MangaSyncTable.COLUMN_MANGA_ID + "=?")
+                        .whereArgs(manga.id)
+                        .build())
+                .prepare();
+    }
+
     public PreparedPutObject<MangaSync> insertMangaSync(MangaSync manga) {
         return db.put()
                 .object(manga)

+ 5 - 3
app/src/main/java/eu/kanade/mangafeed/data/database/models/MangaSync.java

@@ -3,11 +3,13 @@ package eu.kanade.mangafeed.data.database.models;
 import com.pushtorefresh.storio.sqlite.annotations.StorIOSQLiteColumn;
 import com.pushtorefresh.storio.sqlite.annotations.StorIOSQLiteType;
 
-import eu.kanade.mangafeed.data.mangasync.base.BaseMangaSync;
+import java.io.Serializable;
+
+import eu.kanade.mangafeed.data.mangasync.base.MangaSyncService;
 import eu.kanade.mangafeed.data.database.tables.MangaSyncTable;
 
 @StorIOSQLiteType(table = MangaSyncTable.TABLE)
-public class MangaSync {
+public class MangaSync implements Serializable {
 
     @StorIOSQLiteColumn(name = MangaSyncTable.COLUMN_ID, key = true)
     public Long id;
@@ -33,7 +35,7 @@ public class MangaSync {
     @StorIOSQLiteColumn(name = MangaSyncTable.COLUMN_STATUS)
     public int status;
 
-    public static MangaSync create(BaseMangaSync service) {
+    public static MangaSync create(MangaSyncService service) {
         MangaSync mangasync = new MangaSync();
         mangasync.sync_id = service.getId();
         return mangasync;

+ 4 - 4
app/src/main/java/eu/kanade/mangafeed/data/mangasync/MangaSyncManager.java

@@ -5,12 +5,12 @@ import android.content.Context;
 import java.util.ArrayList;
 import java.util.List;
 
-import eu.kanade.mangafeed.data.mangasync.base.BaseMangaSync;
+import eu.kanade.mangafeed.data.mangasync.base.MangaSyncService;
 import eu.kanade.mangafeed.data.mangasync.services.MyAnimeList;
 
 public class MangaSyncManager {
 
-    private List<BaseMangaSync> services;
+    private List<MangaSyncService> services;
     private MyAnimeList myAnimeList;
 
     public static final int MYANIMELIST = 1;
@@ -25,11 +25,11 @@ public class MangaSyncManager {
         return myAnimeList;
     }
 
-    public List<BaseMangaSync> getSyncServices() {
+    public List<MangaSyncService> getSyncServices() {
         return services;
     }
 
-    public BaseMangaSync getSyncService(int id) {
+    public MangaSyncService getSyncService(int id) {
         switch (id) {
             case MYANIMELIST:
                 return myAnimeList;

+ 1 - 1
app/src/main/java/eu/kanade/mangafeed/data/mangasync/base/BaseMangaSync.java → app/src/main/java/eu/kanade/mangafeed/data/mangasync/base/MangaSyncService.java

@@ -5,7 +5,7 @@ import com.squareup.okhttp.Response;
 import eu.kanade.mangafeed.data.database.models.MangaSync;
 import rx.Observable;
 
-public abstract class BaseMangaSync {
+public abstract class MangaSyncService {
 
     // Name of the manga sync service to display
     public abstract String getName();

+ 2 - 2
app/src/main/java/eu/kanade/mangafeed/data/mangasync/services/MyAnimeList.java

@@ -22,12 +22,12 @@ import javax.inject.Inject;
 import eu.kanade.mangafeed.App;
 import eu.kanade.mangafeed.data.database.models.MangaSync;
 import eu.kanade.mangafeed.data.mangasync.MangaSyncManager;
-import eu.kanade.mangafeed.data.mangasync.base.BaseMangaSync;
+import eu.kanade.mangafeed.data.mangasync.base.MangaSyncService;
 import eu.kanade.mangafeed.data.network.NetworkHelper;
 import eu.kanade.mangafeed.data.preference.PreferencesHelper;
 import rx.Observable;
 
-public class MyAnimeList extends BaseMangaSync {
+public class MyAnimeList extends MangaSyncService {
 
     @Inject PreferencesHelper preferences;
     @Inject NetworkHelper networkService;

+ 4 - 4
app/src/main/java/eu/kanade/mangafeed/data/preference/PreferencesHelper.java

@@ -11,7 +11,7 @@ import com.f2prateek.rx.preferences.RxSharedPreferences;
 import java.io.File;
 
 import eu.kanade.mangafeed.R;
-import eu.kanade.mangafeed.data.mangasync.base.BaseMangaSync;
+import eu.kanade.mangafeed.data.mangasync.base.MangaSyncService;
 import eu.kanade.mangafeed.data.source.base.Source;
 import rx.Observable;
 
@@ -106,15 +106,15 @@ public class PreferencesHelper {
                 .apply();
     }
 
-    public String getMangaSyncUsername(BaseMangaSync sync) {
+    public String getMangaSyncUsername(MangaSyncService sync) {
         return prefs.getString(MANGASYNC_ACCOUNT_USERNAME + sync.getId(), "");
     }
 
-    public String getMangaSyncPassword(BaseMangaSync sync) {
+    public String getMangaSyncPassword(MangaSyncService sync) {
         return prefs.getString(MANGASYNC_ACCOUNT_PASSWORD + sync.getId(), "");
     }
 
-    public void setMangaSyncCredentials(BaseMangaSync sync, String username, String password) {
+    public void setMangaSyncCredentials(MangaSyncService sync, String username, String password) {
         prefs.edit()
                 .putString(MANGASYNC_ACCOUNT_USERNAME + sync.getId(), username)
                 .putString(MANGASYNC_ACCOUNT_PASSWORD + sync.getId(), password)

+ 15 - 18
app/src/main/java/eu/kanade/mangafeed/data/sync/UpdateMangaSyncService.java

@@ -7,14 +7,12 @@ import android.os.IBinder;
 
 import javax.inject.Inject;
 
-import de.greenrobot.event.EventBus;
 import eu.kanade.mangafeed.App;
 import eu.kanade.mangafeed.data.database.DatabaseHelper;
 import eu.kanade.mangafeed.data.database.models.MangaSync;
 import eu.kanade.mangafeed.data.mangasync.MangaSyncManager;
-import eu.kanade.mangafeed.data.mangasync.base.BaseMangaSync;
-import eu.kanade.mangafeed.event.UpdateMangaSyncEvent;
-import eu.kanade.mangafeed.util.EventBusHook;
+import eu.kanade.mangafeed.data.mangasync.base.MangaSyncService;
+import rx.Observable;
 import rx.android.schedulers.AndroidSchedulers;
 import rx.schedulers.Schedulers;
 import rx.subscriptions.CompositeSubscription;
@@ -26,8 +24,12 @@ public class UpdateMangaSyncService extends Service {
 
     private CompositeSubscription subscriptions;
 
-    public static void start(Context context) {
-        context.startService(new Intent(context, UpdateMangaSyncService.class));
+    private static final String EXTRA_MANGASYNC = "extra_mangasync";
+
+    public static void start(Context context, MangaSync mangaSync) {
+        Intent intent = new Intent(context, UpdateMangaSyncService.class);
+        intent.putExtra(EXTRA_MANGASYNC, mangaSync);
+        context.startService(intent);
     }
 
     @Override
@@ -35,17 +37,17 @@ public class UpdateMangaSyncService extends Service {
         super.onCreate();
         App.get(this).getComponent().inject(this);
         subscriptions = new CompositeSubscription();
-        EventBus.getDefault().registerSticky(this);
     }
 
     @Override
     public int onStartCommand(Intent intent, int flags, int startId) {
+        MangaSync mangaSync = (MangaSync) intent.getSerializableExtra(EXTRA_MANGASYNC);
+        updateLastChapterRead(mangaSync, startId);
         return START_STICKY;
     }
 
     @Override
     public void onDestroy() {
-        EventBus.getDefault().unregister(this);
         subscriptions.unsubscribe();
         super.onDestroy();
     }
@@ -55,22 +57,17 @@ public class UpdateMangaSyncService extends Service {
         return null;
     }
 
-    @EventBusHook
-    public void onEventMainThread(UpdateMangaSyncEvent event) {
-        updateLastChapteRead(event.getMangaSync());
-    }
-
-    private void updateLastChapteRead(MangaSync mangaSync) {
-        BaseMangaSync sync = syncManager.getSyncService(mangaSync.sync_id);
+    private void updateLastChapterRead(MangaSync mangaSync, int startId) {
+        MangaSyncService sync = syncManager.getSyncService(mangaSync.sync_id);
 
-        subscriptions.add(sync.update(mangaSync)
+        subscriptions.add(Observable.fromCallable(() -> sync.update(mangaSync))
                 .flatMap(response -> db.insertMangaSync(mangaSync).createObservable())
                 .subscribeOn(Schedulers.io())
                 .observeOn(AndroidSchedulers.mainThread())
                 .subscribe(result -> {
-                    stopSelf();
+                    stopSelf(startId);
                 }, error -> {
-                    stopSelf();
+                    stopSelf(startId);
                 }));
     }
 

+ 0 - 17
app/src/main/java/eu/kanade/mangafeed/event/UpdateMangaSyncEvent.java

@@ -1,17 +0,0 @@
-package eu.kanade.mangafeed.event;
-
-import eu.kanade.mangafeed.data.database.models.MangaSync;
-
-public class UpdateMangaSyncEvent {
-
-    private MangaSync mangaSync;
-
-    public UpdateMangaSyncEvent(MangaSync mangaSync) {
-        this.mangaSync = mangaSync;
-    }
-
-    public MangaSync getMangaSync() {
-        return mangaSync;
-    }
-
-}

+ 28 - 42
app/src/main/java/eu/kanade/mangafeed/ui/reader/ReaderPresenter.java

@@ -8,25 +8,22 @@ import java.util.List;
 import javax.inject.Inject;
 
 import de.greenrobot.event.EventBus;
-import eu.kanade.mangafeed.data.mangasync.MangaSyncManager;
-import eu.kanade.mangafeed.data.mangasync.services.MyAnimeList;
-import eu.kanade.mangafeed.data.sync.UpdateMangaSyncService;
 import eu.kanade.mangafeed.data.database.DatabaseHelper;
 import eu.kanade.mangafeed.data.database.models.Chapter;
-import eu.kanade.mangafeed.data.database.models.MangaSync;
 import eu.kanade.mangafeed.data.database.models.Manga;
 import eu.kanade.mangafeed.data.download.DownloadManager;
+import eu.kanade.mangafeed.data.mangasync.MangaSyncManager;
+import eu.kanade.mangafeed.data.mangasync.base.MangaSyncService;
 import eu.kanade.mangafeed.data.preference.PreferencesHelper;
 import eu.kanade.mangafeed.data.source.SourceManager;
 import eu.kanade.mangafeed.data.source.base.Source;
 import eu.kanade.mangafeed.data.source.model.Page;
+import eu.kanade.mangafeed.data.sync.UpdateMangaSyncService;
 import eu.kanade.mangafeed.event.ReaderEvent;
-import eu.kanade.mangafeed.event.UpdateMangaSyncEvent;
 import eu.kanade.mangafeed.ui.base.presenter.BasePresenter;
 import eu.kanade.mangafeed.util.EventBusHook;
 import icepick.State;
 import rx.Observable;
-import rx.Subscription;
 import rx.android.schedulers.AndroidSchedulers;
 import rx.schedulers.Schedulers;
 import rx.subjects.PublishSubject;
@@ -53,9 +50,6 @@ public class ReaderPresenter extends BasePresenter<ReaderActivity> {
 
     private PublishSubject<Page> retryPageSubject;
 
-    private Subscription nextChapterSubscription;
-    private Subscription previousChapterSubscription;
-
     private static final int GET_PAGE_LIST = 1;
     private static final int GET_PAGE_IMAGES = 2;
     private static final int RETRY_IMAGES = 3;
@@ -110,6 +104,9 @@ public class ReaderPresenter extends BasePresenter<ReaderActivity> {
     @Override
     protected void onDestroy() {
         unregisterForEvents();
+        if (pageList != null && isChapterFinished()) {
+            updateMangaSyncLastChapterRead();
+        }
         onChapterLeft();
         super.onDestroy();
     }
@@ -231,13 +228,11 @@ public class ReaderPresenter extends BasePresenter<ReaderActivity> {
             source.savePageList(chapter.url, pageList);
 
         // Save current progress of the chapter. Mark as read if the chapter is finished
-        // and update progress in remote services (like MyAnimeList)
         chapter.last_page_read = currentPage;
         if (isChapterFinished()) {
             chapter.read = true;
-            updateMangaSyncLastChapterRead();
         }
-        db.insertChapter(chapter).executeAsBlocking();
+        db.insertChapter(chapter).createObservable().subscribe();
     }
 
     // Check whether the chapter has been read
@@ -246,26 +241,23 @@ public class ReaderPresenter extends BasePresenter<ReaderActivity> {
     }
 
     private void updateMangaSyncLastChapterRead() {
-        // TODO don't use MAL methods for possible alternatives to MAL
-        MyAnimeList mal = syncManager.getMyAnimeList();
-
-        if (!mal.isLogged())
-            return;
-
-        List<MangaSync> result = db.getMangaSync(manga, mal).executeAsBlocking();
-        if (result.isEmpty())
-            return;
-
-        MangaSync mangaSync = result.get(0);
-
-        int lastChapterReadLocal = (int) Math.floor(chapter.chapter_number);
-        int lastChapterReadRemote = mangaSync.last_chapter_read;
-
-        if (lastChapterReadLocal > lastChapterReadRemote) {
-            mangaSync.last_chapter_read = lastChapterReadLocal;
-            EventBus.getDefault().postSticky(new UpdateMangaSyncEvent(mangaSync));
-            UpdateMangaSyncService.start(getContext());
-        }
+        db.getMangaSync(manga).createObservable()
+                .take(1)
+                .flatMap(Observable::from)
+                .doOnNext(mangaSync -> {
+                    MangaSyncService service = syncManager.getSyncService(mangaSync.sync_id);
+                    if (!service.isLogged())
+                        return;
+
+                    int lastChapterReadLocal = (int) Math.floor(chapter.chapter_number);
+                    int lastChapterReadRemote = mangaSync.last_chapter_read;
+
+                    if (lastChapterReadLocal > lastChapterReadRemote) {
+                        mangaSync.last_chapter_read = lastChapterReadLocal;
+                        UpdateMangaSyncService.start(getContext(), mangaSync);
+                    }
+                })
+                .subscribe();
     }
 
     public void setCurrentPage(int currentPage) {
@@ -273,20 +265,14 @@ public class ReaderPresenter extends BasePresenter<ReaderActivity> {
     }
 
     private void getAdjacentChapters() {
-        if (nextChapterSubscription != null)
-            remove(nextChapterSubscription);
-
-        add(nextChapterSubscription = db.getNextChapter(chapter).createObservable()
+        add(db.getNextChapter(chapter).createObservable()
+                .take(1)
                 .flatMap(Observable::from)
-                .subscribeOn(Schedulers.io())
                 .subscribe(result -> nextChapter = result));
 
-        if (previousChapterSubscription != null)
-            remove(previousChapterSubscription);
-
-        add(previousChapterSubscription = db.getPreviousChapter(chapter).createObservable()
+        add(db.getPreviousChapter(chapter).createObservable()
+                .take(1)
                 .flatMap(Observable::from)
-                .subscribeOn(Schedulers.io())
                 .subscribe(result -> previousChapter = result));
     }
 

+ 2 - 2
app/src/main/java/eu/kanade/mangafeed/ui/setting/SettingsAccountsFragment.java

@@ -12,7 +12,7 @@ import java.util.List;
 import javax.inject.Inject;
 
 import eu.kanade.mangafeed.App;
-import eu.kanade.mangafeed.data.mangasync.base.BaseMangaSync;
+import eu.kanade.mangafeed.data.mangasync.base.MangaSyncService;
 import eu.kanade.mangafeed.data.mangasync.MangaSyncManager;
 import eu.kanade.mangafeed.data.source.SourceManager;
 import eu.kanade.mangafeed.data.source.base.Source;
@@ -60,7 +60,7 @@ public class SettingsAccountsFragment extends SettingsNestedFragment {
         mangaSyncCategory.setTitle("Sync");
         screen.addPreference(mangaSyncCategory);
 
-        for (BaseMangaSync sync : syncManager.getSyncServices()) {
+        for (MangaSyncService sync : syncManager.getSyncServices()) {
             MangaSyncLoginDialog dialog = new MangaSyncLoginDialog(
                     screen.getContext(), preferences, sync);
             dialog.setTitle(sync.getName());

+ 3 - 3
app/src/main/java/eu/kanade/mangafeed/ui/setting/preference/MangaSyncLoginDialog.java

@@ -5,7 +5,7 @@ import android.content.DialogInterface;
 import android.view.View;
 
 import eu.kanade.mangafeed.R;
-import eu.kanade.mangafeed.data.mangasync.base.BaseMangaSync;
+import eu.kanade.mangafeed.data.mangasync.base.MangaSyncService;
 import eu.kanade.mangafeed.data.preference.PreferencesHelper;
 import eu.kanade.mangafeed.util.ToastUtil;
 import rx.android.schedulers.AndroidSchedulers;
@@ -13,9 +13,9 @@ import rx.schedulers.Schedulers;
 
 public class MangaSyncLoginDialog extends LoginDialogPreference {
 
-    private BaseMangaSync sync;
+    private MangaSyncService sync;
 
-    public MangaSyncLoginDialog(Context context, PreferencesHelper preferences, BaseMangaSync sync) {
+    public MangaSyncLoginDialog(Context context, PreferencesHelper preferences, MangaSyncService sync) {
         super(context, preferences);
         this.sync = sync;
     }

+ 1 - 1
build.gradle

@@ -8,7 +8,7 @@ buildscript {
     dependencies {
         classpath 'com.android.tools.build:gradle:1.5.0'
         classpath 'com.jakewharton.sdkmanager:gradle-plugin:0.12.+'
-        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.7'
+        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
         classpath 'me.tatarka:gradle-retrolambda:3.2.4'
         classpath 'com.github.ben-manes:gradle-versions-plugin:0.11.3'
         // NOTE: Do not place your application dependencies here; they belong