diff --git a/app/src/main/java/com/hippo/ehviewer/Settings.java b/app/src/main/java/com/hippo/ehviewer/Settings.java index 27e9bfc33..40e9e683f 100755 --- a/app/src/main/java/com/hippo/ehviewer/Settings.java +++ b/app/src/main/java/com/hippo/ehviewer/Settings.java @@ -1100,4 +1100,15 @@ public class Settings { public static void putGuideGallery(boolean value) { putBoolean(KEY_GUIDE_GALLERY, value); } + + private static final String KEY_CLIPBOARD_TEXT = "clipboard_text"; + private static final String DEFAULT_CLIPBOARD_TEXT = ""; + + public static String getClipboardText() { + return getString(KEY_CLIPBOARD_TEXT, DEFAULT_CLIPBOARD_TEXT); + } + + public static void putClipboardText(String value) { + putString(KEY_CLIPBOARD_TEXT, value); + } } diff --git a/app/src/main/java/com/hippo/ehviewer/client/EhUrl.java b/app/src/main/java/com/hippo/ehviewer/client/EhUrl.java index 1ee8516aa..d6f2dc7cb 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/EhUrl.java +++ b/app/src/main/java/com/hippo/ehviewer/client/EhUrl.java @@ -17,13 +17,13 @@ package com.hippo.ehviewer.client; import android.support.annotation.NonNull; - +import android.util.Pair; import com.hippo.ehviewer.Settings; import com.hippo.network.UrlBuilder; - import java.util.List; import java.util.ListIterator; - +import java.util.regex.Matcher; +import java.util.regex.Pattern; import okhttp3.HttpUrl; public class EhUrl { @@ -58,6 +58,8 @@ public class EhUrl { private static final String URL_PREFIX_THUMB_E = "https://ehgt.org/t/"; private static final String URL_PREFIX_THUMB_EX = "https://exhentai.org/t/"; + public static final Pattern PATTERN_DETAIL_URL = Pattern.compile("g/(\\d+)/([0-9a-f]{10})"); + public static String getGalleryDetailUrl(long gid, String token) { return getGalleryDetailUrl(gid, token, 0, false); } @@ -179,4 +181,13 @@ public class EhUrl { return originUrl; } } + + public static Pair parseGalleryDetailUrl(String url) { + Matcher matcher = PATTERN_DETAIL_URL.matcher(url); + if (matcher.find()) { + return new Pair<>(Long.parseLong(matcher.group(1)), matcher.group(2)); + } else { + return null; + } + } } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/MainActivity.java b/app/src/main/java/com/hippo/ehviewer/ui/MainActivity.java index cd247facb..bb708a0c5 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/MainActivity.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/MainActivity.java @@ -17,6 +17,9 @@ package com.hippo.ehviewer.ui; import android.Manifest; +import android.content.ClipData; +import android.content.ClipboardManager; +import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.graphics.Bitmap; @@ -33,19 +36,19 @@ import android.support.design.widget.NavigationView; import android.support.design.widget.Snackbar; import android.support.v7.app.AlertDialog; import android.text.TextUtils; -import android.util.Log; +import android.util.Pair; import android.view.Gravity; import android.view.MenuItem; import android.view.View; import android.widget.FrameLayout; import android.widget.TextView; import android.widget.Toast; - import com.hippo.drawerlayout.DrawerLayout; import com.hippo.ehviewer.AppConfig; import com.hippo.ehviewer.Crash; import com.hippo.ehviewer.R; import com.hippo.ehviewer.Settings; +import com.hippo.ehviewer.client.EhUrl; import com.hippo.ehviewer.client.EhUrlOpener; import com.hippo.ehviewer.client.EhUtils; import com.hippo.ehviewer.client.data.ListUrlBuilder; @@ -83,7 +86,6 @@ import com.hippo.widget.LoadImageView; import com.hippo.yorozuya.IOUtils; import com.hippo.yorozuya.ResourcesUtils; import com.hippo.yorozuya.ViewUtils; - import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -97,6 +99,7 @@ public final class MainActivity extends StageActivity private static final int REQUEST_CODE_SETTINGS = 0; private static final String KEY_NAV_CHECKED_ITEM = "nav_checked_item"; + private static final String KEY_CLIP_TEXT = "clip_text"; /*--------------- Whole life cycle @@ -114,6 +117,8 @@ public final class MainActivity extends StageActivity private int mNavCheckedItem = 0; + private String mClipText = null; + static { registerLaunchMode(SecurityScene.class, SceneFragment.LAUNCH_MODE_SINGLE_TASK); registerLaunchMode(WarningScene.class, SceneFragment.LAUNCH_MODE_SINGLE_TASK); @@ -367,16 +372,20 @@ public final class MainActivity extends StageActivity // Check permission PermissionRequester.request(this, Manifest.permission.WRITE_EXTERNAL_STORAGE, getString(R.string.write_rationale), PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE); + + mClipText = Settings.getClipboardText(); } private void onRestore(Bundle savedInstanceState) { mNavCheckedItem = savedInstanceState.getInt(KEY_NAV_CHECKED_ITEM); + mClipText = savedInstanceState.getString(KEY_CLIP_TEXT); } @Override public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) { super.onSaveInstanceState(outState, outPersistentState); outState.putInt(KEY_NAV_CHECKED_ITEM, mNavCheckedItem); + outState.putString(KEY_CLIP_TEXT, mClipText); } @Override @@ -395,6 +404,46 @@ public final class MainActivity extends StageActivity super.onResume(); setNavCheckedItem(mNavCheckedItem); + + checkClipboardUrl(); + } + + private String getTextFromClipboard() { + ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); + if (clipboard != null) { + ClipData clip = clipboard.getPrimaryClip(); + if (clip.getItemCount() > 0) { + return clip.getItemAt(0).getText().toString(); + } + } + return null; + } + + private void checkClipboardUrl() { + String text = getTextFromClipboard(); + + if (text != null && !text.equals(mClipText)) { + Pair pair = EhUrl.parseGalleryDetailUrl(text); + if (pair != null) { + long gid = pair.first; + String token = pair.second; + new AlertDialog.Builder(this) + .setTitle(R.string.clipboard_gallery_url_dialog_title) + .setMessage(R.string.clipboard_gallery_url_dialog_message) + .setNegativeButton(android.R.string.cancel, null) + .setPositiveButton(android.R.string.ok, (dialog, which) -> { + Bundle args = new Bundle(); + args.putString(GalleryDetailScene.KEY_ACTION, GalleryDetailScene.ACTION_GID_TOKEN); + args.putLong(GalleryDetailScene.KEY_GID, gid); + args.putString(GalleryDetailScene.KEY_TOKEN, token); + startScene(new Announcer(GalleryDetailScene.class).setArgs(args)); + }) + .show(); + } + } + + mClipText = text; + Settings.putClipboardText(text); } @Override @@ -413,8 +462,6 @@ public final class MainActivity extends StageActivity public void onSceneViewCreated(SceneFragment scene, Bundle savedInstanceState) { super.onSceneViewCreated(scene, savedInstanceState); - Log.d("TAG", "onSceneViewCreated"); - if (scene instanceof BaseScene && mRightDrawer != null && mDrawerLayout != null) { BaseScene baseScene = (BaseScene) scene; mRightDrawer.removeAllViews(); diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 06f7e640d..69f8ce339 100755 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -57,6 +57,9 @@ 正在使用移动网络 + 发现画廊 + 剪切板里有画廊链接,要不要看看? + 错误的状态码:%d 超时 未知主机 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 25eb931f4..87f818133 100755 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -57,6 +57,9 @@ 正在使用移動網絡 + 發現畫廊 + 剪切板裏有畫廊鏈接,要不要看看? + 錯誤的狀態碼:%d 超時 未知主機 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 7ab48001d..3595873de 100755 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -57,6 +57,9 @@ 正在使用行動數據 + 發現圖庫 + 剪貼簿裡有圖庫連結,要不要看看? + 錯誤狀態碼:%d 逾時 未知的主機 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 88a2f0b63..6c7a25035 100755 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -73,6 +73,9 @@ Connected to cellular networks + Gallery Detected + A gallery url was found in your clipboard. Check it now? + Bad Request Unauthorized Payment Required