package yuku.alkitab.base.ac;
import android.content.Intent;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.InsetDrawable;
import android.os.Bundle;
import android.os.Parcelable;
import android.support.v7.app.ActionBar;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.util.SparseBooleanArray;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.TextView;
import yuku.afw.App;
import yuku.afw.V;
import yuku.afw.storage.Preferences;
import yuku.alkitab.base.U;
import yuku.alkitab.base.ac.base.BaseActivity;
import yuku.alkitab.base.util.BookNameSorter;
import yuku.alkitab.debug.R;
import yuku.alkitab.model.Book;
public class SearchBookFilterActivity extends BaseActivity {
private static final String EXTRA_selectedBookIds = "selectedBookIds";
private static final String EXTRA_books = "books";
SparseBooleanArray selectedBookIds;
BookAdapter adapter;
static final int[][] bookCategoryMappings = {
{R.id.cOldTestament, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38},
{R.id.cOldPentateuch, 0, 1, 2, 3, 4},
{R.id.cOldHistory, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16},
{R.id.cOldWisdom, 17, 18, 19, 20, 21},
{R.id.cOldMajorProphets, 22, 23, 24, 25, 26},
{R.id.cOldMinorProphets, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38},
{R.id.cNewTestament, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65},
{R.id.cNewGospels, 39, 40, 41, 42},
{R.id.cNewActs, 43},
{R.id.cNewPaulineEpistles, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56},
{R.id.cNewGeneralEpistles, 57, 58, 59, 60, 61, 62, 63, 64},
{R.id.cNewApocalypse, 65},
};
public static Intent createIntent(final SparseBooleanArray selectedBookIds, final Book[] books) {
final Intent res = new Intent(App.context, SearchBookFilterActivity.class);
res.putExtra(EXTRA_selectedBookIds, sparseBooleanArrayToIntArray(selectedBookIds));
res.putExtra(EXTRA_books, books);
return res;
}
public static class Result {
SparseBooleanArray selectedBookIds;
}
public static Result obtainResult(Intent data) {
if (data == null) return null;
final Result res = new Result();
res.selectedBookIds = intArrayToSparseBooleanArray(data.getIntArrayExtra(EXTRA_selectedBookIds));
return res;
}
static int[] sparseBooleanArrayToIntArray(final SparseBooleanArray sba) {
int cnt = 0;
for (int i = 0, len = sba.size(); i < len; i++) {
if (sba.valueAt(i)) {
cnt++;
}
}
int[] ids = new int[cnt];
cnt = 0;
for (int i = 0, len = sba.size(); i < len; i++) {
if (sba.valueAt(i)) {
ids[cnt++] = sba.keyAt(i);
}
}
return ids;
}
static SparseBooleanArray intArrayToSparseBooleanArray(final int[] ids) {
final SparseBooleanArray sba = new SparseBooleanArray();
for (final int a : ids) {
sba.put(a, true);
}
return sba;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search_book_filter);
final Toolbar toolbar = V.get(this, R.id.toolbar);
setSupportActionBar(toolbar);
final ActionBar ab = getSupportActionBar();
assert ab != null;
ab.setDisplayHomeAsUpEnabled(true);
selectedBookIds = intArrayToSparseBooleanArray(getIntent().getIntArrayExtra(EXTRA_selectedBookIds));
final Parcelable[] booksParcelable = getIntent().getParcelableArrayExtra(EXTRA_books);
final Book[] books = new Book[booksParcelable.length];
//noinspection SuspiciousSystemArraycopy
System.arraycopy(booksParcelable, 0, books, 0, booksParcelable.length);
final RecyclerView gridBook = V.get(this, R.id.gridBook);
adapter = new BookAdapter(books);
final GridLayoutManager manager = new GridLayoutManager(getApplication(), 6);
manager.setSpanSizeLookup(adapter.spanSizeLookup);
gridBook.setLayoutManager(manager);
gridBook.setAdapter(adapter);
V.get(this, R.id.bOk).setOnClickListener(bOk_click);
V.get(this, R.id.bCancel).setOnClickListener(bCancel_click);
}
final View.OnClickListener bOk_click = v -> {
Intent data = new Intent();
data.putExtra(EXTRA_selectedBookIds, sparseBooleanArrayToIntArray(selectedBookIds));
setResult(RESULT_OK, data);
finish();
};
final View.OnClickListener bCancel_click = v -> finish();
static class VH extends RecyclerView.ViewHolder {
int viewType;
public VH(final View itemView, final int viewType) {
super(itemView);
this.viewType = viewType;
}
}
class BookAdapter extends RecyclerView.Adapter<VH> {
public static final int TYPE_CATEGORIES = 1;
public static final int TYPE_BOOK = 2;
final Book[] books_grid;
public GridLayoutManager.SpanSizeLookup spanSizeLookup = new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(final int position) {
if (position == 0) {
return 6;
}
return 1;
}
};
public BookAdapter(Book[] books) {
// sort or not based on pref
if (Preferences.getBoolean(R.string.pref_alphabeticBookSort_key, R.bool.pref_alphabeticBookSort_default)) {
books_grid = BookNameSorter.sortAlphabetically(books);
} else {
books_grid = books.clone();
}
}
@Override
public int getItemViewType(final int position) {
if (position == 0) return TYPE_CATEGORIES;
return TYPE_BOOK;
}
@Override
public VH onCreateViewHolder(final ViewGroup parent, final int viewType) {
if (viewType == TYPE_CATEGORIES) {
return new VH(getLayoutInflater().inflate(R.layout.search_book_filter_categories, parent, false), viewType);
} else {
final TextView res = new TextView(SearchBookFilterActivity.this);
res.setLayoutParams(new GridLayoutManager.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getResources().getDimensionPixelSize(R.dimen.goto_grid_cell_height)));
res.setGravity(Gravity.CENTER);
res.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16);
return new VH(res, viewType);
}
}
@Override
public void onBindViewHolder(final VH holder, final int position) {
if (holder.viewType == TYPE_CATEGORIES) {
for (int[] bookCategoryMapping : bookCategoryMappings) {
final CheckBox checkBox = V.get(holder.itemView, bookCategoryMapping[0]);
checkBox.setOnCheckedChangeListener(null);
{ // show current state
// all books related to this checkbox are on?
boolean all_on = true;
for (int i = 1; i < bookCategoryMapping.length; i++) {
if (!selectedBookIds.get(bookCategoryMapping[i])) {
all_on = false;
break;
}
}
checkBox.setChecked(all_on);
}
{ // then, put a change listener
checkBox.setOnCheckedChangeListener((buttonView, isChecked) -> {
// all on?
boolean all_on = true;
for (int i = 1; i < bookCategoryMapping.length; i++) {
if (!selectedBookIds.get(bookCategoryMapping[i])) {
all_on = false;
break;
}
}
for (int i = 1; i < bookCategoryMapping.length; i++) {
selectedBookIds.put(bookCategoryMapping[i], !all_on);
}
notifyDataSetChanged();
});
}
}
} else {
final TextView lName = (TextView) holder.itemView;
final Book book = getBookFromPosition(position);
lName.setText(BookNameSorter.getBookAbbr(book));
if (selectedBookIds.get(book.bookId)) {
lName.setTextColor(0xffffffff);
final ColorDrawable color = new ColorDrawable(U.getBackgroundColorByBookId(book.bookId));
final InsetDrawable bg = new InsetDrawable(color, getResources().getDimensionPixelOffset(R.dimen.goto_grid_cell_inset));
//noinspection deprecation
lName.setBackgroundDrawable(bg);
} else {
lName.setTextColor(U.getForegroundColorOnDarkBackgroundByBookId(book.bookId));
lName.setBackgroundColor(0x0);
}
lName.setOnClickListener(v -> {
final boolean oldstate = selectedBookIds.get(book.bookId);
final boolean newstate = !oldstate;
selectedBookIds.put(book.bookId, newstate);
notifyDataSetChanged();
});
}
}
@Override
public int getItemCount() {
return 1 + books_grid.length;
}
public Book getBookFromPosition(int position) {
return books_grid[position - 1];
}
}
}