From 3ac42b4d72a41769d4390e91cef6e39bfd4ee9c9 Mon Sep 17 00:00:00 2001 From: NekoInverter <42698724+NekoInverter@users.noreply.github.com> Date: Sat, 7 Nov 2020 09:31:14 +0800 Subject: [PATCH] Import cookies from clipboard --- .../ehviewer/ui/scene/CookieSignInScene.java | 81 ++++++++++++++++++- .../main/res/layout/scene_cookie_sign_in.xml | 21 +++++ app/src/main/res/values-zh-rCN/strings.xml | 2 + app/src/main/res/values/strings.xml | 2 + 4 files changed, 105 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/CookieSignInScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/CookieSignInScene.java index 201b44d74..93e808bdc 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/CookieSignInScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/CookieSignInScene.java @@ -16,10 +16,15 @@ package com.hippo.ehviewer.ui.scene; +import android.content.ClipData; +import android.content.ClipDescription; +import android.content.ClipboardManager; import android.content.Context; import android.content.SharedPreferences; +import android.graphics.Paint; import android.os.Bundle; import android.text.TextUtils; +import android.util.Log; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; @@ -61,6 +66,10 @@ public class CookieSignInScene extends SolidScene implements EditText.OnEditorAc private EditText mIgneous; @Nullable private View mOk; + @Nullable + private TextView mFromClipboard; + @Nullable + private ClipboardManager clipboardManager; // false for error private static boolean checkIpbMemberId(String id) { @@ -112,10 +121,14 @@ public class CookieSignInScene extends SolidScene implements EditText.OnEditorAc mIgneous = mIgneousLayout.getEditText(); AssertUtils.assertNotNull(mIgneous); mOk = ViewUtils.$$(view, R.id.ok); + mFromClipboard = (TextView) ViewUtils.$$(view, R.id.from_clipboard); + + mFromClipboard.setPaintFlags(mFromClipboard.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG | Paint.ANTI_ALIAS_FLAG); mIpbPassHash.setOnEditorActionListener(this); mOk.setOnClickListener(this); + mFromClipboard.setOnClickListener(this); // Try to get old version cookie info Context context = getContext2(); @@ -147,7 +160,7 @@ public class CookieSignInScene extends SolidScene implements EditText.OnEditorAc @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - + clipboardManager = (ClipboardManager) requireActivity().getSystemService(Context.CLIPBOARD_SERVICE); showSoftInput(mIpbMemberId); } @@ -167,6 +180,8 @@ public class CookieSignInScene extends SolidScene implements EditText.OnEditorAc public void onClick(View v) { if (mOk == v) { enter(); + } else if (mFromClipboard == v) { + fillCookiesFromClipboard(); } } @@ -239,4 +254,68 @@ public class CookieSignInScene extends SolidScene implements EditText.OnEditorAc store.addCookie(newCookie(EhCookieStore.KEY_IGNEOUS, igneous, EhUrl.DOMAIN_EX)); } } + + private void fillCookiesFromClipboard() { + hideSoftInput(); + try { + String pasteData; + if (!clipboardManager.hasPrimaryClip()/* || !clipboardManager.getPrimaryClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)*/) { + showTip(R.string.from_clipboard_error, LENGTH_SHORT); + } else { + ClipData.Item item = clipboardManager.getPrimaryClip().getItemAt(0); + pasteData = String.valueOf(item.coerceToText(requireContext())); + if (!TextUtils.isEmpty(pasteData)) { + String[] kvs; + if (pasteData.contains(";")) { + kvs = pasteData.split(";"); + } else if (pasteData.contains("\n")) { + kvs = pasteData.split("\n"); + } else { + showTip(R.string.from_clipboard_error, LENGTH_SHORT); + return; + } + if (kvs.length < 3) { + showTip(R.string.from_clipboard_error, LENGTH_SHORT); + return; + } + for (String s : kvs) { + String[] kv; + if (s.contains("=")) { + kv = s.split("="); + } else if (s.contains(":")) { + kv = s.split(":"); + } else { + continue; + } + if (kv.length != 2) { + continue; + } + switch (kv[0].trim().toLowerCase()) { + case "ipb_member_id": + if (mIpbMemberId != null) { + mIpbMemberId.setText(kv[1].trim()); + } + break; + case "ipb_pass_hash": + if (mIpbPassHash != null) { + mIpbPassHash.setText(kv[1].trim()); + } + break; + case "igneous": + if (mIgneous != null) { + mIgneous.setText(kv[1].trim()); + } + break; + } + } + enter(); + } else { + showTip(R.string.from_clipboard_error, LENGTH_SHORT); + } + } + } catch (Exception e) { + showTip(R.string.from_clipboard_error, LENGTH_SHORT); + e.printStackTrace(); + } + } } diff --git a/app/src/main/res/layout/scene_cookie_sign_in.xml b/app/src/main/res/layout/scene_cookie_sign_in.xml index 5aae2c623..1a9ad97c0 100644 --- a/app/src/main/res/layout/scene_cookie_sign_in.xml +++ b/app/src/main/res/layout/scene_cookie_sign_in.xml @@ -136,4 +136,25 @@ android:text="@android:string/ok" /> + + + + + + diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index c363c97f3..5ee4336b7 100755 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -731,4 +731,6 @@ 不,这不是 是的,这很正确 投票成功 + 从剪贴板导入 + 未在剪贴板中发现 Cookeis。 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 053fe13f9..9eaa70c49 100755 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -795,4 +795,6 @@ Vote down Vote up Vote successfully + From clipboard + No cookies found in clipboard.