From bce813142237332ed6971fe84843720c5f99fd5b Mon Sep 17 00:00:00 2001 From: Florens Douwes Date: Sat, 2 Aug 2014 12:38:25 +0200 Subject: [PATCH] Added reverse image search. Closes #14 --- .../org/floens/chan/chan/ImageSearch.java | 61 +++++++++++++++++++ .../chan/ui/activity/ImageViewActivity.java | 59 ++++++++++-------- .../chan/ui/fragment/ImageViewFragment.java | 52 ++++++++++------ Clover/app/src/main/res/menu/image_view.xml | 22 ++++--- Clover/app/src/main/res/values/ids.xml | 30 +++++++++ Clover/app/src/main/res/values/strings.xml | 1 + 6 files changed, 174 insertions(+), 51 deletions(-) create mode 100644 Clover/app/src/main/java/org/floens/chan/chan/ImageSearch.java create mode 100644 Clover/app/src/main/res/values/ids.xml diff --git a/Clover/app/src/main/java/org/floens/chan/chan/ImageSearch.java b/Clover/app/src/main/java/org/floens/chan/chan/ImageSearch.java new file mode 100644 index 00000000..f6d91b16 --- /dev/null +++ b/Clover/app/src/main/java/org/floens/chan/chan/ImageSearch.java @@ -0,0 +1,61 @@ +/* + * Clover - 4chan browser https://github.com/Floens/Clover/ + * Copyright (C) 2014 Floens + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.floens.chan.chan; + +import org.floens.chan.R; + +import java.util.ArrayList; +import java.util.List; + +public abstract class ImageSearch { + public static final List engines = new ArrayList<>(); + + public abstract int getId(); + public abstract String getName(); + public abstract String getUrl(String imageUrl); + + static { + engines.add(new ImageSearch() { + public int getId() { + return R.id.action_0; + } + + public String getName() { + return "Google"; + } + + public String getUrl(String imageUrl) { + return "https://www.google.com/searchbyimage?image_url=" + imageUrl; + } + }); + + engines.add(new ImageSearch() { + public int getId() { + return R.id.action_1; + } + + public String getName() { + return "iqdb"; + } + + public String getUrl(String imageUrl) { + return "http://iqdb.org/?url=" + imageUrl; + } + }); + } +} diff --git a/Clover/app/src/main/java/org/floens/chan/ui/activity/ImageViewActivity.java b/Clover/app/src/main/java/org/floens/chan/ui/activity/ImageViewActivity.java index d4595bfc..1aa70b75 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/activity/ImageViewActivity.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/activity/ImageViewActivity.java @@ -24,12 +24,14 @@ import android.support.v4.view.ViewPager; import android.text.TextUtils; import android.view.Menu; import android.view.MenuItem; +import android.view.SubMenu; import android.view.View; import android.view.Window; import android.widget.FrameLayout; import android.widget.ProgressBar; import org.floens.chan.R; +import org.floens.chan.chan.ImageSearch; import org.floens.chan.core.ChanPreferences; import org.floens.chan.core.model.Post; import org.floens.chan.ui.adapter.ImageViewAdapter; @@ -195,35 +197,36 @@ public class ImageViewActivity extends Activity implements ViewPager.OnPageChang @Override public boolean onOptionsItemSelected(MenuItem item) { - if (item.getItemId() == android.R.id.home) { - finish(); - return true; - } else if (item.getItemId() == R.id.action_download_album) { - List list = new ArrayList<>(); - - String name = "downloaded"; - String filename; - for (Post post : adapter.getList()) { - filename = (ChanPreferences.getImageSaveOriginalFilename() ? post.tim : post.filename) + "." + post.ext; - list.add(new ImageSaver.DownloadPair(post.imageUrl, filename)); - - name = post.board + "_" + post.resto; - } + switch (item.getItemId()) { + case android.R.id.home: + finish(); + return true; + case R.id.action_download_album: + List list = new ArrayList<>(); + + String name = "downloaded"; + String filename; + for (Post post : adapter.getList()) { + filename = (ChanPreferences.getImageSaveOriginalFilename() ? post.tim : post.filename) + "." + post.ext; + list.add(new ImageSaver.DownloadPair(post.imageUrl, filename)); + + name = post.board + "_" + post.resto; + } - if (list.size() > 0) { - if (!TextUtils.isEmpty(name)) { - ImageSaver.saveAll(this, name, list); + if (list.size() > 0) { + if (!TextUtils.isEmpty(name)) { + ImageSaver.saveAll(this, name, list); + } } - } - return true; - } else { - ImageViewFragment fragment = getFragment(currentPosition); - if (fragment != null) { - fragment.customOnOptionsItemSelected(item); - } + return true; + default: + ImageViewFragment fragment = getFragment(currentPosition); + if (fragment != null) { + fragment.customOnOptionsItemSelected(item); + } - return super.onOptionsItemSelected(item); + return super.onOptionsItemSelected(item); } } @@ -231,6 +234,12 @@ public class ImageViewActivity extends Activity implements ViewPager.OnPageChang public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.image_view, menu); + MenuItem imageSearch = menu.findItem(R.id.action_image_search); + SubMenu subMenu = imageSearch.getSubMenu(); + for (ImageSearch engine : ImageSearch.engines) { + subMenu.add(Menu.NONE, engine.getId(), Menu.NONE, engine.getName()); + } + return true; } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/fragment/ImageViewFragment.java b/Clover/app/src/main/java/org/floens/chan/ui/fragment/ImageViewFragment.java index a76ad072..1c906b65 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/fragment/ImageViewFragment.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/fragment/ImageViewFragment.java @@ -28,6 +28,7 @@ import android.view.ViewGroup; import android.widget.VideoView; import org.floens.chan.R; +import org.floens.chan.chan.ImageSearch; import org.floens.chan.core.ChanPreferences; import org.floens.chan.core.model.Post; import org.floens.chan.ui.activity.ImageViewActivity; @@ -209,27 +210,42 @@ public class ImageViewFragment extends Fragment implements ThumbnailImageViewCal } public void customOnOptionsItemSelected(MenuItem item) { - if (item.getItemId() == R.id.action_image_play_state) { - if (!videoVisible) { - startVideo(); - } else { - VideoView view = imageView.getVideoView(); - if (view != null) { - if (!view.isPlaying()) { - view.start(); - } else { - view.pause(); + switch (item.getItemId()) { + case R.id.action_image_play_state: + if (!videoVisible) { + startVideo(); + } else { + VideoView view = imageView.getVideoView(); + if (view != null) { + if (!view.isPlaying()) { + view.start(); + } else { + view.pause(); + } + } + } + + activity.invalidateActionBar(); + break; + case R.id.action_open_browser: + Utils.openLink(context, post.imageUrl); + break; + case R.id.action_image_save: + ImageSaver.saveImage(context, post.imageUrl, ChanPreferences.getImageSaveOriginalFilename() ? post.tim : post.filename, post.ext, false); + break; + case R.id.action_share: + ImageSaver.saveImage(context, post.imageUrl, ChanPreferences.getImageSaveOriginalFilename() ? post.tim : post.filename, post.ext, true); + break; + default: + // Search if it was an ImageSearch item + for (ImageSearch engine : ImageSearch.engines) { + if (item.getItemId() == engine.getId()) { + Utils.openLink(context, engine.getUrl(post.imageUrl)); + break; } } - } - activity.invalidateActionBar(); - } else if (item.getItemId() == R.id.action_open_browser) { - Utils.openLink(context, post.imageUrl); - } else if (item.getItemId() == R.id.action_image_save) { - ImageSaver.saveImage(context, post.imageUrl, ChanPreferences.getImageSaveOriginalFilename() ? post.tim : post.filename, post.ext, false); - } else if (item.getItemId() == R.id.action_share) { - ImageSaver.saveImage(context, post.imageUrl, ChanPreferences.getImageSaveOriginalFilename() ? post.tim : post.filename, post.ext, true); + break; } } diff --git a/Clover/app/src/main/res/menu/image_view.xml b/Clover/app/src/main/res/menu/image_view.xml index bcebd665..8b523982 100644 --- a/Clover/app/src/main/res/menu/image_view.xml +++ b/Clover/app/src/main/res/menu/image_view.xml @@ -1,5 +1,4 @@ - - + + + + + + + + + + + + + diff --git a/Clover/app/src/main/res/values/strings.xml b/Clover/app/src/main/res/values/strings.xml index 8b593d35..a392e713 100644 --- a/Clover/app/src/main/res/values/strings.xml +++ b/Clover/app/src/main/res/values/strings.xml @@ -44,6 +44,7 @@ along with this program. If not, see . Search Search board Search thread + Image search Search posts Found %1$s %2$s for "%3$s"