package com.quran.labs.androidquran.ui.fragment;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.FragmentActivity;
import android.support.v7.app.AlertDialog;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import com.quran.labs.androidquran.QuranApplication;
import com.quran.labs.androidquran.R;
import com.quran.labs.androidquran.dao.Tag;
import com.quran.labs.androidquran.data.SuraAyah;
import com.quran.labs.androidquran.presenter.bookmark.TagBookmarkPresenter;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import javax.inject.Inject;
public class TagBookmarkDialog extends DialogFragment {
public static final String TAG = "TagBookmarkDialog";
private static final String EXTRA_BOOKMARK_IDS = "bookmark_ids";
private TagsAdapter mAdapter;
@Inject TagBookmarkPresenter mTagBookmarkPresenter;
public static TagBookmarkDialog newInstance(long bookmarkId) {
return newInstance(new long[] { bookmarkId });
}
public static TagBookmarkDialog newInstance(long[] bookmarkIds) {
final Bundle args = new Bundle();
args.putLongArray(EXTRA_BOOKMARK_IDS, bookmarkIds);
final TagBookmarkDialog dialog = new TagBookmarkDialog();
dialog.setArguments(args);
return dialog;
}
public TagBookmarkDialog() {
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
((QuranApplication) context.getApplicationContext()).getApplicationComponent().inject(this);
}
public void updateAyah(@NonNull SuraAyah suraAyah) {
mTagBookmarkPresenter.setAyahBookmarkMode(suraAyah.sura, suraAyah.ayah, suraAyah.getPage());
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final Bundle args = getArguments();
if (args != null) {
long[] bookmarkIds = args.getLongArray(EXTRA_BOOKMARK_IDS);
if (bookmarkIds != null) {
mTagBookmarkPresenter.setBookmarksMode(bookmarkIds);
}
}
}
private ListView createTagsListView() {
final FragmentActivity activity = getActivity();
mAdapter = new TagsAdapter(activity, mTagBookmarkPresenter);
final ListView listview = new ListView(activity);
listview.setAdapter(mAdapter);
listview.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
listview.setOnItemClickListener((parent, view, position, id) -> {
Tag tag = (Tag) mAdapter.getItem(position);
boolean isChecked = mTagBookmarkPresenter.toggleTag(tag.id);
Object viewTag = view.getTag();
if (viewTag instanceof ViewHolder) {
ViewHolder holder = (ViewHolder) viewTag;
holder.checkBox.setChecked(isChecked);
}
});
return listview;
}
public void showAddTagDialog() {
Context context = getActivity();
if (context instanceof OnBookmarkTagsUpdateListener) {
((OnBookmarkTagsUpdateListener) context).onAddTagSelected();
}
}
public void setData(List<Tag> tags, HashSet<Long> checkedTags) {
mAdapter.setData(tags, checkedTags);
mAdapter.notifyDataSetChanged();
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setView(createTagsListView());
builder.setPositiveButton(R.string.dialog_ok, (dialog, which) -> {
// no-op - set in onStart to avoid closing dialog now
});
builder.setNegativeButton(R.string.cancel, (dialog, which) -> dismiss());
return builder.create();
}
@Override
public void onStart() {
super.onStart();
mTagBookmarkPresenter.bind(this);
final Dialog dialog = getDialog();
if (dialog instanceof AlertDialog) {
final Button positive = ((AlertDialog) dialog)
.getButton(Dialog.BUTTON_POSITIVE);
positive.setOnClickListener(v -> {
mTagBookmarkPresenter.saveChanges();
dismiss();
});
}
}
@Override
public void onStop() {
mTagBookmarkPresenter.unbind(this);
super.onStop();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// If in dialog mode, don't do anything (or else it will cause exception)
if (getShowsDialog()) {
return super.onCreateView(inflater, container, savedInstanceState);
}
// If not in dialog mode, treat as normal fragment onCreateView
return createTagsListView();
}
public static class TagsAdapter extends BaseAdapter {
private LayoutInflater mInflater;
private TagBookmarkPresenter mTagBookmarkPresenter;
private String mNewTagString;
private List<Tag> mTags = new ArrayList<>();
private HashSet<Long> mCheckedTags = new HashSet<>();
TagsAdapter(Context context, TagBookmarkPresenter presenter) {
mInflater = LayoutInflater.from(context);
mTagBookmarkPresenter = presenter;
mNewTagString = context.getString(R.string.new_tag);
}
void setData(List<Tag> tags, HashSet<Long> checkedTags) {
mTags = tags;
mCheckedTags = checkedTags;
}
@Override
public int getCount() {
return mTags == null ? 0 : mTags.size();
}
@Override
public Object getItem(int position) {
return mTags.get(position);
}
@Override
public long getItemId(int position) {
return mTags.get(position).id;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.tag_row, parent, false);
holder = new ViewHolder();
holder.checkBox = (CheckBox) convertView.findViewById(R.id.tag_checkbox);
holder.tagName = (TextView) convertView.findViewById(R.id.tag_name);
holder.addImage = (ImageView) convertView.findViewById(R.id.tag_add_image);
convertView.setTag(holder);
}
final Tag tag = (Tag) getItem(position);
holder = (ViewHolder) convertView.getTag();
if (tag.id == -1) {
holder.addImage.setVisibility(View.VISIBLE);
holder.checkBox.setVisibility(View.GONE);
holder.tagName.setText(mNewTagString);
} else {
holder.addImage.setVisibility(View.GONE);
holder.checkBox.setVisibility(View.VISIBLE);
holder.checkBox.setChecked(mCheckedTags.contains(tag.id));
holder.tagName.setText(tag.name);
holder.checkBox.setOnClickListener(v -> mTagBookmarkPresenter.toggleTag(tag.id));
}
return convertView;
}
}
static class ViewHolder {
CheckBox checkBox;
TextView tagName;
ImageView addImage;
}
public interface OnBookmarkTagsUpdateListener {
void onAddTagSelected();
}
}