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();
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 STATUS_TAG = "status";
public static final int NOT_IN_LIST = 0;
public static final int READING = 1;
public static final int COMPLETED = 2;
public static final int ON_HOLD = 3;
@ -125,7 +124,7 @@ public class MyAnimeList extends MangaSyncService {
.toString();
}
public Observable<List<MangaSync>> getList(String username) {
public Observable<List<MangaSync>> getList() {
// TODO cache this list for a few minutes
return networkService.getStringResponse(getListUrl(username), headers, null)
.map(Jsoup::parse)
@ -215,15 +214,13 @@ public class MyAnimeList extends MangaSyncService {
}
public Observable<Response> bind(MangaSync manga) {
return getList(username)
return getList()
.flatMap(list -> {
manga.sync_id = getId();
for (MangaSync remoteManga : list) {
if (remoteManga.remote_id == manga.remote_id) {
// Manga is already in the list
manga.score = remoteManga.score;
manga.status = remoteManga.status;
manga.last_chapter_read = remoteManga.last_chapter_read;
manga.copyPersonalFrom(remoteManga);
return update(manga);
}
}

View File

@ -9,6 +9,7 @@ import com.f2prateek.rx.preferences.Preference;
import com.f2prateek.rx.preferences.RxSharedPreferences;
import java.io.File;
import java.io.IOException;
import eu.kanade.mangafeed.R;
import eu.kanade.mangafeed.data.mangasync.base.MangaSyncService;
@ -38,8 +39,13 @@ public class PreferencesHelper {
File.separator + context.getString(R.string.app_name), "downloads");
// Create default directory
if (getDownloadsDirectory().equals(defaultDownloadsDir.getAbsolutePath()))
if (getDownloadsDirectory().equals(defaultDownloadsDir.getAbsolutePath()) &&
!defaultDownloadsDir.exists()) {
defaultDownloadsDir.mkdirs();
try {
new File(defaultDownloadsDir, ".nomedia").createNewFile();
} catch (IOException e) { /* Ignore */ }
}
}
private String getKey(int keyResource) {

View File

@ -10,18 +10,14 @@ import java.util.List;
import eu.davidea.flexibleadapter.FlexibleAdapter;
import eu.kanade.mangafeed.R;
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> {
private BaseFragment fragment;
public FlexibleViewHolder.OnListItemClickListener clickListener;
private ChaptersFragment fragment;
public ChaptersAdapter(BaseFragment fragment) {
public ChaptersAdapter(ChaptersFragment fragment) {
this.fragment = fragment;
mItems = new ArrayList<>();
clickListener = (FlexibleViewHolder.OnListItemClickListener) fragment;
setHasStableIds(true);
}
@ -31,7 +27,7 @@ public class ChaptersAdapter extends FlexibleAdapter<ChaptersHolder, Chapter> {
@Override
public ChaptersHolder onCreateViewHolder(ViewGroup parent, int viewType) {
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
@ -53,7 +49,7 @@ public class ChaptersAdapter extends FlexibleAdapter<ChaptersHolder, Chapter> {
notifyDataSetChanged();
}
public ChaptersFragment getChaptersFragment() {
return (ChaptersFragment) fragment;
public ChaptersFragment getFragment() {
return fragment;
}
}

View File

@ -81,7 +81,7 @@ public class ChaptersHolder extends FlexibleViewHolder {
private void showPopupMenu(View view) {
// 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
popup.getMenuInflater().inflate(R.menu.chapter_single, popup.getMenu());
@ -92,13 +92,13 @@ public class ChaptersHolder extends FlexibleViewHolder {
switch (menuItem.getItemId()) {
case R.id.action_mark_as_read:
return adapter.getChaptersFragment().onMarkAsRead(chapter);
return adapter.getFragment().onMarkAsRead(chapter);
case R.id.action_mark_as_unread:
return adapter.getChaptersFragment().onMarkAsUnread(chapter);
return adapter.getFragment().onMarkAsUnread(chapter);
case R.id.action_download:
return adapter.getChaptersFragment().onDownload(chapter);
return adapter.getFragment().onDownload(chapter);
case R.id.action_delete:
return adapter.getChaptersFragment().onDelete(chapter);
return adapter.getFragment().onDelete(chapter);
}
return false;
});

View File

@ -2,6 +2,7 @@ package eu.kanade.mangafeed.ui.manga.myanimelist;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.widget.SwipeRefreshLayout;
import android.view.LayoutInflater;
import android.view.View;
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_score) TextView score;
@Bind(R.id.myanimelist_status) TextView status;
@Bind(R.id.swipe_refresh) SwipeRefreshLayout swipeRefresh;
private MyAnimeListDialogFragment dialog;
@ -43,18 +45,31 @@ public class MyAnimeListFragment extends BaseRxFragment<MyAnimeListPresenter> {
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_myanimelist, container, false);
ButterKnife.bind(this, view);
swipeRefresh.setEnabled(false);
swipeRefresh.setOnRefreshListener(() -> getPresenter().refresh());
return view;
}
public void setMangaSync(MangaSync mangaSync) {
swipeRefresh.setEnabled(mangaSync != null);
if (mangaSync != null) {
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));
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) {
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_SEARCH_RESULTS = 2;
private static final int REFRESH = 3;
@Override
protected void onCreate(Bundle savedState) {
@ -62,11 +63,29 @@ public class MyAnimeListPresenter extends BasePresenter<MyAnimeListFragment> {
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() {
stop(GET_MANGA_SYNC);
stop(GET_SEARCH_RESULTS);
stop(REFRESH);
}
@Override
@ -157,4 +176,10 @@ public class MyAnimeListPresenter extends BasePresenter<MyAnimeListFragment> {
mangaSync.last_chapter_read = chapterNumber;
updateRemote();
}
public void refresh() {
if (mangaSync != null) {
start(REFRESH);
}
}
}

View File

@ -1,17 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dp">
<android.support.v4.widget.SwipeRefreshLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
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_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>