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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 inorichi
						inorichi