diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 3ee4bcfe9..10bc5c51f 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -69,6 +69,12 @@
android:configChanges="screenSize|uiMode"
android:theme="@style/AppTheme"/>
+
+
'9') {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private void onInit() {
+ String excludedLanguages = Settings.getExcludedLanguages();
+ if (null == excludedLanguages) {
+ return;
+ }
+
+ String[] languages = excludedLanguages.split("x");
+
+ int iLength = languages.length;
+ int jLength = LANGUAGES.length;
+ for (int i = 0, j = 0; i < iLength; i++) {
+ String language = languages[i];
+ if (!isDecimal(language)) {
+ continue;
+ }
+
+ for (; j < jLength; j++) {
+ String pattern = LANGUAGES[j];
+ if (pattern.equals(language)) {
+ // Get it
+ int row = (j + 1) / 3;
+ int column = (j + 1) % 3;
+ mSelections[row][column] = true;
+ break;
+ }
+ }
+ }
+ }
+
+ private long saveSelectionsToLong() {
+ boolean[][] selections = mSelections;
+ long value = 0;
+ for (int i = 0; i < ROW_COUNT; i++) {
+ for (int j = 0; j < 3; j++) {
+ if (selections[i][j]) {
+ value |= 1 << (i * 3 + j);
+ }
+ }
+ }
+ return value;
+ }
+
+ private void restoreSelectionsFromLong(long value) {
+ boolean[][] selections = mSelections;
+ for (int i = 0; i < ROW_COUNT; i++) {
+ for (int j = 0; j < 3; j++) {
+ selections[i][j] = 0 != ((value >>> (i * 3 + j)) & 1);
+ }
+ }
+ }
+
+ private void onRestore(@NonNull Bundle savedInstanceState) {
+ restoreSelectionsFromLong(savedInstanceState.getLong(KEY_SELECTIONS));
+ }
+
+ @Override
+ protected void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ outState.putLong(KEY_SELECTIONS, saveSelectionsToLong());
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+
+ mCancel = null;
+ mOk = null;
+ mSelectAll = null;
+ mDeselectAll = null;
+ mInvertSelection = null;
+ mRecyclerView = null;
+ mAdapter = null;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case android.R.id.home:
+ finish();
+ return true;
+ default:
+ return super.onOptionsItemSelected(item);
+ }
+ }
+
+ @Override
+ public void onClick(View v) {
+ if (null == mAdapter) {
+ return;
+ }
+
+ if (v == mCancel) {
+ finish();
+ } else if (v == mOk) {
+ StringBuilder sb = new StringBuilder();
+ int i = -1;
+ boolean first = true;
+ for (boolean[] selections : mSelections) {
+ for (boolean b : selections) {
+ i++;
+ if (i == 0) {
+ continue;
+ }
+ if (b) {
+ if (!first) {
+ sb.append("x");
+ } else {
+ first = false;
+ }
+ sb.append(LANGUAGES[i - 1]);
+ }
+ }
+ }
+
+ String excludedLanguages = sb.toString();
+ Settings.putExcludedLanguages(excludedLanguages);
+ finish();
+ } else if (v == mSelectAll) {
+ for (boolean[] selections : mSelections) {
+ int length = selections.length;
+ for (int i = 0; i < length; i++) {
+ selections[i] = true;
+ }
+ }
+ mAdapter.notifyDataSetChanged();
+ } else if (v == mDeselectAll) {
+ for (boolean[] selections : mSelections) {
+ int length = selections.length;
+ for (int i = 0; i < length; i++) {
+ selections[i] = false;
+ }
+ }
+ mAdapter.notifyDataSetChanged();
+ } else if (v == mInvertSelection) {
+ for (boolean[] selections : mSelections) {
+ int length = selections.length;
+ for (int i = 0; i < length; i++) {
+ selections[i] = !selections[i];
+ }
+ }
+ mAdapter.notifyDataSetChanged();
+ }
+ }
+
+ private class LanguageHolder extends RecyclerView.ViewHolder
+ implements SensitiveCheckBox.OnCheckedChangeListener {
+
+ public TextView language;
+ public SensitiveCheckBox original;
+ public SensitiveCheckBox translated;
+ public SensitiveCheckBox rewrite;
+
+ public LanguageHolder(View itemView) {
+ super(itemView);
+
+ ViewGroup viewGroup = (ViewGroup) itemView;
+ language = (TextView) viewGroup.getChildAt(0);
+ original = (SensitiveCheckBox) viewGroup.getChildAt(1);
+ translated = (SensitiveCheckBox) viewGroup.getChildAt(2);
+ rewrite = (SensitiveCheckBox) viewGroup.getChildAt(3);
+
+ original.setOnCheckedChangeListener(this);
+ translated.setOnCheckedChangeListener(this);
+ rewrite.setOnCheckedChangeListener(this);
+ }
+
+ @Override
+ public void onCheckedChanged(SensitiveCheckBox view, boolean isChecked, boolean fromUser) {
+ if (fromUser) {
+ int row = getAdapterPosition();
+ if (row < 0) {
+ return;
+ }
+ int column;
+ if (view == original) {
+ column = 0;
+ } else if (view == translated) {
+ column = 1;
+ } else {
+ column = 2;
+ }
+ mSelections[row][column] = !mSelections[row][column];
+ }
+ }
+ }
+
+ private class LanguageAdapter extends RecyclerView.Adapter {
+
+ @Override
+ public LanguageHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+ return new LanguageHolder(getLayoutInflater().inflate(R.layout.item_excluded_languages, parent, false));
+ }
+
+ @Override
+ public void onBindViewHolder(LanguageHolder holder, int position) {
+ holder.language.setText(LANGUAGE_STR_IDS[position]);
+ if (position == 0) {
+ holder.original.setVisibility(View.INVISIBLE);
+ } else {
+ holder.original.setVisibility(View.VISIBLE);
+ }
+ boolean[] selections = mSelections[position];
+ holder.original.setChecked(selections[0]);
+ holder.translated.setChecked(selections[1]);
+ holder.rewrite.setChecked(selections[2]);
+ }
+
+ @Override
+ public int getItemCount() {
+ return ROW_COUNT;
+ }
+ }
+}
diff --git a/app/src/main/java/com/hippo/ehviewer/ui/fragment/EhFragment.java b/app/src/main/java/com/hippo/ehviewer/ui/fragment/EhFragment.java
index a37c72a20..821f52253 100644
--- a/app/src/main/java/com/hippo/ehviewer/ui/fragment/EhFragment.java
+++ b/app/src/main/java/com/hippo/ehviewer/ui/fragment/EhFragment.java
@@ -16,6 +16,7 @@
package com.hippo.ehviewer.ui.fragment;
+import android.content.Intent;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.PreferenceFragment;
@@ -23,9 +24,12 @@ import android.preference.PreferenceFragment;
import com.hippo.ehviewer.Constants;
import com.hippo.ehviewer.R;
import com.hippo.ehviewer.Settings;
+import com.hippo.ehviewer.ui.ExcludedLanguagesActivity;
import com.hippo.yorozuya.Messenger;
-public class EhFragment extends PreferenceFragment implements Preference.OnPreferenceChangeListener {
+public class EhFragment extends PreferenceFragment
+ implements Preference.OnPreferenceChangeListener,
+ Preference.OnPreferenceClickListener {
@Override
public void onCreate(Bundle savedInstanceState) {
@@ -33,8 +37,11 @@ public class EhFragment extends PreferenceFragment implements Preference.OnPrefe
addPreferencesFromResource(R.xml.eh_settings);
Preference listMode = findPreference(Settings.KEY_LIST_MODE);
+ Preference excludedLanguages = findPreference(Settings.KEY_EXCLUDED_LANGUAGES);
listMode.setOnPreferenceChangeListener(this);
+
+ excludedLanguages.setOnPreferenceClickListener(this);
}
@Override
@@ -46,4 +53,15 @@ public class EhFragment extends PreferenceFragment implements Preference.OnPrefe
}
return true;
}
+
+ @Override
+ public boolean onPreferenceClick(Preference preference) {
+ String key = preference.getKey();
+ if (Settings.KEY_EXCLUDED_LANGUAGES.equals(key)) {
+ Intent intent = new Intent(getActivity(), ExcludedLanguagesActivity.class);
+ startActivity(intent);
+ return true;
+ }
+ return false;
+ }
}
diff --git a/app/src/main/res/layout/item_excluded_languages.xml b/app/src/main/res/layout/item_excluded_languages.xml
new file mode 100644
index 000000000..b17c492eb
--- /dev/null
+++ b/app/src/main/res/layout/item_excluded_languages.xml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/scene_excluded_languages.xml b/app/src/main/res/layout/scene_excluded_languages.xml
new file mode 100644
index 000000000..9fbb3cc5b
--- /dev/null
+++ b/app/src/main/res/layout/scene_excluded_languages.xml
@@ -0,0 +1,162 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index f010f3c6a..d8c52aedc 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -284,6 +284,8 @@
列表模式
详情
缩略图
+ 排除语言
+ 在主页与搜索中隐藏指定语言的画廊
显示日文标题
尝试显示日文标题。这会使获取画廊列表花费更多时间
显示默认标题。一般是英文标题
@@ -346,6 +348,34 @@
检查更新
更新测试版
+
+ 排除语言
+ 全选
+ 全取消
+ 反选
+ 语言
+ 原作
+ 翻译
+ 改写
+ 日语
+ 英语
+ 汉语
+ 荷兰语
+ 法语
+ 德语
+ 匈牙利语
+ 意大利语
+ 韩语
+ 波兰语
+ 葡萄牙语
+ 俄语
+ 西班牙语
+ 泰语
+ 越南语
+ N/A
+ 其他
+
+
开源许可
diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml
index 5cf429e58..8e264fb6e 100644
--- a/app/src/main/res/values-zh-rHK/strings.xml
+++ b/app/src/main/res/values-zh-rHK/strings.xml
@@ -284,6 +284,8 @@
列表模式
詳情
縮略圖
+ 排除語言
+ 在主頁與搜索中隱藏指定語言的畫廊
顯示日文標題
嘗試顯示日文標題。這會使獲取畫廊列表花費更多時間
顯示默認標題。一般是英文標題
@@ -346,6 +348,34 @@
檢查更新
更新測試版
+
+ 排除語言
+ 全選
+ 全取消
+ 反選
+ 語言
+ 原作
+ 翻譯
+ 改寫
+ 日語
+ 英語
+ 漢語
+ 荷蘭語
+ 法語
+ 德語
+ 匈牙利語
+ 意大利語
+ 韓語
+ 波蘭語
+ 葡萄牙語
+ 俄語
+ 西班牙語
+ 泰語
+ 越南語
+ N/A
+ 其他
+
+
開源許可
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index 7238fc2e7..61346c911 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -284,6 +284,8 @@
列表模式
詳情
縮圖
+ 排除語言
+ 在主頁與搜尋中隱藏指定語言的畫廊
顯示日文標題
嘗試顯示日文標題。這會使獲取畫廊列表花費更多時間
顯示預設標題。一般是英文標題
@@ -346,6 +348,34 @@
檢查更新
更新測試版
+
+ 排除語言
+ 全選
+ 全取消
+ 反選
+ 語言
+ 原作
+ 翻譯
+ 改寫
+ 日語
+ 英語
+ 漢語
+ 荷蘭語
+ 法語
+ 德語
+ 匈牙利語
+ 義大利語
+ 韓語
+ 波蘭語
+ 葡萄牙語
+ 俄語
+ 西班牙語
+ 泰語
+ 越南語
+ N/A
+ 其他
+
+
開源許可
diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml
index 1db70cd6e..42861195a 100644
--- a/app/src/main/res/values/arrays.xml
+++ b/app/src/main/res/values/arrays.xml
@@ -34,21 +34,21 @@
- @string/star_5
-
+
- 1
- 3
- 5
- 7
-
+
- 1
- 3
- 5
- 7
-
+
- 3
- 5
- 7
@@ -57,7 +57,7 @@
- 17
-
+
- 3
- 5
- 7
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index e26bc2d92..b5af3b1b5 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -323,6 +323,8 @@
List mode
Detail
Thumb
+ Excluded languages
+ Hide galleries in certain languages from the gallery list and searches
Show Japanese title
Try to show Japanese title. It takes more time to get gallery list
Show default title. It is usually English title
@@ -386,6 +388,34 @@
Check for updates
Beta update channel
+
+ Excluded languages
+ All
+ None
+ Invert
+ Language
+ Original
+ Translated
+ Rewrite
+ Japanese
+ English
+ Chinese
+ Dutch
+ French
+ German
+ Hungarian
+ Italian
+ Korean
+ Polish
+ Portuguese
+ Russian
+ Spanish
+ Thai
+ Vietnamese
+ N/A
+ Other
+
+
License
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 2c54abc35..644a5974f 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -102,6 +102,10 @@
- ?attr/colorPrimary
+
+