diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/recent/RecentChaptersFragment.java b/app/src/main/java/eu/kanade/tachiyomi/ui/recent/RecentChaptersFragment.java index e78c34ccd7..efc7847c9a 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/recent/RecentChaptersFragment.java +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/recent/RecentChaptersFragment.java @@ -10,6 +10,8 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import com.afollestad.materialdialogs.MaterialDialog; + import java.util.List; import butterknife.Bind; @@ -26,6 +28,8 @@ import eu.kanade.tachiyomi.ui.decoration.DividerItemDecoration; import eu.kanade.tachiyomi.ui.reader.ReaderActivity; import nucleus.factory.RequiresPresenter; import rx.Observable; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; @RequiresPresenter(RecentChaptersPresenter.class) public class RecentChaptersFragment extends BaseRxFragment<RecentChaptersPresenter> implements FlexibleViewHolder.OnListItemClickListener { @@ -103,4 +107,38 @@ public class RecentChaptersFragment extends BaseRxFragment<RecentChaptersPresent return true; } + protected boolean onDelete(Observable<Chapter> chapters, Manga manga) { + int size = adapter.getSelectedItemCount(); + + MaterialDialog dialog = new MaterialDialog.Builder(getActivity()) + .title(R.string.deleting) + .progress(false, size, true) + .cancelable(false) + .show(); + + Observable<Chapter> observable = chapters + .concatMap(chapter -> { + getPresenter().deleteChapter(chapter, manga); + return Observable.just(chapter); + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .doOnNext(chapter -> { + dialog.incrementProgress(1); + chapter.status = Download.NOT_DOWNLOADED; + }) + .doOnCompleted(adapter::notifyDataSetChanged) + .finallyDo(dialog::dismiss); + + getPresenter().deleteChapters(observable); + + return true; + } + + protected boolean onMarkAsRead(Observable<Chapter> chapters) { + getPresenter().markChaptersRead(chapters, true); + return true; + } + + } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/recent/RecentChaptersHolder.java b/app/src/main/java/eu/kanade/tachiyomi/ui/recent/RecentChaptersHolder.java index 8d3607e39b..88a106fa6f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/recent/RecentChaptersHolder.java +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/recent/RecentChaptersHolder.java @@ -133,11 +133,6 @@ public class RecentChaptersHolder extends FlexibleViewHolder { } } - public void onProgressChange(Context context, int downloaded, int total) { - downloadText.setText(context.getString( - R.string.chapter_downloading_progress, downloaded, total)); - } - private void showPopupMenu(View view) { // Create a PopupMenu, giving it the clicked view for an anchor PopupMenu popup = new PopupMenu(adapter.getFragment().getActivity(), view); @@ -170,13 +165,10 @@ public class RecentChaptersHolder extends FlexibleViewHolder { case R.id.action_download: return adapter.getFragment().onDownload(chapterObservable, mangaChapter.manga); case R.id.action_delete: - ToastUtil.showShort(context, "Delete does not work, yet...."); - return true; -// return adapter.getFragment().onDelete(chapterObservable); + return adapter.getFragment().onDelete(chapterObservable, mangaChapter.manga); case R.id.action_mark_as_read: - ToastUtil.showShort(context, "Mark as read does not work, yet...."); - return true; -// return adapter.getFragment().onMarkAsRead(chapterObservable); + ToastUtil.showShort(context, "Mark as read"); + return adapter.getFragment().onMarkAsRead(chapterObservable); case R.id.action_mark_as_unread: ToastUtil.showShort(context, "Mark as unread does not work, yet...."); return true; diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/recent/RecentChaptersPresenter.java b/app/src/main/java/eu/kanade/tachiyomi/ui/recent/RecentChaptersPresenter.java index a849c9d1d2..9db61c1212 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/recent/RecentChaptersPresenter.java +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/recent/RecentChaptersPresenter.java @@ -27,6 +27,7 @@ import eu.kanade.tachiyomi.event.ReaderEvent; import eu.kanade.tachiyomi.ui.base.presenter.BasePresenter; import rx.Observable; import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; import timber.log.Timber; public class RecentChaptersPresenter extends BasePresenter<RecentChaptersFragment> { @@ -109,6 +110,7 @@ public class RecentChaptersPresenter extends BasePresenter<RecentChaptersFragmen } + private Observable<List<Object>> getRecentChaptersObservable() { Calendar cal = Calendar.getInstance(); cal.setTime(new Date()); @@ -171,4 +173,32 @@ public class RecentChaptersPresenter extends BasePresenter<RecentChaptersFragmen EventBus.getDefault().postSticky(new DownloadChaptersEvent(manga, chapters)); })); } + + public void deleteChapter(Chapter chapter, Manga manga) { + Source source = sourceManager.get(manga.source); + downloadManager.deleteChapter(source, manga, chapter); + } + + public void deleteChapters(Observable<Chapter> selectedChapters) { + add(selectedChapters + .subscribe(chapter -> { + downloadManager.getQueue().remove(chapter); + }, error -> { + Timber.e(error.getMessage()); + })); + } + + public void markChaptersRead(Observable<Chapter> selectedChapters, boolean read) { + add(selectedChapters + .subscribeOn(Schedulers.io()) + .map(chapter -> { + chapter.read = read; + if (!read) chapter.last_page_read = 0; + return chapter; + }) + .toList() + .flatMap(chapters -> db.insertChapters(chapters).asRxObservable()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe()); + } } diff --git a/app/src/main/res/layout/item_recent_chapter.xml b/app/src/main/res/layout/item_recent_chapter.xml index 4c2dd163a1..21d9111b7c 100644 --- a/app/src/main/res/layout/item_recent_chapter.xml +++ b/app/src/main/res/layout/item_recent_chapter.xml @@ -5,6 +5,7 @@ android:layout_height="?android:attr/listPreferredItemHeight" android:background="@drawable/selector_chapter_light"> + <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" @@ -13,13 +14,34 @@ android:paddingRight="?android:attr/listPreferredItemPaddingRight" android:paddingStart="?android:attr/listPreferredItemPaddingStart"> + <RelativeLayout + android:id="@+id/relativeLayout" + android:layout_width="fill_parent" + android:layout_height="18dp" + android:layout_alignParentBottom="true" + android:layout_alignParentLeft="true" + android:layout_alignParentStart="true"> + + <TextView + android:id="@+id/download_text" + android:layout_width="wrap_content" + android:layout_height="fill_parent" + android:layout_alignParentEnd="true" + android:layout_alignParentRight="true" + android:layout_centerVertical="true" + android:textAllCaps="true" + android:textColor="@color/accent_text" + android:textSize="12sp"/> + </RelativeLayout> + <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginRight="30dp" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_centerVertical="true" + android:layout_marginRight="30dp" + android:layout_marginEnd="30dp" android:orientation="vertical"> <TextView @@ -27,8 +49,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:ellipsize="end" - android:textAppearance="@style/TextAppearance.AppCompat.Medium" android:singleLine="true" + android:textAppearance="@style/TextAppearance.AppCompat.Medium" tools:text="My manga"/> <TextView @@ -36,12 +58,37 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:ellipsize="end" - android:textAppearance="@style/TextAppearance.AppCompat.Small" android:maxLines="1" + android:textAppearance="@style/TextAppearance.AppCompat.Small" tools:text="Title"/> </LinearLayout> + </RelativeLayout> + <RelativeLayout + android:id="@+id/chapter_menu" + android:layout_width="50dp" + android:layout_height="fill_parent" + android:layout_alignParentEnd="true" + android:layout_alignParentRight="true" + android:layout_alignParentTop="true" + android:gravity="center|end" + android:paddingBottom="18dp" + android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" + android:paddingRight="?android:attr/listPreferredItemPaddingRight"> + + <ImageView + android:layout_width="24dp" + android:layout_height="24dp" + android:layout_alignParentEnd="false" + android:layout_alignParentRight="true" + android:layout_alignParentTop="true" + android:background="?android:selectableItemBackground" + android:src="@drawable/ic_more_horiz_black_24dp" + /> + </RelativeLayout> + + </RelativeLayout> \ No newline at end of file diff --git a/app/src/main/res/menu/chapter_recent.xml b/app/src/main/res/menu/chapter_recent.xml new file mode 100644 index 0000000000..ec9883b9f7 --- /dev/null +++ b/app/src/main/res/menu/chapter_recent.xml @@ -0,0 +1,32 @@ +<?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_download" + android:title="@string/action_download" + android:icon="@drawable/ic_file_download" + android:visible="true" + app:showAsAction="ifRoom"/> + + <item + android:id="@+id/action_delete" + android:title="@string/action_delete" + android:icon="@drawable/ic_action_delete" + android:visible="false" + app:showAsAction="ifRoom"/> + + <item + android:id="@+id/action_mark_as_read" + android:title="@string/action_mark_as_read" + android:icon="@drawable/ic_action_done_all" + app:showAsAction="ifRoom"/> + + <item + android:id="@+id/action_mark_as_unread" + android:title="@string/action_mark_as_unread" + android:icon="@drawable/ic_action_undone_all" + app:showAsAction="ifRoom"/> + +</menu> \ No newline at end of file diff --git a/build.gradle b/build.gradle index 11eb25d59a..e833b0f878 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.0.0-beta2' + classpath 'com.android.tools.build:gradle:2.0.0-beta4' classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' classpath 'me.tatarka:gradle-retrolambda:3.2.4' classpath 'com.github.ben-manes:gradle-versions-plugin:0.12.0'