Pārlūkot izejas kodu

Rewrite the chapter insertion method. Create a wakelock until the library updates. Move custom preferences to widget package.

inorichi 10 gadi atpakaļ
vecāks
revīzija
e702be1a8d
18 mainītis faili ar 85 papildinājumiem un 108 dzēšanām
  1. 41 32
      app/src/main/java/eu/kanade/mangafeed/data/database/DatabaseHelper.java
  2. 0 2
      app/src/main/java/eu/kanade/mangafeed/data/source/online/english/Batoto.java
  3. 0 3
      app/src/main/java/eu/kanade/mangafeed/data/source/online/english/Kissmanga.java
  4. 0 2
      app/src/main/java/eu/kanade/mangafeed/data/source/online/english/Mangafox.java
  5. 0 2
      app/src/main/java/eu/kanade/mangafeed/data/source/online/english/Mangahere.java
  6. 28 18
      app/src/main/java/eu/kanade/mangafeed/data/sync/LibraryUpdateService.java
  7. 2 2
      app/src/main/java/eu/kanade/mangafeed/ui/manga/chapter/ChaptersPresenter.java
  8. 2 2
      app/src/main/java/eu/kanade/mangafeed/ui/setting/SettingsAccountsFragment.java
  9. 2 2
      app/src/main/java/eu/kanade/mangafeed/ui/setting/SettingsGeneralFragment.java
  10. 0 33
      app/src/main/java/eu/kanade/mangafeed/util/PostResult.java
  11. 1 1
      app/src/main/java/eu/kanade/mangafeed/widget/preference/IntListPreference.java
  12. 1 1
      app/src/main/java/eu/kanade/mangafeed/widget/preference/LibraryColumnsDialog.java
  13. 1 1
      app/src/main/java/eu/kanade/mangafeed/widget/preference/LoginDialogPreference.java
  14. 1 1
      app/src/main/java/eu/kanade/mangafeed/widget/preference/MangaSyncLoginDialog.java
  15. 1 1
      app/src/main/java/eu/kanade/mangafeed/widget/preference/SourceLoginDialog.java
  16. 1 1
      app/src/main/res/xml/pref_downloads.xml
  17. 2 2
      app/src/main/res/xml/pref_general.xml
  18. 2 2
      app/src/main/res/xml/pref_reader.xml

+ 41 - 32
app/src/main/java/eu/kanade/mangafeed/data/database/DatabaseHelper.java

@@ -1,6 +1,7 @@
 package eu.kanade.mangafeed.data.database;
 
 import android.content.Context;
+import android.util.Pair;
 
 import com.pushtorefresh.storio.Queries;
 import com.pushtorefresh.storio.sqlite.StorIOSQLite;
@@ -12,11 +13,11 @@ import com.pushtorefresh.storio.sqlite.operations.get.PreparedGetListOfObjects;
 import com.pushtorefresh.storio.sqlite.operations.get.PreparedGetObject;
 import com.pushtorefresh.storio.sqlite.operations.put.PreparedPutCollectionOfObjects;
 import com.pushtorefresh.storio.sqlite.operations.put.PreparedPutObject;
-import com.pushtorefresh.storio.sqlite.operations.put.PutResults;
 import com.pushtorefresh.storio.sqlite.queries.DeleteQuery;
 import com.pushtorefresh.storio.sqlite.queries.Query;
 import com.pushtorefresh.storio.sqlite.queries.RawQuery;
 
+import java.util.Date;
 import java.util.List;
 
 import eu.kanade.mangafeed.data.database.models.Category;
@@ -37,7 +38,6 @@ import eu.kanade.mangafeed.data.database.tables.MangaSyncTable;
 import eu.kanade.mangafeed.data.database.tables.MangaTable;
 import eu.kanade.mangafeed.data.mangasync.base.MangaSyncService;
 import eu.kanade.mangafeed.util.ChapterRecognition;
-import eu.kanade.mangafeed.util.PostResult;
 import rx.Observable;
 
 public class DatabaseHelper {
@@ -246,37 +246,46 @@ public class DatabaseHelper {
     }
 
     // Add new chapters or delete if the source deletes them
-    public Observable<PostResult> insertOrRemoveChapters(Manga manga, List<Chapter> chapters) {
-        for (Chapter chapter : chapters) {
-            chapter.manga_id = manga.id;
-        }
-
-        Observable<List<Chapter>> chapterList = Observable.create(subscriber -> {
-            subscriber.onNext(getChapters(manga).executeAsBlocking());
-            subscriber.onCompleted();
+    public Observable<Pair<Integer, Integer>> insertOrRemoveChapters(Manga manga, List<Chapter> sourceChapters) {
+        List<Chapter> dbChapters = getChapters(manga).executeAsBlocking();
+
+        Observable<List<Chapter>> newChapters = Observable.from(sourceChapters)
+                .filter(c -> !dbChapters.contains(c))
+                .doOnNext(c -> {
+                    c.manga_id = manga.id;
+                    c.date_fetch = new Date().getTime();
+                    ChapterRecognition.parseChapterNumber(c, manga);
+                })
+                .toList();
+
+        Observable<List<Chapter>> deletedChapters = Observable.from(dbChapters)
+                .filter(c -> !sourceChapters.contains(c))
+                .toList();
+
+        return Observable.zip(newChapters, deletedChapters, (toAdd, toDelete) -> {
+            int added = 0;
+            int deleted = 0;
+            db.internal().beginTransaction();
+            try {
+                if (!toAdd.isEmpty()) {
+                    // Set the date fetch for new items in reverse order to allow another sorting method.
+                    // Sources MUST return the chapters from most to less recent, which is common.
+                    for (int i = toAdd.size() - 1; i >= 0; i--) {
+                        toAdd.get(i).date_fetch = new Date().getTime();
+                    }
+                    added = insertChapters(toAdd).executeAsBlocking().numberOfInserts();
+                }
+
+                if (!toDelete.isEmpty()) {
+                    deleted = deleteChapters(toDelete).executeAsBlocking().results().size();
+                }
+
+                db.internal().setTransactionSuccessful();
+            } finally {
+                db.internal().endTransaction();
+            }
+            return Pair.create(added, deleted);
         });
-
-        Observable<Integer> newChaptersObs = chapterList
-                .flatMap(dbChapters -> Observable.from(chapters)
-                        .filter(c -> !dbChapters.contains(c))
-                        .map(c -> {
-                            ChapterRecognition.parseChapterNumber(c, manga);
-                            return c;
-                        })
-                        .toList()
-                        .flatMap(newChapters -> insertChapters(newChapters).createObservable())
-                        .map(PutResults::numberOfInserts));
-
-        Observable<Integer> deletedChaptersObs = chapterList
-                .flatMap(dbChapters -> Observable.from(dbChapters)
-                        .filter(c -> !chapters.contains(c))
-                        .toList()
-                        .flatMap(deletedChapters -> deleteChapters(deletedChapters).createObservable())
-                        .map(d -> d.results().size()));
-
-        return Observable.zip(newChaptersObs, deletedChaptersObs,
-                (insertions, deletions) -> new PostResult(0, insertions, deletions)
-        );
     }
 
     public PreparedDeleteObject<Chapter> deleteChapter(Chapter chapter) {

+ 0 - 2
app/src/main/java/eu/kanade/mangafeed/data/source/online/english/Batoto.java

@@ -232,8 +232,6 @@ public class Batoto extends LoginSource {
         if (dateElement != null) {
             chapter.date_upload = parseDateFromElement(dateElement);
         }
-        chapter.date_fetch = new Date().getTime();
-
         return chapter;
     }
 

+ 0 - 3
app/src/main/java/eu/kanade/mangafeed/data/source/online/english/Kissmanga.java

@@ -14,7 +14,6 @@ import org.jsoup.nodes.Element;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
-import java.util.Date;
 import java.util.List;
 import java.util.Locale;
 import java.util.regex.Matcher;
@@ -194,8 +193,6 @@ public class Kissmanga extends Source {
                 chapter.date_upload = new SimpleDateFormat("MM/dd/yyyy", Locale.ENGLISH).parse(date).getTime();
             } catch (ParseException e) { /* Ignore */ }
         }
-
-        chapter.date_fetch = new Date().getTime();
         return chapter;
     }
 

+ 0 - 2
app/src/main/java/eu/kanade/mangafeed/data/source/online/english/Mangafox.java

@@ -174,8 +174,6 @@ public class Mangafox extends Source {
         if (dateElement != null) {
             chapter.date_upload = parseUpdateFromElement(dateElement);
         }
-        chapter.date_fetch = new Date().getTime();
-
         return chapter;
     }
 

+ 0 - 2
app/src/main/java/eu/kanade/mangafeed/data/source/online/english/Mangahere.java

@@ -234,8 +234,6 @@ public class Mangahere extends Source {
         if (dateElement != null) {
             chapter.date_upload = parseDateFromElement(dateElement);
         }
-        chapter.date_fetch = new Date().getTime();
-
         return chapter;
     }
 

+ 28 - 18
app/src/main/java/eu/kanade/mangafeed/data/sync/LibraryUpdateService.java

@@ -5,6 +5,8 @@ import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.os.IBinder;
+import android.os.PowerManager;
+import android.util.Pair;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -22,7 +24,6 @@ import eu.kanade.mangafeed.data.source.SourceManager;
 import eu.kanade.mangafeed.util.AndroidComponentUtil;
 import eu.kanade.mangafeed.util.NetworkUtil;
 import eu.kanade.mangafeed.util.NotificationUtil;
-import eu.kanade.mangafeed.util.PostResult;
 import rx.Observable;
 import rx.Subscription;
 import rx.schedulers.Schedulers;
@@ -34,6 +35,7 @@ public class LibraryUpdateService extends Service {
     @Inject SourceManager sourceManager;
     @Inject PreferencesHelper preferences;
 
+    private PowerManager.WakeLock wakeLock;
     private Subscription subscription;
 
     public static final int UPDATE_NOTIFICATION_ID = 1;
@@ -56,6 +58,7 @@ public class LibraryUpdateService extends Service {
     public void onCreate() {
         super.onCreate();
         App.get(this).getComponent().inject(this);
+        createAndAcquireWakeLock();
     }
 
     @Override
@@ -64,6 +67,7 @@ public class LibraryUpdateService extends Service {
             subscription.unsubscribe();
         // Reset the alarm
         LibraryUpdateAlarm.startAlarm(this);
+        destroyWakeLock();
         super.onDestroy();
     }
 
@@ -111,17 +115,18 @@ public class LibraryUpdateService extends Service {
                 .concatMap(manga -> updateManga(manga)
                         .onErrorReturn(error -> {
                             failedUpdates.add(manga);
-                            return new PostResult(0, 0, 0);
+                            return Pair.create(0, 0);
                         })
-                        .filter(result -> result.getNumberOfRowsInserted() > 0)
-                        .map(result -> new MangaUpdate(manga, result)))
+                        // Filter out mangas without new chapters
+                        .filter(pair -> pair.first > 0)
+                        .map(pair -> new MangaUpdate(manga, pair.first)))
                 .doOnNext(updates::add)
                 .doOnCompleted(() -> NotificationUtil.createBigText(this, UPDATE_NOTIFICATION_ID,
                         getString(R.string.notification_update_completed),
                         getUpdatedMangas(updates, failedUpdates)));
     }
 
-    private Observable<PostResult> updateManga(Manga manga) {
+    private Observable<Pair<Integer, Integer>> updateManga(Manga manga) {
         return sourceManager.get(manga.source)
                 .pullChaptersFromNetwork(manga.url)
                 .flatMap(chapters -> db.insertOrRemoveChapters(manga, chapters));
@@ -135,7 +140,7 @@ public class LibraryUpdateService extends Service {
             result.append(getString(R.string.notification_new_chapters));
 
             for (MangaUpdate update : updates) {
-                result.append("\n").append(update.getManga().title);
+                result.append("\n").append(update.manga.title);
             }
         }
         if (!failedUpdates.isEmpty()) {
@@ -154,6 +159,19 @@ public class LibraryUpdateService extends Service {
         return null;
     }
 
+    private void createAndAcquireWakeLock() {
+        wakeLock = ((PowerManager)getSystemService(POWER_SERVICE)).newWakeLock(
+                PowerManager.PARTIAL_WAKE_LOCK, "LibraryUpdateService:WakeLock");
+        wakeLock.acquire();
+    }
+
+    private void destroyWakeLock() {
+        if (wakeLock != null && wakeLock.isHeld()) {
+            wakeLock.release();
+            wakeLock = null;
+        }
+    }
+
     public static class SyncOnConnectionAvailable extends BroadcastReceiver {
 
         @Override
@@ -169,20 +187,12 @@ public class LibraryUpdateService extends Service {
     }
 
     private static class MangaUpdate {
-        private Manga manga;
-        private PostResult result;
+        public Manga manga;
+        public int newChapters;
 
-        public MangaUpdate(Manga manga, PostResult result) {
+        public MangaUpdate(Manga manga, int newChapters) {
             this.manga = manga;
-            this.result = result;
-        }
-
-        public Manga getManga() {
-            return manga;
-        }
-
-        public PostResult getResult() {
-            return result;
+            this.newChapters = newChapters;
         }
     }
 

+ 2 - 2
app/src/main/java/eu/kanade/mangafeed/ui/manga/chapter/ChaptersPresenter.java

@@ -1,6 +1,7 @@
 package eu.kanade.mangafeed.ui.manga.chapter;
 
 import android.os.Bundle;
+import android.util.Pair;
 
 import java.util.List;
 
@@ -20,7 +21,6 @@ import eu.kanade.mangafeed.event.DownloadChaptersEvent;
 import eu.kanade.mangafeed.event.ReaderEvent;
 import eu.kanade.mangafeed.ui.base.presenter.BasePresenter;
 import eu.kanade.mangafeed.util.EventBusHook;
-import eu.kanade.mangafeed.util.PostResult;
 import rx.Observable;
 import rx.android.schedulers.AndroidSchedulers;
 import rx.schedulers.Schedulers;
@@ -119,7 +119,7 @@ public class ChaptersPresenter extends BasePresenter<ChaptersFragment> {
         chaptersSubject.onNext(chapters);
     }
 
-    private Observable<PostResult> getOnlineChaptersObs() {
+    private Observable<Pair<Integer, Integer>> getOnlineChaptersObs() {
         return source.pullChaptersFromNetwork(manga.url)
                 .subscribeOn(Schedulers.io())
                 .flatMap(chapters -> db.insertOrRemoveChapters(manga, chapters))

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

@@ -16,8 +16,8 @@ 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;
-import eu.kanade.mangafeed.ui.setting.preference.MangaSyncLoginDialog;
-import eu.kanade.mangafeed.ui.setting.preference.SourceLoginDialog;
+import eu.kanade.mangafeed.widget.preference.MangaSyncLoginDialog;
+import eu.kanade.mangafeed.widget.preference.SourceLoginDialog;
 import rx.Observable;
 
 public class SettingsAccountsFragment extends SettingsNestedFragment {

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

@@ -8,8 +8,8 @@ import android.view.ViewGroup;
 import eu.kanade.mangafeed.R;
 import eu.kanade.mangafeed.data.preference.PreferencesHelper;
 import eu.kanade.mangafeed.data.sync.LibraryUpdateAlarm;
-import eu.kanade.mangafeed.ui.setting.preference.IntListPreference;
-import eu.kanade.mangafeed.ui.setting.preference.LibraryColumnsDialog;
+import eu.kanade.mangafeed.widget.preference.IntListPreference;
+import eu.kanade.mangafeed.widget.preference.LibraryColumnsDialog;
 
 public class SettingsGeneralFragment extends SettingsNestedFragment {
 

+ 0 - 33
app/src/main/java/eu/kanade/mangafeed/util/PostResult.java

@@ -1,33 +0,0 @@
-package eu.kanade.mangafeed.util;
-
-import android.support.annotation.Nullable;
-
-public class PostResult {
-
-    @Nullable
-    private final Integer numberOfRowsUpdated;
-
-    @Nullable
-    private final Integer numberOfRowsInserted;
-
-    @Nullable
-    private final Integer numberOfRowsDeleted;
-
-    public PostResult(Integer numberOfRowsUpdated, Integer numberOfRowsInserted, Integer numberOfRowsDeleted) {
-        this.numberOfRowsUpdated = numberOfRowsUpdated;
-        this.numberOfRowsInserted = numberOfRowsInserted;
-        this.numberOfRowsDeleted = numberOfRowsDeleted;
-    }
-
-    public Integer getNumberOfRowsUpdated() {
-        return numberOfRowsUpdated;
-    }
-
-    public Integer getNumberOfRowsInserted() {
-        return numberOfRowsInserted;
-    }
-
-    public Integer getNumberOfRowsDeleted() {
-        return numberOfRowsDeleted;
-    }
-}

+ 1 - 1
app/src/main/java/eu/kanade/mangafeed/ui/setting/preference/IntListPreference.java → app/src/main/java/eu/kanade/mangafeed/widget/preference/IntListPreference.java

@@ -1,4 +1,4 @@
-package eu.kanade.mangafeed.ui.setting.preference;
+package eu.kanade.mangafeed.widget.preference;
 
 import android.content.Context;
 import android.preference.ListPreference;

+ 1 - 1
app/src/main/java/eu/kanade/mangafeed/ui/setting/preference/LibraryColumnsDialog.java → app/src/main/java/eu/kanade/mangafeed/widget/preference/LibraryColumnsDialog.java

@@ -1,4 +1,4 @@
-package eu.kanade.mangafeed.ui.setting.preference;
+package eu.kanade.mangafeed.widget.preference;
 
 import android.content.Context;
 import android.preference.DialogPreference;

+ 1 - 1
app/src/main/java/eu/kanade/mangafeed/ui/setting/preference/LoginDialogPreference.java → app/src/main/java/eu/kanade/mangafeed/widget/preference/LoginDialogPreference.java

@@ -1,4 +1,4 @@
-package eu.kanade.mangafeed.ui.setting.preference;
+package eu.kanade.mangafeed.widget.preference;
 
 import android.app.AlertDialog;
 import android.content.Context;

+ 1 - 1
app/src/main/java/eu/kanade/mangafeed/ui/setting/preference/MangaSyncLoginDialog.java → app/src/main/java/eu/kanade/mangafeed/widget/preference/MangaSyncLoginDialog.java

@@ -1,4 +1,4 @@
-package eu.kanade.mangafeed.ui.setting.preference;
+package eu.kanade.mangafeed.widget.preference;
 
 import android.content.Context;
 import android.content.DialogInterface;

+ 1 - 1
app/src/main/java/eu/kanade/mangafeed/ui/setting/preference/SourceLoginDialog.java → app/src/main/java/eu/kanade/mangafeed/widget/preference/SourceLoginDialog.java

@@ -1,4 +1,4 @@
-package eu.kanade.mangafeed.ui.setting.preference;
+package eu.kanade.mangafeed.widget.preference;
 
 import android.content.Context;
 import android.content.DialogInterface;

+ 1 - 1
app/src/main/res/xml/pref_downloads.xml

@@ -5,7 +5,7 @@
         android:title="@string/pref_download_directory"
         android:key="@string/pref_download_directory_key"/>
 
-    <eu.kanade.mangafeed.ui.setting.preference.IntListPreference
+    <eu.kanade.mangafeed.widget.preference.IntListPreference
         android:title="@string/pref_download_slots"
         android:key="@string/pref_download_slots_key"
         android:entries="@array/download_slots"

+ 2 - 2
app/src/main/res/xml/pref_general.xml

@@ -1,12 +1,12 @@
 <?xml version="1.0" encoding="utf-8"?>
 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
 
-    <eu.kanade.mangafeed.ui.setting.preference.LibraryColumnsDialog
+    <eu.kanade.mangafeed.widget.preference.LibraryColumnsDialog
         android:key="@string/pref_library_columns_dialog_key"
         android:persistent="false"
         android:title="@string/pref_library_columns"/>
 
-    <eu.kanade.mangafeed.ui.setting.preference.IntListPreference
+    <eu.kanade.mangafeed.widget.preference.IntListPreference
         android:key="@string/pref_library_update_interval_key"
         android:title="@string/pref_library_update_interval"
         android:entries="@array/library_update_interval"

+ 2 - 2
app/src/main/res/xml/pref_reader.xml

@@ -28,7 +28,7 @@
         android:defaultValue="1"
         android:summary="%s"/>
 
-    <eu.kanade.mangafeed.ui.setting.preference.IntListPreference
+    <eu.kanade.mangafeed.widget.preference.IntListPreference
         android:title="@string/pref_reader_theme"
         android:key="@string/pref_reader_theme_key"
         android:entries="@array/reader_themes"
@@ -36,7 +36,7 @@
         android:defaultValue="0"
         android:summary="%s"/>
 
-    <eu.kanade.mangafeed.ui.setting.preference.IntListPreference
+    <eu.kanade.mangafeed.widget.preference.IntListPreference
         android:title="@string/pref_image_decoder"
         android:key="@string/pref_image_decoder_key"
         android:entries="@array/image_decoders"