Allow to refresh data from MAL and show total chapters. Create nomedia file for default downloads folder on new installations.
This commit is contained in:
parent
c830c037f7
commit
4d9cd6cb6e
@ -43,4 +43,11 @@ public class MangaSync implements Serializable {
|
|||||||
mangasync.sync_id = service.getId();
|
mangasync.sync_id = service.getId();
|
||||||
return mangasync;
|
return mangasync;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void copyPersonalFrom(MangaSync other) {
|
||||||
|
last_chapter_read = other.last_chapter_read;
|
||||||
|
score = other.score;
|
||||||
|
status = other.status;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -43,7 +43,6 @@ public class MyAnimeList extends MangaSyncService {
|
|||||||
private static final String SCORE_TAG = "score";
|
private static final String SCORE_TAG = "score";
|
||||||
private static final String STATUS_TAG = "status";
|
private static final String STATUS_TAG = "status";
|
||||||
|
|
||||||
public static final int NOT_IN_LIST = 0;
|
|
||||||
public static final int READING = 1;
|
public static final int READING = 1;
|
||||||
public static final int COMPLETED = 2;
|
public static final int COMPLETED = 2;
|
||||||
public static final int ON_HOLD = 3;
|
public static final int ON_HOLD = 3;
|
||||||
@ -125,7 +124,7 @@ public class MyAnimeList extends MangaSyncService {
|
|||||||
.toString();
|
.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Observable<List<MangaSync>> getList(String username) {
|
public Observable<List<MangaSync>> getList() {
|
||||||
// TODO cache this list for a few minutes
|
// TODO cache this list for a few minutes
|
||||||
return networkService.getStringResponse(getListUrl(username), headers, null)
|
return networkService.getStringResponse(getListUrl(username), headers, null)
|
||||||
.map(Jsoup::parse)
|
.map(Jsoup::parse)
|
||||||
@ -215,15 +214,13 @@ public class MyAnimeList extends MangaSyncService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Observable<Response> bind(MangaSync manga) {
|
public Observable<Response> bind(MangaSync manga) {
|
||||||
return getList(username)
|
return getList()
|
||||||
.flatMap(list -> {
|
.flatMap(list -> {
|
||||||
manga.sync_id = getId();
|
manga.sync_id = getId();
|
||||||
for (MangaSync remoteManga : list) {
|
for (MangaSync remoteManga : list) {
|
||||||
if (remoteManga.remote_id == manga.remote_id) {
|
if (remoteManga.remote_id == manga.remote_id) {
|
||||||
// Manga is already in the list
|
// Manga is already in the list
|
||||||
manga.score = remoteManga.score;
|
manga.copyPersonalFrom(remoteManga);
|
||||||
manga.status = remoteManga.status;
|
|
||||||
manga.last_chapter_read = remoteManga.last_chapter_read;
|
|
||||||
return update(manga);
|
return update(manga);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,7 @@ import com.f2prateek.rx.preferences.Preference;
|
|||||||
import com.f2prateek.rx.preferences.RxSharedPreferences;
|
import com.f2prateek.rx.preferences.RxSharedPreferences;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
import eu.kanade.mangafeed.R;
|
import eu.kanade.mangafeed.R;
|
||||||
import eu.kanade.mangafeed.data.mangasync.base.MangaSyncService;
|
import eu.kanade.mangafeed.data.mangasync.base.MangaSyncService;
|
||||||
@ -38,8 +39,13 @@ public class PreferencesHelper {
|
|||||||
File.separator + context.getString(R.string.app_name), "downloads");
|
File.separator + context.getString(R.string.app_name), "downloads");
|
||||||
|
|
||||||
// Create default directory
|
// Create default directory
|
||||||
if (getDownloadsDirectory().equals(defaultDownloadsDir.getAbsolutePath()))
|
if (getDownloadsDirectory().equals(defaultDownloadsDir.getAbsolutePath()) &&
|
||||||
|
!defaultDownloadsDir.exists()) {
|
||||||
defaultDownloadsDir.mkdirs();
|
defaultDownloadsDir.mkdirs();
|
||||||
|
try {
|
||||||
|
new File(defaultDownloadsDir, ".nomedia").createNewFile();
|
||||||
|
} catch (IOException e) { /* Ignore */ }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getKey(int keyResource) {
|
private String getKey(int keyResource) {
|
||||||
|
@ -10,18 +10,14 @@ import java.util.List;
|
|||||||
import eu.davidea.flexibleadapter.FlexibleAdapter;
|
import eu.davidea.flexibleadapter.FlexibleAdapter;
|
||||||
import eu.kanade.mangafeed.R;
|
import eu.kanade.mangafeed.R;
|
||||||
import eu.kanade.mangafeed.data.database.models.Chapter;
|
import eu.kanade.mangafeed.data.database.models.Chapter;
|
||||||
import eu.kanade.mangafeed.ui.base.adapter.FlexibleViewHolder;
|
|
||||||
import eu.kanade.mangafeed.ui.base.fragment.BaseFragment;
|
|
||||||
|
|
||||||
public class ChaptersAdapter extends FlexibleAdapter<ChaptersHolder, Chapter> {
|
public class ChaptersAdapter extends FlexibleAdapter<ChaptersHolder, Chapter> {
|
||||||
|
|
||||||
private BaseFragment fragment;
|
private ChaptersFragment fragment;
|
||||||
public FlexibleViewHolder.OnListItemClickListener clickListener;
|
|
||||||
|
|
||||||
public ChaptersAdapter(BaseFragment fragment) {
|
public ChaptersAdapter(ChaptersFragment fragment) {
|
||||||
this.fragment = fragment;
|
this.fragment = fragment;
|
||||||
mItems = new ArrayList<>();
|
mItems = new ArrayList<>();
|
||||||
clickListener = (FlexibleViewHolder.OnListItemClickListener) fragment;
|
|
||||||
setHasStableIds(true);
|
setHasStableIds(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -31,7 +27,7 @@ public class ChaptersAdapter extends FlexibleAdapter<ChaptersHolder, Chapter> {
|
|||||||
@Override
|
@Override
|
||||||
public ChaptersHolder onCreateViewHolder(ViewGroup parent, int viewType) {
|
public ChaptersHolder onCreateViewHolder(ViewGroup parent, int viewType) {
|
||||||
View v = LayoutInflater.from(fragment.getActivity()).inflate(R.layout.item_chapter, parent, false);
|
View v = LayoutInflater.from(fragment.getActivity()).inflate(R.layout.item_chapter, parent, false);
|
||||||
return new ChaptersHolder(v, this, clickListener);
|
return new ChaptersHolder(v, this, fragment);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -53,7 +49,7 @@ public class ChaptersAdapter extends FlexibleAdapter<ChaptersHolder, Chapter> {
|
|||||||
notifyDataSetChanged();
|
notifyDataSetChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
public ChaptersFragment getChaptersFragment() {
|
public ChaptersFragment getFragment() {
|
||||||
return (ChaptersFragment) fragment;
|
return fragment;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -81,7 +81,7 @@ public class ChaptersHolder extends FlexibleViewHolder {
|
|||||||
|
|
||||||
private void showPopupMenu(View view) {
|
private void showPopupMenu(View view) {
|
||||||
// Create a PopupMenu, giving it the clicked view for an anchor
|
// Create a PopupMenu, giving it the clicked view for an anchor
|
||||||
PopupMenu popup = new PopupMenu(adapter.getChaptersFragment().getActivity(), view);
|
PopupMenu popup = new PopupMenu(adapter.getFragment().getActivity(), view);
|
||||||
|
|
||||||
// Inflate our menu resource into the PopupMenu's Menu
|
// Inflate our menu resource into the PopupMenu's Menu
|
||||||
popup.getMenuInflater().inflate(R.menu.chapter_single, popup.getMenu());
|
popup.getMenuInflater().inflate(R.menu.chapter_single, popup.getMenu());
|
||||||
@ -92,13 +92,13 @@ public class ChaptersHolder extends FlexibleViewHolder {
|
|||||||
|
|
||||||
switch (menuItem.getItemId()) {
|
switch (menuItem.getItemId()) {
|
||||||
case R.id.action_mark_as_read:
|
case R.id.action_mark_as_read:
|
||||||
return adapter.getChaptersFragment().onMarkAsRead(chapter);
|
return adapter.getFragment().onMarkAsRead(chapter);
|
||||||
case R.id.action_mark_as_unread:
|
case R.id.action_mark_as_unread:
|
||||||
return adapter.getChaptersFragment().onMarkAsUnread(chapter);
|
return adapter.getFragment().onMarkAsUnread(chapter);
|
||||||
case R.id.action_download:
|
case R.id.action_download:
|
||||||
return adapter.getChaptersFragment().onDownload(chapter);
|
return adapter.getFragment().onDownload(chapter);
|
||||||
case R.id.action_delete:
|
case R.id.action_delete:
|
||||||
return adapter.getChaptersFragment().onDelete(chapter);
|
return adapter.getFragment().onDelete(chapter);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
@ -2,6 +2,7 @@ package eu.kanade.mangafeed.ui.manga.myanimelist;
|
|||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.support.v4.widget.SwipeRefreshLayout;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
@ -28,6 +29,7 @@ public class MyAnimeListFragment extends BaseRxFragment<MyAnimeListPresenter> {
|
|||||||
@Bind(R.id.myanimelist_chapters) TextView chapters;
|
@Bind(R.id.myanimelist_chapters) TextView chapters;
|
||||||
@Bind(R.id.myanimelist_score) TextView score;
|
@Bind(R.id.myanimelist_score) TextView score;
|
||||||
@Bind(R.id.myanimelist_status) TextView status;
|
@Bind(R.id.myanimelist_status) TextView status;
|
||||||
|
@Bind(R.id.swipe_refresh) SwipeRefreshLayout swipeRefresh;
|
||||||
|
|
||||||
private MyAnimeListDialogFragment dialog;
|
private MyAnimeListDialogFragment dialog;
|
||||||
|
|
||||||
@ -43,18 +45,31 @@ public class MyAnimeListFragment extends BaseRxFragment<MyAnimeListPresenter> {
|
|||||||
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||||
View view = inflater.inflate(R.layout.fragment_myanimelist, container, false);
|
View view = inflater.inflate(R.layout.fragment_myanimelist, container, false);
|
||||||
ButterKnife.bind(this, view);
|
ButterKnife.bind(this, view);
|
||||||
|
|
||||||
|
swipeRefresh.setEnabled(false);
|
||||||
|
swipeRefresh.setOnRefreshListener(() -> getPresenter().refresh());
|
||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setMangaSync(MangaSync mangaSync) {
|
public void setMangaSync(MangaSync mangaSync) {
|
||||||
|
swipeRefresh.setEnabled(mangaSync != null);
|
||||||
if (mangaSync != null) {
|
if (mangaSync != null) {
|
||||||
title.setText(mangaSync.title);
|
title.setText(mangaSync.title);
|
||||||
chapters.setText(mangaSync.last_chapter_read + "");
|
chapters.setText(mangaSync.last_chapter_read + "/" +
|
||||||
|
(mangaSync.total_chapters > 0 ? mangaSync.total_chapters : "-"));
|
||||||
score.setText(mangaSync.score == 0 ? "-" : decimalFormat.format(mangaSync.score));
|
score.setText(mangaSync.score == 0 ? "-" : decimalFormat.format(mangaSync.score));
|
||||||
status.setText(getPresenter().myAnimeList.getStatus(mangaSync.status));
|
status.setText(getPresenter().myAnimeList.getStatus(mangaSync.status));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void onRefreshDone() {
|
||||||
|
swipeRefresh.setRefreshing(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onRefreshError() {
|
||||||
|
swipeRefresh.setRefreshing(false);
|
||||||
|
}
|
||||||
|
|
||||||
public void setSearchResults(List<MangaSync> results) {
|
public void setSearchResults(List<MangaSync> results) {
|
||||||
findSearchFragmentIfNeeded();
|
findSearchFragmentIfNeeded();
|
||||||
|
|
||||||
|
@ -33,6 +33,7 @@ public class MyAnimeListPresenter extends BasePresenter<MyAnimeListFragment> {
|
|||||||
|
|
||||||
private static final int GET_MANGA_SYNC = 1;
|
private static final int GET_MANGA_SYNC = 1;
|
||||||
private static final int GET_SEARCH_RESULTS = 2;
|
private static final int GET_SEARCH_RESULTS = 2;
|
||||||
|
private static final int REFRESH = 3;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedState) {
|
protected void onCreate(Bundle savedState) {
|
||||||
@ -62,11 +63,29 @@ public class MyAnimeListPresenter extends BasePresenter<MyAnimeListFragment> {
|
|||||||
view.setSearchResultsError();
|
view.setSearchResultsError();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
restartableFirst(REFRESH,
|
||||||
|
() -> myAnimeList.getList()
|
||||||
|
.flatMap(myList -> {
|
||||||
|
for (MangaSync myManga : myList) {
|
||||||
|
if (myManga.remote_id == mangaSync.remote_id) {
|
||||||
|
mangaSync.copyPersonalFrom(myManga);
|
||||||
|
return Observable.just(mangaSync);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Observable.error(new Exception("Could not find manga"));
|
||||||
|
})
|
||||||
|
.flatMap(myManga -> db.insertMangaSync(myManga).createObservable())
|
||||||
|
.subscribeOn(Schedulers.io())
|
||||||
|
.observeOn(AndroidSchedulers.mainThread()),
|
||||||
|
(view, result) -> view.onRefreshDone(),
|
||||||
|
(view, error) -> view.onRefreshError());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onProcessRestart() {
|
private void onProcessRestart() {
|
||||||
stop(GET_MANGA_SYNC);
|
stop(GET_MANGA_SYNC);
|
||||||
stop(GET_SEARCH_RESULTS);
|
stop(GET_SEARCH_RESULTS);
|
||||||
|
stop(REFRESH);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -157,4 +176,10 @@ public class MyAnimeListPresenter extends BasePresenter<MyAnimeListFragment> {
|
|||||||
mangaSync.last_chapter_read = chapterNumber;
|
mangaSync.last_chapter_read = chapterNumber;
|
||||||
updateRemote();
|
updateRemote();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void refresh() {
|
||||||
|
if (mangaSync != null) {
|
||||||
|
start(REFRESH);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,18 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<android.support.v4.widget.SwipeRefreshLayout
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:padding="10dp">
|
android:id="@+id/swipe_refresh"
|
||||||
|
android:paddingTop="@dimen/margin_top"
|
||||||
|
android:paddingBottom="@dimen/margin_bottom"
|
||||||
|
android:paddingRight="@dimen/margin_right"
|
||||||
|
android:paddingLeft="@dimen/margin_left">
|
||||||
|
|
||||||
|
<ScrollView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
<android.support.v7.widget.CardView
|
<android.support.v7.widget.CardView
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
@ -13,5 +22,6 @@
|
|||||||
|
|
||||||
</android.support.v7.widget.CardView>
|
</android.support.v7.widget.CardView>
|
||||||
|
|
||||||
|
</ScrollView>
|
||||||
|
|
||||||
</LinearLayout>
|
</android.support.v4.widget.SwipeRefreshLayout>
|
Loading…
Reference in New Issue
Block a user