package yuku.alkitab.base.dialog;
import android.app.Dialog;
import android.content.Context;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import com.afollestad.materialdialogs.MaterialDialog;
import yuku.afw.V;
import yuku.alkitab.base.S;
import yuku.alkitab.base.U;
import yuku.alkitab.base.widget.MaterialDialogAdapterHelper;
import yuku.alkitab.debug.R;
import yuku.alkitab.model.Label;
import yuku.alkitab.model.Marker;
import yuku.devoxx.flowlayout.FlowLayout;
import java.util.Date;
import java.util.List;
import java.util.SortedSet;
import java.util.TreeSet;
public class TypeBookmarkDialog {
public interface Listener {
/** Called when this dialog is closed with the bookmark modified or deleted */
void onModifiedOrDeleted();
}
final Context context;
final Dialog dialog;
FlowLayout panelLabels;
EditText tCaption;
Marker marker;
int ariForNewBookmark;
int verseCountForNewBookmark;
String defaultCaption;
// optional
Listener listener;
// current labels (can be not in the db)
SortedSet<Label> labels = new TreeSet<>();
/**
* Open the bookmark edit dialog, editing existing bookmark.
* @param context Activity context to create dialogs
*/
public static TypeBookmarkDialog EditExisting(Context context, long _id) {
return new TypeBookmarkDialog(context, S.getDb().getMarkerById(_id), null);
}
/**
* Open the bookmark edit dialog for a new bookmark by ari.
*/
public static TypeBookmarkDialog NewBookmark(Context context, int ari, final int verseCount) {
final TypeBookmarkDialog res = new TypeBookmarkDialog(context, null, S.activeVersion.referenceWithVerseCount(ari, verseCount));
res.ariForNewBookmark = ari;
res.verseCountForNewBookmark = verseCount;
return res;
}
private TypeBookmarkDialog(final Context context, final Marker marker, String reference) {
this.context = context;
this.marker = marker;
if (reference == null) {
reference = S.activeVersion.referenceWithVerseCount(marker.ari, marker.verseCount);
}
defaultCaption = reference;
View dialogView = LayoutInflater.from(context).inflate(R.layout.dialog_edit_bookmark, null);
this.panelLabels = V.get(dialogView, R.id.panelLabels);
tCaption = V.get(dialogView, R.id.tCaption);
final Button bAddLabel = V.get(dialogView, R.id.bAddLabel);
bAddLabel.setOnClickListener(v -> MaterialDialogAdapterHelper.show(new MaterialDialog.Builder(context).title(R.string.add_label_title), new LabelAdapter()));
if (marker != null) {
labels = new TreeSet<>();
final List<Label> ll = S.getDb().listLabelsByMarker(marker);
labels.addAll(ll);
}
setLabelsText();
tCaption.setText(marker != null? marker.caption: reference);
this.dialog = new MaterialDialog.Builder(context)
.customView(dialogView, false)
.title(reference)
.iconRes(R.drawable.ic_attr_bookmark)
.positiveText(R.string.ok)
.onPositive((dialog, which) -> bOk_click())
.neutralText(R.string.delete)
.onNeutral((dialog, which) -> bDelete_click(marker))
.show();
}
void bOk_click() {
String caption = tCaption.getText().toString();
// If there is no caption, show reference
if (caption.length() == 0 || caption.trim().length() == 0) {
caption = defaultCaption;
}
final Date now = new Date();
if (marker != null) { // update existing
marker.caption = caption;
marker.modifyTime = now;
S.getDb().insertOrUpdateMarker(marker);
} else { // add new
marker = S.getDb().insertMarker(ariForNewBookmark, Marker.Kind.bookmark, caption, verseCountForNewBookmark, now, now);
}
S.getDb().updateLabels(marker, labels);
if (listener != null) listener.onModifiedOrDeleted();
}
public void show() {
dialog.show();
}
public void setListener(Listener listener) {
this.listener = listener;
}
private View.OnClickListener label_click = new View.OnClickListener() {
@Override public void onClick(View v) {
final Label label = (Label) v.getTag(R.id.TAG_label);
if (label == null) return;
new MaterialDialog.Builder(context)
.content(context.getString(R.string.do_you_want_to_remove_the_label_label_from_this_bookmark, label.title))
.positiveText(R.string.ok)
.onPositive((dialog, which) -> {
labels.remove(label);
setLabelsText();
})
.negativeText(R.string.cancel)
.show();
}
};
protected void bDelete_click(final Marker marker) {
if (marker == null) {
return; // bookmark not saved, so no need to confirm
}
new MaterialDialog.Builder(context)
.content(R.string.bookmark_delete_confirmation)
.positiveText(R.string.delete)
.onPositive((dialog, which) -> {
S.getDb().deleteMarkerById(marker._id);
if (listener != null) listener.onModifiedOrDeleted();
})
.negativeText(R.string.cancel)
.show();
}
void setLabelsText() {
// remove all first
final int childCount = panelLabels.getChildCount();
if (childCount > 1) {
panelLabels.removeViews(1, childCount - 2);
}
int pos = 1;
for (Label label: labels) {
panelLabels.addView(getLabelView(label, panelLabels), pos++);
}
}
private View getLabelView(Label label, final ViewGroup parent) {
TextView res = (TextView) LayoutInflater.from(context).inflate(R.layout.label_x, parent, false);
res.setLayoutParams(this.panelLabels.generateDefaultLayoutParams());
res.setText(label.title);
res.setTag(R.id.TAG_label, label);
res.setOnClickListener(label_click);
final Drawable drawableRight = res.getCompoundDrawables()[2];
final int labelColor = U.applyLabelColor(label, res);
if (drawableRight != null && labelColor != 0) {
drawableRight.mutate();
drawableRight.setColorFilter(labelColor, PorterDuff.Mode.MULTIPLY);
}
return res;
}
static class LabelHolder extends RecyclerView.ViewHolder {
final TextView text1;
public LabelHolder(final View itemView) {
super(itemView);
text1 = V.get(itemView, android.R.id.text1);
}
}
class LabelAdapter extends MaterialDialogAdapterHelper.Adapter {
private List<Label> availableLabels = S.getDb().listAllLabels();
@Override
public int getItemCount() {
return 1 + availableLabels.size();
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(final ViewGroup parent, final int viewType) {
return new LabelHolder(LayoutInflater.from(parent.getContext()).inflate(viewType == 0 ? R.layout.item_label_chooser : android.R.layout.simple_list_item_1, parent, false));
}
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder _holder_, final int position) {
final int type = getItemViewType(position);
final LabelHolder holder = (LabelHolder) _holder_;
{
if (type == 0) {
final Label label = availableLabels.get(position - 1);
holder.text1.setText(label.title);
U.applyLabelColor(label, holder.text1);
} else {
holder.text1.setText(context.getString(R.string.create_label_titik3));
}
}
holder.itemView.setOnClickListener(v -> {
dismissDialog();
final int which = holder.getAdapterPosition();
if (which == 0) { // new label
LabelEditorDialog.show(context, "", context.getString(R.string.create_label_title), title -> {
final Label newLabel = S.getDb().insertLabel(title, null);
if (newLabel != null) {
labels.add(newLabel);
setLabelsText();
}
});
} else {
final Label label = availableLabels.get(which - 1);
labels.add(label);
setLabelsText();
}
});
}
@Override
public int getItemViewType(final int position) {
if (position == 0) return 1;
return 0;
}
}
}