Library now showing favorite mangas
This commit is contained in:
parent
baa24fbf17
commit
35b8be6c75
@ -53,7 +53,7 @@ dependencies {
|
|||||||
final DAGGER_VERSION = '2.0.1'
|
final DAGGER_VERSION = '2.0.1'
|
||||||
final HAMCREST_VERSION = '1.3'
|
final HAMCREST_VERSION = '1.3'
|
||||||
final MOCKITO_VERSION = '1.10.19'
|
final MOCKITO_VERSION = '1.10.19'
|
||||||
final STORIO_VERSION = '1.4.0'
|
final STORIO_VERSION = '1.5.0'
|
||||||
final NUCLEUS_VERSION = '2.0.1'
|
final NUCLEUS_VERSION = '2.0.1'
|
||||||
final ICEPICK_VERSION = '3.1.0'
|
final ICEPICK_VERSION = '3.1.0'
|
||||||
|
|
||||||
@ -65,8 +65,8 @@ dependencies {
|
|||||||
compile "com.android.support:design:$SUPPORT_LIBRARY_VERSION"
|
compile "com.android.support:design:$SUPPORT_LIBRARY_VERSION"
|
||||||
compile "com.android.support:recyclerview-v7:$SUPPORT_LIBRARY_VERSION"
|
compile "com.android.support:recyclerview-v7:$SUPPORT_LIBRARY_VERSION"
|
||||||
compile "com.android.support:support-annotations:$SUPPORT_LIBRARY_VERSION"
|
compile "com.android.support:support-annotations:$SUPPORT_LIBRARY_VERSION"
|
||||||
compile 'com.squareup.okhttp:okhttp-urlconnection:2.4.0'
|
compile 'com.squareup.okhttp:okhttp-urlconnection:2.5.0'
|
||||||
compile 'com.squareup.okhttp:okhttp:2.4.0'
|
compile 'com.squareup.okhttp:okhttp:2.5.0'
|
||||||
compile 'com.squareup.okio:okio:1.6.0'
|
compile 'com.squareup.okio:okio:1.6.0'
|
||||||
compile 'com.google.code.gson:gson:2.4'
|
compile 'com.google.code.gson:gson:2.4'
|
||||||
compile 'com.jakewharton:disklrucache:2.0.2'
|
compile 'com.jakewharton:disklrucache:2.0.2'
|
||||||
@ -80,7 +80,7 @@ dependencies {
|
|||||||
compile 'de.greenrobot:eventbus:2.4.0'
|
compile 'de.greenrobot:eventbus:2.4.0'
|
||||||
compile 'com.github.bumptech.glide:glide:3.6.1'
|
compile 'com.github.bumptech.glide:glide:3.6.1'
|
||||||
compile 'com.jakewharton:butterknife:7.0.1'
|
compile 'com.jakewharton:butterknife:7.0.1'
|
||||||
compile 'com.jakewharton.timber:timber:3.1.0'
|
compile 'com.jakewharton.timber:timber:4.1.0'
|
||||||
compile 'uk.co.ribot:easyadapter:1.5.0@aar'
|
compile 'uk.co.ribot:easyadapter:1.5.0@aar'
|
||||||
compile 'ch.acra:acra:4.6.2'
|
compile 'ch.acra:acra:4.6.2'
|
||||||
compile 'com.github.castorflex.verticalviewpager:library:19.0.1'
|
compile 'com.github.castorflex.verticalviewpager:library:19.0.1'
|
||||||
|
@ -21,16 +21,17 @@ public class MangaManagerImpl extends BaseManager implements MangaManager {
|
|||||||
super(db);
|
super(db);
|
||||||
}
|
}
|
||||||
|
|
||||||
private final String mangasWithUnreadQuery = String.format(
|
private final String favoriteMangasWithUnreadQuery = String.format(
|
||||||
"SELECT %1$s.*, COUNT(C.%4$s) AS %5$s FROM %1$s LEFT JOIN " +
|
"SELECT %1$s.*, COUNT(C.%4$s) AS %5$s FROM %1$s LEFT JOIN " +
|
||||||
"(SELECT %4$s FROM %2$s WHERE %6$s = 0) AS C ON %3$s = C.%4$s " +
|
"(SELECT %4$s FROM %2$s WHERE %6$s = 0) AS C ON %3$s = C.%4$s " +
|
||||||
"GROUP BY %3$s",
|
"WHERE %7$s = 1 GROUP BY %3$s",
|
||||||
MangasTable.TABLE,
|
MangasTable.TABLE,
|
||||||
ChaptersTable.TABLE,
|
ChaptersTable.TABLE,
|
||||||
MangasTable.TABLE + "." + MangasTable.COLUMN_ID,
|
MangasTable.TABLE + "." + MangasTable.COLUMN_ID,
|
||||||
ChaptersTable.COLUMN_MANGA_ID,
|
ChaptersTable.COLUMN_MANGA_ID,
|
||||||
MangasTable.COLUMN_UNREAD,
|
MangasTable.COLUMN_UNREAD,
|
||||||
ChaptersTable.COLUMN_READ
|
ChaptersTable.COLUMN_READ,
|
||||||
|
MangasTable.COLUMN_FAVORITE
|
||||||
);
|
);
|
||||||
|
|
||||||
public Observable<List<Manga>> getMangas() {
|
public Observable<List<Manga>> getMangas() {
|
||||||
@ -47,7 +48,7 @@ public class MangaManagerImpl extends BaseManager implements MangaManager {
|
|||||||
return db.get()
|
return db.get()
|
||||||
.listOfObjects(Manga.class)
|
.listOfObjects(Manga.class)
|
||||||
.withQuery(RawQuery.builder()
|
.withQuery(RawQuery.builder()
|
||||||
.query(mangasWithUnreadQuery)
|
.query(favoriteMangasWithUnreadQuery)
|
||||||
.observesTables(MangasTable.TABLE, ChaptersTable.TABLE)
|
.observesTables(MangasTable.TABLE, ChaptersTable.TABLE)
|
||||||
.build())
|
.build())
|
||||||
.prepare()
|
.prepare()
|
||||||
|
@ -38,8 +38,8 @@ public class Manga {
|
|||||||
@StorIOSQLiteColumn(name = MangasTable.COLUMN_THUMBNAIL_URL)
|
@StorIOSQLiteColumn(name = MangasTable.COLUMN_THUMBNAIL_URL)
|
||||||
public String thumbnail_url;
|
public String thumbnail_url;
|
||||||
|
|
||||||
@StorIOSQLiteColumn(name = MangasTable.COLUMN_RANK)
|
@StorIOSQLiteColumn(name = MangasTable.COLUMN_FAVORITE)
|
||||||
public int rank;
|
public boolean favorite;
|
||||||
|
|
||||||
@StorIOSQLiteColumn(name = MangasTable.COLUMN_LAST_UPDATE)
|
@StorIOSQLiteColumn(name = MangasTable.COLUMN_LAST_UPDATE)
|
||||||
public long last_update;
|
public long last_update;
|
||||||
@ -57,30 +57,6 @@ public class Manga {
|
|||||||
|
|
||||||
public Manga() {}
|
public Manga() {}
|
||||||
|
|
||||||
public Manga(String title) {
|
|
||||||
this.title = title;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Manga(String title, String author, String artist, String url,
|
|
||||||
String description, String genre, String status, int rank,
|
|
||||||
String thumbnail_url) {
|
|
||||||
this.title = title;
|
|
||||||
this.author = author;
|
|
||||||
this.artist = artist;
|
|
||||||
this.url = url;
|
|
||||||
this.description = description;
|
|
||||||
this.genre = genre;
|
|
||||||
this.status = status;
|
|
||||||
this.rank = rank;
|
|
||||||
this.thumbnail_url = thumbnail_url;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Manga newManga(String title, String author, String artist, String url,
|
|
||||||
String description, String genre, String status, int rank,
|
|
||||||
String thumbnail_url) {
|
|
||||||
return new Manga(title, author, artist, url, description, genre, status, rank, thumbnail_url);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void copyFromNetwork(Manga local, Manga network) {
|
public static void copyFromNetwork(Manga local, Manga network) {
|
||||||
if (network.title != null)
|
if (network.title != null)
|
||||||
local.title = network.title;
|
local.title = network.title;
|
||||||
@ -107,6 +83,7 @@ public class Manga {
|
|||||||
local.thumbnail_url = network.thumbnail_url;
|
local.thumbnail_url = network.thumbnail_url;
|
||||||
|
|
||||||
local.initialized = true;
|
local.initialized = true;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -2,9 +2,6 @@ package eu.kanade.mangafeed.data.tables;
|
|||||||
|
|
||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by len on 23/09/2015.
|
|
||||||
*/
|
|
||||||
public class MangasTable {
|
public class MangasTable {
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
@ -41,7 +38,7 @@ public class MangasTable {
|
|||||||
public static final String COLUMN_THUMBNAIL_URL = "thumbnail_url";
|
public static final String COLUMN_THUMBNAIL_URL = "thumbnail_url";
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
public static final String COLUMN_RANK = "rank";
|
public static final String COLUMN_FAVORITE = "favorite";
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
public static final String COLUMN_LAST_UPDATE = "last_update";
|
public static final String COLUMN_LAST_UPDATE = "last_update";
|
||||||
@ -78,7 +75,7 @@ public class MangasTable {
|
|||||||
+ COLUMN_TITLE + " TEXT NOT NULL, "
|
+ COLUMN_TITLE + " TEXT NOT NULL, "
|
||||||
+ COLUMN_STATUS + " TEXT, "
|
+ COLUMN_STATUS + " TEXT, "
|
||||||
+ COLUMN_THUMBNAIL_URL + " TEXT, "
|
+ COLUMN_THUMBNAIL_URL + " TEXT, "
|
||||||
+ COLUMN_RANK + " INTEGER, "
|
+ COLUMN_FAVORITE + " INTEGER NOT NULL, "
|
||||||
+ COLUMN_LAST_UPDATE + " LONG, "
|
+ COLUMN_LAST_UPDATE + " LONG, "
|
||||||
+ COLUMN_INITIALIZED + " BOOLEAN NOT NULL, "
|
+ COLUMN_INITIALIZED + " BOOLEAN NOT NULL, "
|
||||||
+ COLUMN_VIEWER + " INTEGER NOT NULL, "
|
+ COLUMN_VIEWER + " INTEGER NOT NULL, "
|
||||||
|
@ -52,8 +52,12 @@ public class LibraryPresenter extends BasePresenter<LibraryFragment> {
|
|||||||
.observeOn(Schedulers.io())
|
.observeOn(Schedulers.io())
|
||||||
.map(checkedItems::keyAt)
|
.map(checkedItems::keyAt)
|
||||||
.map(adapter::getItem)
|
.map(adapter::getItem)
|
||||||
|
.map(manga -> {
|
||||||
|
manga.favorite = false;
|
||||||
|
return manga;
|
||||||
|
})
|
||||||
.toList()
|
.toList()
|
||||||
.flatMap(db::deleteMangas)
|
.flatMap(db::insertMangas)
|
||||||
.subscribe());
|
.subscribe());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,6 +17,8 @@ public class MangaDetailPresenter extends BasePresenter<MangaDetailActivity> {
|
|||||||
@Inject DatabaseHelper db;
|
@Inject DatabaseHelper db;
|
||||||
|
|
||||||
private long mangaId;
|
private long mangaId;
|
||||||
|
private Manga manga;
|
||||||
|
|
||||||
private static final int DB_MANGA = 1;
|
private static final int DB_MANGA = 1;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -24,9 +26,11 @@ public class MangaDetailPresenter extends BasePresenter<MangaDetailActivity> {
|
|||||||
super.onCreate(savedState);
|
super.onCreate(savedState);
|
||||||
|
|
||||||
restartableLatestCache(DB_MANGA,
|
restartableLatestCache(DB_MANGA,
|
||||||
this::getDbMangaObservable,
|
() -> getDbMangaObservable()
|
||||||
|
.doOnNext(manga -> this.manga = manga),
|
||||||
(view, manga) -> {
|
(view, manga) -> {
|
||||||
view.setManga(manga);
|
view.setManga(manga);
|
||||||
|
view.setFavoriteBtnVisible(!manga.favorite);
|
||||||
EventBus.getDefault().postSticky(manga);
|
EventBus.getDefault().postSticky(manga);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -41,7 +45,6 @@ public class MangaDetailPresenter extends BasePresenter<MangaDetailActivity> {
|
|||||||
private Observable<Manga> getDbMangaObservable() {
|
private Observable<Manga> getDbMangaObservable() {
|
||||||
return db.getManga(mangaId)
|
return db.getManga(mangaId)
|
||||||
.subscribeOn(Schedulers.io())
|
.subscribeOn(Schedulers.io())
|
||||||
.take(1)
|
|
||||||
.flatMap(Observable::from)
|
.flatMap(Observable::from)
|
||||||
.observeOn(AndroidSchedulers.mainThread());
|
.observeOn(AndroidSchedulers.mainThread());
|
||||||
}
|
}
|
||||||
@ -51,4 +54,14 @@ public class MangaDetailPresenter extends BasePresenter<MangaDetailActivity> {
|
|||||||
start(DB_MANGA);
|
start(DB_MANGA);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setFavoriteVisibility() {
|
||||||
|
if (getView() != null) {
|
||||||
|
getView().setFavoriteBtnVisible(!manga.favorite);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean addToFavorites() {
|
||||||
|
manga.favorite = true;
|
||||||
|
return db.insertMangaBlock(manga).numberOfRowsUpdated() == 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,7 +10,9 @@ import android.support.v4.app.FragmentManager;
|
|||||||
import android.support.v4.app.FragmentPagerAdapter;
|
import android.support.v4.app.FragmentPagerAdapter;
|
||||||
import android.support.v4.view.ViewPager;
|
import android.support.v4.view.ViewPager;
|
||||||
import android.support.v7.widget.Toolbar;
|
import android.support.v7.widget.Toolbar;
|
||||||
|
import android.view.Menu;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
import butterknife.Bind;
|
import butterknife.Bind;
|
||||||
import butterknife.ButterKnife;
|
import butterknife.ButterKnife;
|
||||||
@ -32,6 +34,7 @@ public class MangaDetailActivity extends BaseRxActivity<MangaDetailPresenter> {
|
|||||||
private MangaDetailAdapter adapter;
|
private MangaDetailAdapter adapter;
|
||||||
private long manga_id;
|
private long manga_id;
|
||||||
private boolean is_online;
|
private boolean is_online;
|
||||||
|
private MenuItem favoriteBtn;
|
||||||
|
|
||||||
public final static String MANGA_ID = "manga_id";
|
public final static String MANGA_ID = "manga_id";
|
||||||
public final static String MANGA_ONLINE = "manga_online";
|
public final static String MANGA_ONLINE = "manga_online";
|
||||||
@ -62,12 +65,23 @@ public class MangaDetailActivity extends BaseRxActivity<MangaDetailPresenter> {
|
|||||||
getPresenter().queryManga(manga_id);
|
getPresenter().queryManga(manga_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onCreateOptionsMenu(Menu menu) {
|
||||||
|
getMenuInflater().inflate(R.menu.manga, menu);
|
||||||
|
favoriteBtn = menu.findItem(R.id.action_favorite);
|
||||||
|
getPresenter().setFavoriteVisibility();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onOptionsItemSelected(MenuItem item) {
|
public boolean onOptionsItemSelected(MenuItem item) {
|
||||||
switch (item.getItemId()) {
|
switch (item.getItemId()) {
|
||||||
case android.R.id.home:
|
case android.R.id.home:
|
||||||
finish();
|
finish();
|
||||||
return true;
|
return true;
|
||||||
|
case R.id.action_favorite:
|
||||||
|
onFavoriteClick();
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
return super.onOptionsItemSelected(item);
|
return super.onOptionsItemSelected(item);
|
||||||
}
|
}
|
||||||
@ -98,10 +112,22 @@ public class MangaDetailActivity extends BaseRxActivity<MangaDetailPresenter> {
|
|||||||
setToolbarTitle(manga.title);
|
setToolbarTitle(manga.title);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setFavoriteBtnVisible(boolean visible) {
|
||||||
|
if (favoriteBtn != null)
|
||||||
|
favoriteBtn.setVisible(visible);
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isOnlineManga() {
|
public boolean isOnlineManga() {
|
||||||
return is_online;
|
return is_online;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void onFavoriteClick() {
|
||||||
|
if (getPresenter().addToFavorites()) {
|
||||||
|
Toast.makeText(this, getString(R.string.toast_added_favorites), Toast.LENGTH_SHORT)
|
||||||
|
.show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class MangaDetailAdapter extends FragmentPagerAdapter {
|
class MangaDetailAdapter extends FragmentPagerAdapter {
|
||||||
|
|
||||||
final int PAGE_COUNT = 2;
|
final int PAGE_COUNT = 2;
|
||||||
|
@ -101,6 +101,9 @@ public class LoginDialogPreference extends DialogPreference {
|
|||||||
if (requestSubscription != null)
|
if (requestSubscription != null)
|
||||||
requestSubscription.unsubscribe();
|
requestSubscription.unsubscribe();
|
||||||
|
|
||||||
|
if (username.getText().length() == 0 || password.getText().length() == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
loginBtn.setProgress(1);
|
loginBtn.setProgress(1);
|
||||||
|
|
||||||
requestSubscription = source.login(username.getText().toString(),
|
requestSubscription = source.login(username.getText().toString(),
|
||||||
|
BIN
app/src/main/res/drawable-hdpi/ic_action_favorite.png
Normal file
BIN
app/src/main/res/drawable-hdpi/ic_action_favorite.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 387 B |
BIN
app/src/main/res/drawable-mdpi/ic_action_favorite.png
Normal file
BIN
app/src/main/res/drawable-mdpi/ic_action_favorite.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 262 B |
BIN
app/src/main/res/drawable-xhdpi/ic_action_favorite.png
Normal file
BIN
app/src/main/res/drawable-xhdpi/ic_action_favorite.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 479 B |
BIN
app/src/main/res/drawable-xxhdpi/ic_action_favorite.png
Normal file
BIN
app/src/main/res/drawable-xxhdpi/ic_action_favorite.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 707 B |
BIN
app/src/main/res/drawable-xxxhdpi/ic_action_favorite.png
Normal file
BIN
app/src/main/res/drawable-xxxhdpi/ic_action_favorite.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 901 B |
11
app/src/main/res/menu/manga.xml
Normal file
11
app/src/main/res/menu/manga.xml
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||||
|
<item
|
||||||
|
android:id="@+id/action_favorite"
|
||||||
|
android:title="@string/action_favorite"
|
||||||
|
android:icon="@drawable/ic_action_favorite"
|
||||||
|
app:showAsAction="always"
|
||||||
|
android:visible="false"/>
|
||||||
|
|
||||||
|
</menu>
|
@ -71,5 +71,7 @@
|
|||||||
<string name="success">Success</string>
|
<string name="success">Success</string>
|
||||||
<string name="invalid_login">Login error</string>
|
<string name="invalid_login">Login error</string>
|
||||||
<string name="loading">Loading…</string>
|
<string name="loading">Loading…</string>
|
||||||
|
<string name="toast_added_favorites">Added to favorites</string>
|
||||||
|
<string name="action_favorite">Favorite</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||||
|
apply plugin: 'com.github.ben-manes.versions'
|
||||||
|
|
||||||
buildscript {
|
buildscript {
|
||||||
repositories {
|
repositories {
|
||||||
@ -13,6 +14,7 @@ buildscript {
|
|||||||
classpath 'com.zeroturnaround.jrebel.android:jr-android-gradle:0.9.+'
|
classpath 'com.zeroturnaround.jrebel.android:jr-android-gradle:0.9.+'
|
||||||
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.7'
|
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.7'
|
||||||
classpath 'me.tatarka:gradle-retrolambda:3.2.3'
|
classpath 'me.tatarka:gradle-retrolambda:3.2.3'
|
||||||
|
classpath 'com.github.ben-manes:gradle-versions-plugin:0.11.3'
|
||||||
// NOTE: Do not place your application dependencies here; they belong
|
// NOTE: Do not place your application dependencies here; they belong
|
||||||
// in the individual module build.gradle files
|
// in the individual module build.gradle files
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user