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"