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 1a2e2722c..229e3d9d5 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/MainActivity.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/MainActivity.java @@ -42,6 +42,7 @@ import com.hippo.ehviewer.client.EhUrlOpener; import com.hippo.ehviewer.client.EhUtils; import com.hippo.ehviewer.ui.scene.AnalyticsScene; import com.hippo.ehviewer.ui.scene.BaseScene; +import com.hippo.ehviewer.ui.scene.CookieSignInScene; import com.hippo.ehviewer.ui.scene.DownloadLabelScene; import com.hippo.ehviewer.ui.scene.DownloadsScene; import com.hippo.ehviewer.ui.scene.FavoritesScene; @@ -97,6 +98,7 @@ public final class MainActivity extends StageActivity registerLaunchMode(AnalyticsScene.class, SceneFragment.LAUNCH_MODE_SINGLE_TASK); registerLaunchMode(SignInScene.class, SceneFragment.LAUNCH_MODE_SINGLE_TASK); registerLaunchMode(WebViewSignInScene.class, SceneFragment.LAUNCH_MODE_SINGLE_TASK); + registerLaunchMode(CookieSignInScene.class, SceneFragment.LAUNCH_MODE_SINGLE_TASK); registerLaunchMode(GalleryListScene.class, SceneFragment.LAUNCH_MODE_SINGLE_TOP); registerLaunchMode(QuickSearchScene.class, SceneFragment.LAUNCH_MODE_SINGLE_TASK); registerLaunchMode(GalleryDetailScene.class, SceneFragment.LAUNCH_MODE_STANDARD); 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 new file mode 100644 index 000000000..5a753d062 --- /dev/null +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/CookieSignInScene.java @@ -0,0 +1,206 @@ +/* + * Copyright 2016 Hippo Seven + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.hippo.ehviewer.ui.scene; + +import android.content.Context; +import android.content.DialogInterface; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.design.widget.TextInputLayout; +import android.support.v7.app.AlertDialog; +import android.text.TextUtils; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.EditText; +import android.widget.TextView; + +import com.hippo.ehviewer.EhApplication; +import com.hippo.ehviewer.R; +import com.hippo.ehviewer.client.EhCookieStore; +import com.hippo.ehviewer.client.EhUrl; +import com.hippo.rippleold.RippleSalon; +import com.hippo.util.ActivityHelper; +import com.hippo.yorozuya.AssertUtils; +import com.hippo.yorozuya.ViewUtils; + +import okhttp3.Cookie; + +public class CookieSignInScene extends BaseScene implements EditText.OnEditorActionListener, + View.OnClickListener { + + /*--------------- + View life cycle + ---------------*/ + @Nullable + private TextInputLayout mIpbMemberIdLayout; + @Nullable + private TextInputLayout mIpbPassHashLayout; + @Nullable + private EditText mIpbMemberId; + @Nullable + private EditText mIpbPassHash; + @Nullable + private View mOk; + + @Override + public boolean needShowLeftDrawer() { + return false; + } + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.scene_cookie_sign_in, container, false); + mIpbMemberIdLayout = (TextInputLayout) ViewUtils.$$(view, R.id.ipb_member_id_layout); + mIpbMemberId = mIpbMemberIdLayout.getEditText(); + AssertUtils.assertNotNull(mIpbMemberId); + mIpbPassHashLayout = (TextInputLayout) ViewUtils.$$(view, R.id.ipb_pass_hash_layout); + mIpbPassHash = mIpbPassHashLayout.getEditText(); + AssertUtils.assertNotNull(mIpbPassHash); + mOk = ViewUtils.$$(view, R.id.ok); + + mIpbPassHash.setOnEditorActionListener(this); + + mOk.setOnClickListener(this); + + RippleSalon.addRipple(mOk, true); + + return view; + } + + + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + + ActivityHelper.showSoftInput(getActivity(), mIpbMemberId); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + + mIpbMemberIdLayout = null; + mIpbPassHashLayout = null; + mIpbMemberId = null; + mIpbPassHash = null; + } + + @Override + public void onClick(View v) { + if (mOk == v) { + enter(); + } + } + + @Override + public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { + if (mIpbPassHash == v) { + enter(); + } + return true; + } + + // false for error + private static boolean checkIpbMemberId(String id) { + for (int i = 0, n = id.length(); i < n; i++) { + char ch = id.charAt(i); + if (!(ch >= '0' && ch <= '9')) { + return false; + } + } + return true; + } + + private static boolean checkIpbPassHash(String hash) { + if (32 != hash.length()) { + return false; + } + + for (int i = 0, n = hash.length(); i < n; i++) { + char ch = hash.charAt(i); + if (!(ch >= '0' && ch <= '9') && !(ch >= 'a' && ch <= 'z')) { + return false; + } + } + return true; + } + + public void enter() { + if (null == mIpbMemberIdLayout || null == mIpbPassHashLayout || + null == mIpbMemberId || null == mIpbPassHash) { + return; + } + + final String ipbMemberId = mIpbMemberId.getText().toString().trim(); + final String ipbPassHash = mIpbPassHash.getText().toString().trim(); + + if (TextUtils.isEmpty(ipbMemberId)) { + mIpbMemberIdLayout.setError(getString(R.string.text_is_empty)); + return; + } else { + mIpbMemberIdLayout.setError(null); + } + if (TextUtils.isEmpty(ipbPassHash)) { + mIpbPassHashLayout.setError(getString(R.string.text_is_empty)); + return; + } else { + mIpbPassHashLayout.setError(null); + } + + ActivityHelper.hideSoftInput(getActivity()); + + if (!checkIpbMemberId(ipbMemberId) || !(checkIpbPassHash(ipbPassHash))) { + new AlertDialog.Builder(getContext()).setTitle(R.string.waring) + .setMessage(R.string.wrong_cookie_warning) + .setNegativeButton(R.string.i_dont_think_so, null) + .setPositiveButton(R.string.i_will_check_it, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + storeCookie(ipbMemberId, ipbPassHash); + setResult(RESULT_OK, null); + finish(); + } + }).show(); + } else { + storeCookie(ipbMemberId, ipbPassHash); + setResult(RESULT_OK, null); + finish(); + } + } + + private static Cookie newCookie(String name, String value, String domain) { + return new Cookie.Builder().name(name).value(value) + .domain(domain).expiresAt(Long.MAX_VALUE).build(); + } + + private void storeCookie(String id, String hash) { + Context context = getContext(); + if (null == context) { + return; + } + + EhCookieStore store = EhApplication.getEhCookieStore(context); + store.removeAll(); + store.add(newCookie(EhCookieStore.KEY_IPD_MEMBER_ID, id, EhUrl.DOMAIN_E)); + store.add(newCookie(EhCookieStore.KEY_IPD_MEMBER_ID, id, EhUrl.DOMAIN_EX)); + store.add(newCookie(EhCookieStore.KEY_IPD_PASS_HASH, hash, EhUrl.DOMAIN_E)); + store.add(newCookie(EhCookieStore.KEY_IPD_PASS_HASH, hash, EhUrl.DOMAIN_EX)); + } +} diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/SignInScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/SignInScene.java index 57b4c7c3a..9fb43ba3d 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/SignInScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/SignInScene.java @@ -55,6 +55,7 @@ public final class SignInScene extends BaseScene implements EditText.OnEditorAct private static final String KEY_REQUEST_ID = "request_id"; private static final int REQUEST_CODE_WEBVIEW = 0; + private static final int REQUEST_CODE_COOKIE = 0; /*--------------- View life cycle @@ -220,7 +221,7 @@ public final class SignInScene extends BaseScene implements EditText.OnEditorAct } else if (mSignInViaWebView == v) { startScene(new Announcer(WebViewSignInScene.class).setRequestCode(this, REQUEST_CODE_WEBVIEW)); } else if (mSignInViaCookies == v) { - + startScene(new Announcer(CookieSignInScene.class).setRequestCode(this, REQUEST_CODE_COOKIE)); } else if (mSkipSigningIn == v) { redirectTo(); } diff --git a/app/src/main/res/drawable/v_cookie_brown_x48.xml b/app/src/main/res/drawable/v_cookie_brown_x48.xml new file mode 100644 index 000000000..27cde1d7a --- /dev/null +++ b/app/src/main/res/drawable/v_cookie_brown_x48.xml @@ -0,0 +1,29 @@ + + + + + + + + diff --git a/app/src/main/res/layout/scene_cookie_sign_in.xml b/app/src/main/res/layout/scene_cookie_sign_in.xml new file mode 100644 index 000000000..da175efdb --- /dev/null +++ b/app/src/main/res/layout/scene_cookie_sign_in.xml @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 0bc9aebb2..c81c0b183 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -37,6 +37,15 @@ 昵称 昵称为空 + Little Hippo + + Cookie 是存储在浏览器里的一小块数据。如果您不清楚 Cookie 什么或者怎么获取 Cookie,最好搜索一下。\n\n可以通过输入特定的 Cookie 来登陆。 + 文本为空 + 警告 + 看起来您输入的 Cookie 是错误的,最好检查一下。 + 好的 + 我没输错 + 错误的状态码:%d 超时 未知主机 @@ -67,9 +76,9 @@ 登陆失败。这可能是网站更新导致的,也有可能是发生了奇怪的事情。您可以选择在登陆按钮下方通过网页登陆或者输入 cookie,或者跳过登陆。跳过登陆可能导致无法正常使用应用。 再按一次退出 点击重试 - EhViewer 将申请设备存储空间访问权限以便下载画廊。你愿意授权吗? + EhViewer 将申请设备存储空间访问权限以便下载画廊。您愿意授权吗? 好痛 - 你同意让开发者收集你的设备信息与使用情况吗?这将对开发有很大帮助。<br><br>数据统计服务由 Google Analytics 提供,其隐私政策可在 <a href="https://www.google.com/policies/privacy/">https://www.google.com/policies/privacy/</a> 查看。<br><br>若您同意参与数据统计,您的设备信息与应用使用情况将会被记录,其包括但不限于:Android API 版本、设备型号、语言所在地、本应用版本号、会话时长、应用功能使用次数。开发者承诺以下信息并不会被记录:电话号码、电子邮件地址、IMEI。<br><br>在您同意参与数据统计之前,您的信息不会被记录。<br><br>被记录的数据会由 Google Analytics 进行分析,分析报表仅可被本应用开发者访问。 + 您同意让开发者收集您的设备信息与使用情况吗?这将对开发有很大帮助。<br><br>数据统计服务由 Google Analytics 提供,其隐私政策可在 <a href="https://www.google.com/policies/privacy/">https://www.google.com/policies/privacy/</a> 查看。<br><br>若您同意参与数据统计,您的设备信息与应用使用情况将会被记录,其包括但不限于:Android API 版本、设备型号、语言所在地、本应用版本号、会话时长、应用功能使用次数。开发者承诺以下信息并不会被记录:电话号码、电子邮件地址、IMEI。<br><br>在您同意参与数据统计之前,您的信息不会被记录。<br><br>被记录的数据会由 Google Analytics 进行分析,分析报表仅可被本应用开发者访问。 知道了 @@ -286,8 +295,8 @@ 下载路径 无效的下载路径 无法获取下载路径 - 在 KitKat 中你无法把数据写入外置 SD 卡,除非你做了奇怪的事情 - Lollipop 提供了新的写入外置 SD 卡的 API。如果你想把下载路径设置到外置 SD 卡上,点击 \"文档\" 按钮 + 在 KitKat 中您无法把数据写入外置 SD 卡,除非您做了奇怪的事情 + Lollipop 提供了新的写入外置 SD 卡的 API。如果您想把下载路径设置到外置 SD 卡上,点击 \"文档\" 按钮 文档 关于 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 52553cb05..3eab9415d 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -37,6 +37,15 @@ 暱稱 暱稱為空 + Little Hippo + + Cookie 是存儲在瀏覽器裏的一小塊數據。如果您不清楚 Cookie 什麼或者怎麼獲取 Cookie,最好搜索一下。\n\n可以通過輸入特定的 Cookie 來登陸。 + 文本為空 + 警告 + 看起來您輸入的 Cookie 是錯誤的,最好檢查一下。 + 好的 + 我沒輸錯 + 錯誤的狀態碼:%d 超時 未知主機 @@ -67,9 +76,9 @@ 登陸失敗。這可能是網站更新導致的,也有可能是發生了奇怪的事情。您可以選擇在登陸按鈕下方通過網頁登陸或者輸入 cookie,或者跳過登陸。跳過登陸可能導致無法正常使用應用。 再按一次退出 點擊重試 - EhViewer 將申請設備存儲空間訪問權限以便下載畫廊。你願意授權嗎? + EhViewer 將申請設備存儲空間訪問權限以便下載畫廊。您願意授權嗎? 好痛 - 你同意讓開發者收集你的設備信息與使用情況嗎?這將對開發有很大幫助。<br><br>數據統計服務由 Google Analytics 提供,其隱私政策可在 <a href="https://www.google.com/policies/privacy/">https://www.google.com/policies/privacy/</a> 查看。<br><br>若您同意參與數據統計,您的設備信息與應用使用情況將會被記錄,其包括但不限於:Android API 版本、設備型號、語言所在地、本應用版本號、會話時長、應用功能使用次數。開發者承諾以下信息並不會被記錄:電話號碼、電子郵件地址、IMEI。<br><br>在您同意參與數據統計之前,您的信息不會被記錄。<br><br>被記錄的數據會由 Google Analytics 進行分析,分析報表僅可被本應用開發者訪問。 + 您同意讓開發者收集您的設備信息與使用情況嗎?這將對開發有很大幫助。<br><br>數據統計服務由 Google Analytics 提供,其隱私政策可在 <a href="https://www.google.com/policies/privacy/">https://www.google.com/policies/privacy/</a> 查看。<br><br>若您同意參與數據統計,您的設備信息與應用使用情況將會被記錄,其包括但不限於:Android API 版本、設備型號、語言所在地、本應用版本號、會話時長、應用功能使用次數。開發者承諾以下信息並不會被記錄:電話號碼、電子郵件地址、IMEI。<br><br>在您同意參與數據統計之前,您的信息不會被記錄。<br><br>被記錄的數據會由 Google Analytics 進行分析,分析報表僅可被本應用開發者訪問。 知道了 @@ -286,8 +295,8 @@ 下載路徑 無效的下載路徑 無法獲取下載路徑 - 在 KitKat 中你無法把數據寫入外置 SD 卡,除非你做了奇怪的事情 - Lollipop 提供了新的寫入外置 SD 卡的 API。如果你想把下載路徑設置到外置 SD 卡上,點擊 \"文檔\" 按鈕 + 在 KitKat 中您無法把數據寫入外置 SD 卡,除非您做了奇怪的事情 + Lollipop 提供了新的寫入外置 SD 卡的 API。如果您想把下載路徑設置到外置 SD 卡上,點擊 \"文檔\" 按鈕 文檔 關於 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index fa7d21cab..b7149b48f 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -37,6 +37,15 @@ 暱稱 暱稱為空 + Little Hippo + + Cookie 是儲存在瀏覽器裡的一小塊資料。如果您不清楚 Cookie 什麼或者怎麼獲取 Cookie,最好搜尋一下。\n\n可以通過輸入特定的 Cookie 來登陸。 + 文字為空 + 警告 + 看起來您輸入的 Cookie 是錯誤的,最好檢查一下。 + 好的 + 我沒輸錯 + 錯誤的狀態碼:%d 超時 未知主機 @@ -67,9 +76,9 @@ 登陸失敗。這可能是網站更新導致的,也有可能是發生了奇怪的事情。您可以選擇在登陸按鈕下方通過網頁登陸或者輸入 cookie,或者跳過登陸。跳過登陸可能導致無法正常使用應用。 再按一次退出 點選重試 - EhViewer 將申請裝置儲存空間訪問許可權以便下載畫廊。你願意授權嗎? + EhViewer 將申請裝置儲存空間訪問許可權以便下載畫廊。您願意授權嗎? 好痛 - 你同意讓開發者收集你的裝置資訊與使用情況嗎?這將對開發有很大幫助。<br><br>資料統計服務由 Google Analytics 提供,其隱私政策可在 <a href="https://www.google.com/policies/privacy/">https://www.google.com/policies/privacy/</a> 檢視。<br><br>若您同意參與資料統計,您的裝置資訊與應用使用情況將會被記錄,其包括但不限於:Android API 版本、裝置型號、語言所在地、本應用版本號、會話時長、應用功能使用次數。開發者承諾以下資訊並不會被記錄:電話號碼、電子郵件地址、IMEI。<br><br>在您同意參與資料統計之前,您的資訊不會被記錄。<br><br>被記錄的資料會由 Google Analytics 進行分析,分析報表僅可被本應用開發者訪問。 + 您同意讓開發者收集您的裝置資訊與使用情況嗎?這將對開發有很大幫助。<br><br>資料統計服務由 Google Analytics 提供,其隱私政策可在 <a href="https://www.google.com/policies/privacy/">https://www.google.com/policies/privacy/</a> 檢視。<br><br>若您同意參與資料統計,您的裝置資訊與應用使用情況將會被記錄,其包括但不限於:Android API 版本、裝置型號、語言所在地、本應用版本號、會話時長、應用功能使用次數。開發者承諾以下資訊並不會被記錄:電話號碼、電子郵件地址、IMEI。<br><br>在您同意參與資料統計之前,您的資訊不會被記錄。<br><br>被記錄的資料會由 Google Analytics 進行分析,分析報表僅可被本應用開發者訪問。 知道了 @@ -286,8 +295,8 @@ 下載路徑 無效的下載路徑 無法獲取下載路徑 - 在 KitKat 中你無法把資料寫入外接 SD 卡,除非你做了奇怪的事情 - Lollipop 提供了新的寫入外接 SD 卡的 API。如果你想把下載路徑設定到外接 SD 卡上,點選 \"文件\" 按鈕 + 在 KitKat 中您無法把資料寫入外接 SD 卡,除非您做了奇怪的事情 + Lollipop 提供了新的寫入外接 SD 卡的 API。如果您想把下載路徑設定到外接 SD 卡上,點選 \"文件\" 按鈕 文件 關於 diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 93c6738a7..106f738c2 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -53,6 +53,7 @@ #ffff7043 #ff9e9e9e #ffeeeeee + #ff795548 @color/teal_500 @color/teal_700 diff --git a/app/src/main/res/values/pathdata.xml b/app/src/main/res/values/pathdata.xml index 046ed68c0..f0eb34560 100644 --- a/app/src/main/res/values/pathdata.xml +++ b/app/src/main/res/values/pathdata.xml @@ -52,6 +52,7 @@ M5,3H19A2,2 0 0,1 21,5V19A2,2 0 0,1 19,21H5A2,2 0 0,1 3,19V5A2,2 0 0,1 5,3M12,17L12.72,16.34C15.3,14 17,12.46 17,10.57C17,9.03 15.79,7.82 14.25,7.82C13.38,7.82 12.55,8.23 12,8.87C11.45,8.23 10.62,7.82 9.75,7.82C8.21,7.82 7,9.03 7,10.57C7,12.46 8.7,14 11.28,16.34L12,17Z M19,3H5C3.9,3,3,3.9,3,5V19C3,20.1,3.9,21,5,21H19C20.1,21,21,20.1,21,19V5C21,3.9,20.1,3,19,3ZM12,17L7,12H10V8H14V12H17L12,17Z M16,11.78L20.24,4.45L21.97,5.45L16.74,14.5L10.23,10.75L5.46,19H22V21H2V3H4V17.54L9.5,8L16,11.78Z + M12,3A9,9 0 0,0 3,12A9,9 0 0,0 12,21A9,9 0 0,0 21,12C21,11.5 20.96,11 20.87,10.5C20.6,10 20,10 20,10H18V9C18,8 17,8 17,8H15V7C15,6 14,6 14,6H13V4C13,3 12,3 12,3M9.5,6A1.5,1.5 0 0,1 11,7.5A1.5,1.5 0 0,1 9.5,9A1.5,1.5 0 0,1 8,7.5A1.5,1.5 0 0,1 9.5,6M6.5,10A1.5,1.5 0 0,1 8,11.5A1.5,1.5 0 0,1 6.5,13A1.5,1.5 0 0,1 5,11.5A1.5,1.5 0 0,1 6.5,10M11.5,11A1.5,1.5 0 0,1 13,12.5A1.5,1.5 0 0,1 11.5,14A1.5,1.5 0 0,1 10,12.5A1.5,1.5 0 0,1 11.5,11M16.5,13A1.5,1.5 0 0,1 18,14.5A1.5,1.5 0 0,1 16.5,16H16.5A1.5,1.5 0 0,1 15,14.5H15A1.5,1.5 0 0,1 16.5,13M11,16A1.5,1.5 0 0,1 12.5,17.5A1.5,1.5 0 0,1 11,19A1.5,1.5 0 0,1 9.5,17.5A1.5,1.5 0 0,1 11,16Z M13,0C20.2,0,26,5.9,26,13.2,26,16.9,24,20.8,18.7,26.1L13,32,7.2,26.2C2,20.8,0,16.9,0,13.3,0,5.9,5.8,0,13,0Z diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8c99ac470..f689602af 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -52,6 +52,13 @@ Little Hippo + A cookie is a small piece of data stored in web browser. Search it if you don\'t know what it is or how to get it.\n\nYou can sign in by entering special cookies. + Text is empty + Warning + It seems that the cookies you entered are wrong. You\'d better check them. + I will check it + I don\'t think so + Bad Request Unauthorized Payment Required