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:
inorichi 2016-01-01 15:34:25 +01:00
parent c830c037f7
commit 4d9cd6cb6e
8 changed files with 88 additions and 32 deletions

View File

@ -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;
}
} }

View File

@ -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);
} }
} }

View File

@ -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) {

View File

@ -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;
} }
} }

View File

@ -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;
}); });

View File

@ -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();

View File

@ -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);
}
}
} }

View File

@ -1,17 +1,27 @@
<?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
android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:orientation="vertical"
android:layout_height="match_parent" android:layout_width="match_parent"
android:padding="10dp"> android:layout_height="match_parent"
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">
<android.support.v7.widget.CardView <ScrollView
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="match_parent">
<include layout="@layout/card_myanimelist_personal"/> <android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content">
</android.support.v7.widget.CardView> <include layout="@layout/card_myanimelist_personal"/>
</android.support.v7.widget.CardView>
</LinearLayout> </ScrollView>
</android.support.v4.widget.SwipeRefreshLayout>