/*
* 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;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.hippo.easyrecyclerview.EasyRecyclerView;
import com.hippo.ehviewer.R;
import com.hippo.ehviewer.Settings;
import com.hippo.ehviewer.client.EhConfig;
import com.hippo.ripple.Ripple;
import com.hippo.widget.SensitiveCheckBox;
import com.hippo.yorozuya.ViewUtils;
public class ExcludedLanguagesActivity extends ToolbarActivity
implements View.OnClickListener {
private static final String KEY_SELECTIONS = "selections";
private static final int ROW_COUNT = 17;
private static final int[] LANGUAGE_STR_IDS = {
R.string.language_japanese,
R.string.language_english,
R.string.language_chinese,
R.string.language_dutch,
R.string.language_french,
R.string.language_german,
R.string.language_hungarian,
R.string.language_italian,
R.string.language_korean,
R.string.language_polish,
R.string.language_portuguese,
R.string.language_russian,
R.string.language_spanish,
R.string.language_thai,
R.string.language_vietnamese,
R.string.language_na,
R.string.language_other
};
private static final String[] LANGUAGES = {
EhConfig.JAPANESE_ORIGINAL,
EhConfig.JAPANESE_TRANSLATED,
EhConfig.JAPANESE_REWRITE,
EhConfig.ENGLISH_ORIGINAL,
EhConfig.ENGLISH_TRANSLATED,
EhConfig.ENGLISH_REWRITE,
EhConfig.CHINESE_ORIGINAL,
EhConfig.CHINESE_TRANSLATED,
EhConfig.CHINESE_REWRITE,
EhConfig.DUTCH_ORIGINAL,
EhConfig.DUTCH_TRANSLATED,
EhConfig.DUTCH_REWRITE,
EhConfig.FRENCH_ORIGINAL,
EhConfig.FRENCH_TRANSLATED,
EhConfig.FRENCH_REWRITE,
EhConfig.GERMAN_ORIGINAL,
EhConfig.GERMAN_TRANSLATED,
EhConfig.GERMAN_REWRITE,
EhConfig.HUNGARIAN_ORIGINAL,
EhConfig.HUNGARIAN_TRANSLATED,
EhConfig.HUNGARIAN_REWRITE,
EhConfig.ITALIAN_ORIGINAL,
EhConfig.ITALIAN_TRANSLATED,
EhConfig.ITALIAN_REWRITE,
EhConfig.KOREAN_ORIGINAL,
EhConfig.KOREAN_TRANSLATED,
EhConfig.KOREAN_REWRITE,
EhConfig.POLISH_ORIGINAL,
EhConfig.POLISH_TRANSLATED,
EhConfig.POLISH_REWRITE,
EhConfig.PORTUGUESE_ORIGINAL,
EhConfig.PORTUGUESE_TRANSLATED,
EhConfig.PORTUGUESE_REWRITE,
EhConfig.RUSSIAN_ORIGINAL,
EhConfig.RUSSIAN_TRANSLATED,
EhConfig.RUSSIAN_REWRITE,
EhConfig.SPANISH_ORIGINAL,
EhConfig.SPANISH_TRANSLATED,
EhConfig.SPANISH_REWRITE,
EhConfig.THAI_ORIGINAL,
EhConfig.THAI_TRANSLATED,
EhConfig.THAI_REWRITE,
EhConfig.VIETNAMESE_ORIGINAL,
EhConfig.VIETNAMESE_TRANSLATED,
EhConfig.VIETNAMESE_REWRITE,
EhConfig.NA_ORIGINAL,
EhConfig.NA_TRANSLATED,
EhConfig.NA_REWRITE,
EhConfig.OTHER_ORIGINAL,
EhConfig.OTHER_TRANSLATED,
EhConfig.OTHER_REWRITE};
private final boolean[][] mSelections = new boolean[ROW_COUNT][3];
/*---------------
Whole life cycle
---------------*/
@Nullable
private View mCancel;
@Nullable
private View mOk;
@Nullable
private View mSelectAll;
@Nullable
private View mDeselectAll;
@Nullable
private View mInvertSelection;
@Nullable
private EasyRecyclerView mRecyclerView;
@Nullable
private LanguageAdapter mAdapter;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.scene_excluded_languages);
setNavigationIcon(R.drawable.v_arrow_left_dark_x24);
if (null == savedInstanceState) {
onInit();
} else {
onRestore(savedInstanceState);
}
mCancel = ViewUtils.$$(this, R.id.cancel);
mOk = ViewUtils.$$(this, R.id.ok);
mSelectAll = ViewUtils.$$(this, R.id.select_all);
mDeselectAll = ViewUtils.$$(this, R.id.deselect_all);
mInvertSelection = ViewUtils.$$(this, R.id.invert_selection);
mRecyclerView = (EasyRecyclerView) ViewUtils.$$(this, R.id.recycler_view);
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setClipToPadding(false);
mAdapter = new LanguageAdapter();
mRecyclerView.setAdapter(mAdapter);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mCancel.setOnClickListener(this);
mOk.setOnClickListener(this);
mSelectAll.setOnClickListener(this);
mDeselectAll.setOnClickListener(this);
mInvertSelection.setOnClickListener(this);
Ripple.addRipple(mCancel, false);
Ripple.addRipple(mOk, false);
Ripple.addRipple(mSelectAll, false);
Ripple.addRipple(mDeselectAll, false);
Ripple.addRipple(mInvertSelection, false);
}
private boolean isDecimal(String str) {
int length = str.length();
// "" is not decimal
if (length <= 0) {
return false;
}
for (int i = 0; i < length; i++) {
char ch = str.charAt(i);
if (ch < '0' || ch > '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 / 3;
int column = j % 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 = 0;
boolean first = true;
for (boolean[] selections : mSelections) {
for (boolean b : selections) {
if (b) {
if (!first) {
sb.append("x");
} else {
first = false;
}
sb.append(LANGUAGES[i]);
}
i++;
}
}
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<LanguageHolder> {
@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]);
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;
}
}
}