From 32a4955504dcf6f017758fcd135ec6efb1858ab8 Mon Sep 17 00:00:00 2001 From: Floens Date: Mon, 30 Mar 2015 01:11:36 +0200 Subject: [PATCH] Add image viewer menu options --- .../org/floens/chan/core/model/PostImage.java | 6 +- .../core/presenter/ImageViewerPresenter.java | 17 +++- .../chan/core/presenter/ThreadPresenter.java | 6 +- .../ui/controller/ImageViewerController.java | 92 ++++++++++++++++++- .../ImageViewerNavigationController.java | 5 +- .../chan/ui/controller/ThreadController.java | 5 +- .../floens/chan/ui/layout/ThreadLayout.java | 6 +- .../chan/ui/toolbar/NavigationItem.java | 4 +- .../org/floens/chan/ui/toolbar/Toolbar.java | 9 ++ 9 files changed, 134 insertions(+), 16 deletions(-) diff --git a/Clover/app/src/main/java/org/floens/chan/core/model/PostImage.java b/Clover/app/src/main/java/org/floens/chan/core/model/PostImage.java index 9cddb91f..291ec304 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/model/PostImage.java +++ b/Clover/app/src/main/java/org/floens/chan/core/model/PostImage.java @@ -5,18 +5,22 @@ public class PostImage { STATIC, GIF, MOVIE } + public String originalName; public String thumbnailUrl; public String imageUrl; public String filename; + public String extension; public int imageWidth; public int imageHeight; public Type type; - public PostImage(String thumbnailUrl, String imageUrl, String filename, String extension, int imageWidth, int imageHeight) { + public PostImage(String originalName, String thumbnailUrl, String imageUrl, String filename, String extension, int imageWidth, int imageHeight) { + this.originalName = originalName; this.thumbnailUrl = thumbnailUrl; this.imageUrl = imageUrl; this.filename = filename + "." + extension; + this.extension = extension; this.imageWidth = imageWidth; this.imageHeight = imageHeight; diff --git a/Clover/app/src/main/java/org/floens/chan/core/presenter/ImageViewerPresenter.java b/Clover/app/src/main/java/org/floens/chan/core/presenter/ImageViewerPresenter.java index db8be677..7996d53f 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/presenter/ImageViewerPresenter.java +++ b/Clover/app/src/main/java/org/floens/chan/core/presenter/ImageViewerPresenter.java @@ -2,6 +2,7 @@ package org.floens.chan.core.presenter; import android.support.v4.view.ViewPager; +import org.floens.chan.core.model.Loadable; import org.floens.chan.core.model.PostImage; import org.floens.chan.core.settings.ChanSettings; import org.floens.chan.ui.view.MultiImageView; @@ -23,6 +24,7 @@ public class ImageViewerPresenter implements MultiImageView.Callback, ViewPager. private List images; private List progress; private int selectedPosition; + private Loadable loadable; // Disables swiping until the view pager is visible private boolean viewPagerVisible = false; @@ -32,9 +34,10 @@ public class ImageViewerPresenter implements MultiImageView.Callback, ViewPager. this.callback = callback; } - public void showImages(List images, int position) { + public void showImages(List images, int position, Loadable loadable) { this.images = images; selectedPosition = position; + this.loadable = loadable; progress = new ArrayList<>(images.size()); for (int i = 0; i < images.size(); i++) { @@ -71,6 +74,18 @@ public class ImageViewerPresenter implements MultiImageView.Callback, ViewPager. callback.showProgress(false); } + public List getAllPostImages() { + return images; + } + + public PostImage getCurrentPostImage() { + return images.get(selectedPosition); + } + + public Loadable getLoadable() { + return loadable; + } + @Override public void onPageSelected(int position) { if (!viewPagerVisible) { diff --git a/Clover/app/src/main/java/org/floens/chan/core/presenter/ThreadPresenter.java b/Clover/app/src/main/java/org/floens/chan/core/presenter/ThreadPresenter.java index 8e75cdef..bf78b6c1 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/presenter/ThreadPresenter.java +++ b/Clover/app/src/main/java/org/floens/chan/core/presenter/ThreadPresenter.java @@ -153,14 +153,14 @@ public class ThreadPresenter implements ChanLoader.ChanLoaderCallback, PostAdapt for (int i = 0; i < chanLoader.getThread().posts.size(); i++) { Post item = chanLoader.getThread().posts.get(i); if (item.hasImage) { - images.add(new PostImage(item.thumbnailUrl, item.imageUrl, item.filename, item.ext, item.imageWidth, item.imageHeight)); + images.add(new PostImage(String.valueOf(item.tim), item.thumbnailUrl, item.imageUrl, item.filename, item.ext, item.imageWidth, item.imageHeight)); if (item.no == post.no) { index = images.size() - 1; } } } - threadPresenterCallback.showImages(images, index, thumbnail); + threadPresenterCallback.showImages(images, index, chanLoader.getLoadable(), thumbnail); } @Override @@ -339,7 +339,7 @@ public class ThreadPresenter implements ChanLoader.ChanLoaderCallback, PostAdapt public void showPostsPopup(Post forPost, List posts); - public void showImages(List images, int index, ImageView thumbnail); + public void showImages(List images, int index, Loadable loadable, ImageView thumbnail); public void scrollTo(int position); } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/ImageViewerController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/ImageViewerController.java index ae1785de..33262c2b 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/ImageViewerController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/ImageViewerController.java @@ -13,6 +13,7 @@ import android.graphics.Point; import android.graphics.PointF; import android.graphics.drawable.BitmapDrawable; import android.os.Build; +import android.text.TextUtils; import android.util.Log; import android.view.View; import android.view.Window; @@ -25,28 +26,43 @@ import com.davemorrissey.labs.subscaleview.ImageViewState; import org.floens.chan.ChanApplication; import org.floens.chan.R; +import org.floens.chan.chan.ImageSearch; import org.floens.chan.controller.Controller; import org.floens.chan.core.model.PostImage; import org.floens.chan.core.presenter.ImageViewerPresenter; +import org.floens.chan.core.settings.ChanSettings; import org.floens.chan.ui.adapter.ImageViewerAdapter; import org.floens.chan.ui.toolbar.Toolbar; +import org.floens.chan.ui.toolbar.ToolbarMenu; +import org.floens.chan.ui.toolbar.ToolbarMenuItem; import org.floens.chan.ui.view.CustomScaleImageView; +import org.floens.chan.ui.view.FloatingMenu; +import org.floens.chan.ui.view.FloatingMenuItem; import org.floens.chan.ui.view.LoadingBar; import org.floens.chan.ui.view.MultiImageView; import org.floens.chan.ui.view.OptionalSwipeViewPager; import org.floens.chan.ui.view.TransitionImageView; import org.floens.chan.utils.AndroidUtils; +import org.floens.chan.utils.ImageSaver; import org.floens.chan.utils.Logger; +import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import static org.floens.chan.utils.AndroidUtils.dp; -public class ImageViewerController extends Controller implements View.OnClickListener, ImageViewerPresenter.Callback { +public class ImageViewerController extends Controller implements View.OnClickListener, ImageViewerPresenter.Callback, ToolbarMenuItem.ToolbarMenuItemCallback { private static final String TAG = "ImageViewerController"; private static final int TRANSITION_DURATION = 200; private static final float TRANSITION_FINAL_ALPHA = 0.85f; + private static final int SAVE_ID = 101; + private static final int OPEN_BROWSER_ID = 102; + private static final int SHARE_ID = 103; + private static final int SEARCH_ID = 104; + private static final int SAVE_ALBUM = 105; + private int statusBarColorPrevious; private AnimatorSet startAnimation; private AnimatorSet endAnimation; @@ -59,6 +75,8 @@ public class ImageViewerController extends Controller implements View.OnClickLis private OptionalSwipeViewPager pager; private LoadingBar loadingBar; + private ToolbarMenuItem overflowMenuItem; + public ImageViewerController(Context context, Toolbar toolbar) { super(context); this.toolbar = toolbar; @@ -70,6 +88,15 @@ public class ImageViewerController extends Controller implements View.OnClickLis public void onCreate() { super.onCreate(); + navigationItem.menu = new ToolbarMenu(context); + overflowMenuItem = navigationItem.createOverflow(context, this, Arrays.asList( + new FloatingMenuItem(SAVE_ID, string(R.string.image_save)), + new FloatingMenuItem(OPEN_BROWSER_ID, string(R.string.action_open_browser)), + new FloatingMenuItem(SHARE_ID, string(R.string.action_share)), + new FloatingMenuItem(SEARCH_ID, string(R.string.action_search_image)), + new FloatingMenuItem(SAVE_ALBUM, string(R.string.action_download_album)) + )); + view = inflateRes(R.layout.controller_image_viewer); view.setOnClickListener(this); previewImage = (TransitionImageView) view.findViewById(R.id.preview_image); @@ -86,6 +113,67 @@ public class ImageViewerController extends Controller implements View.OnClickLis }); } + @Override + public void onMenuItemClicked(ToolbarMenuItem item) { + } + + @Override + public void onSubMenuItemClicked(ToolbarMenuItem parent, FloatingMenuItem item) { + PostImage postImage = presenter.getCurrentPostImage(); + switch ((Integer) item.getId()) { + case SAVE_ID: + case SHARE_ID: + if (ChanSettings.shareUrl.get()) { + AndroidUtils.shareLink(postImage.imageUrl); + } else { + ImageSaver.getInstance().saveImage(context, postImage.imageUrl, + ChanSettings.saveOriginalFilename.get() ? postImage.originalName : postImage.filename, + postImage.extension, + ((Integer) item.getId()) == SHARE_ID); + } + break; + case OPEN_BROWSER_ID: + AndroidUtils.openLink(postImage.imageUrl); + break; + case SEARCH_ID: + List items = new ArrayList<>(); + for (ImageSearch imageSearch : ImageSearch.engines) { + items.add(new FloatingMenuItem(imageSearch.getId(), imageSearch.getName())); + } + FloatingMenu menu = new FloatingMenu(context, overflowMenuItem.getView(), items); + menu.setCallback(new FloatingMenu.FloatingMenuCallback() { + @Override + public void onFloatingMenuItemClicked(FloatingMenu menu, FloatingMenuItem item) { + for (ImageSearch imageSearch : ImageSearch.engines) { + if (((Integer) item.getId()) == imageSearch.getId()) { + AndroidUtils.openLink(imageSearch.getUrl(presenter.getCurrentPostImage().imageUrl)); + break; + } + } + } + }); + menu.show(); + break; + case SAVE_ALBUM: + List all = presenter.getAllPostImages(); + List list = new ArrayList<>(); + + String folderName = presenter.getLoadable().title; + if (TextUtils.isEmpty(folderName)) { + folderName = String.valueOf(presenter.getLoadable().no); + } + + String filename; + for (PostImage post : all) { + filename = (ChanSettings.saveOriginalFilename.get() ? postImage.originalName : postImage.filename) + "." + post.extension; + list.add(new ImageSaver.DownloadPair(post.imageUrl, filename)); + } + + ImageSaver.getInstance().saveAll(context, folderName, list); + break; + } + } + @Override public void onClick(View v) { presenter.onExit(); @@ -130,7 +218,7 @@ public class ImageViewerController extends Controller implements View.OnClickLis public void setTitle(PostImage postImage) { navigationItem.title = postImage.filename; - toolbar.setNavigationItem(false, false, navigationItem); + toolbar.updateTitle(navigationItem); } public void scrollTo(PostImage postImage) { diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/ImageViewerNavigationController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/ImageViewerNavigationController.java index 77c455ea..0e89789a 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/ImageViewerNavigationController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/ImageViewerNavigationController.java @@ -5,6 +5,7 @@ import android.widget.FrameLayout; import org.floens.chan.R; import org.floens.chan.controller.NavigationController; +import org.floens.chan.core.model.Loadable; import org.floens.chan.core.model.PostImage; import org.floens.chan.ui.toolbar.Toolbar; @@ -31,8 +32,8 @@ public class ImageViewerNavigationController extends NavigationController { pushController(imageViewerController, false); } - public void showImages(final List images, final int index, final ImageViewerController.PreviewCallback previewCallback) { + public void showImages(final List images, final int index, final Loadable loadable, final ImageViewerController.PreviewCallback previewCallback) { imageViewerController.setPreviewCallback(previewCallback); - imageViewerController.getPresenter().showImages(images, index); + imageViewerController.getPresenter().showImages(images, index, loadable); } } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/ThreadController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/ThreadController.java index 99e89774..5d6c170b 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/ThreadController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/ThreadController.java @@ -4,6 +4,7 @@ import android.content.Context; import android.widget.ImageView; import org.floens.chan.controller.Controller; +import org.floens.chan.core.model.Loadable; import org.floens.chan.core.model.PostImage; import org.floens.chan.ui.layout.ThreadLayout; @@ -21,12 +22,12 @@ public abstract class ThreadController extends Controller implements ThreadLayou } @Override - public void showImages(List images, int index, final ImageView thumbnail) { + public void showImages(List images, int index, Loadable loadable, final ImageView thumbnail) { // Just ignore the showImages request when the image is not loaded if (thumbnail.getDrawable() != null && thumbnail.getDrawable().getIntrinsicWidth() > 0 && thumbnail.getDrawable().getIntrinsicHeight() > 0) { final ImageViewerNavigationController imageViewerNavigationController = new ImageViewerNavigationController(context); presentController(imageViewerNavigationController, false); - imageViewerNavigationController.showImages(images, index, this); + imageViewerNavigationController.showImages(images, index, loadable, this); } } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadLayout.java b/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadLayout.java index 6c09812f..0b39cca9 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadLayout.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadLayout.java @@ -164,8 +164,8 @@ public class ThreadLayout extends LoadView implements ThreadPresenter.ThreadPres } @Override - public void showImages(List images, int index, ImageView thumbnail) { - callback.showImages(images, index, thumbnail); + public void showImages(List images, int index, Loadable loadable, ImageView thumbnail) { + callback.showImages(images, index, loadable, thumbnail); } @Override @@ -187,6 +187,6 @@ public class ThreadLayout extends LoadView implements ThreadPresenter.ThreadPres public interface ThreadLayoutCallback { public void openThread(Loadable threadLoadable); - public void showImages(List images, int index, ImageView thumbnail); + public void showImages(List images, int index, Loadable loadable, ImageView thumbnail); } } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/toolbar/NavigationItem.java b/Clover/app/src/main/java/org/floens/chan/ui/toolbar/NavigationItem.java index ef909ba3..de32e1b3 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/toolbar/NavigationItem.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/toolbar/NavigationItem.java @@ -34,10 +34,10 @@ public class NavigationItem { public FloatingMenu middleMenu; public View rightView; - public FloatingMenu createOverflow(Context context, ToolbarMenuItem.ToolbarMenuItemCallback callback, List items) { + public ToolbarMenuItem createOverflow(Context context, ToolbarMenuItem.ToolbarMenuItemCallback callback, List items) { ToolbarMenuItem overflow = menu.createOverflow(callback); FloatingMenu overflowMenu = new FloatingMenu(context, overflow.getView(), items); overflow.setSubMenu(overflowMenu); - return overflowMenu; + return overflow; } } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/toolbar/Toolbar.java b/Clover/app/src/main/java/org/floens/chan/ui/toolbar/Toolbar.java index 07330cca..66434550 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/toolbar/Toolbar.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/toolbar/Toolbar.java @@ -89,6 +89,15 @@ public class Toolbar extends LinearLayout implements View.OnClickListener { } } + public void updateTitle(NavigationItem item) { + if (item.view != null) { + TextView title = (TextView) item.view.findViewById(R.id.title); + if (title != null) { + title.setText(item.title); + } + } + } + public void setCallback(ToolbarCallback callback) { this.callback = callback; }