package cri.sanity.util; import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnCancelListener; import android.text.InputType; import android.view.LayoutInflater; import android.view.View; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.EditText; import android.widget.SeekBar; import android.widget.TimePicker; import android.widget.CompoundButton.OnCheckedChangeListener; import cri.sanity.*; public final class Alert { public static final int NONE = -1; public static final int SIMPLE = 0; public static final int OKCANC = 1; public static final int YESNO = 2; public static final int YESNOCANC = 3; public static final int OPENDEL = 4; public static final int BAKRES = 5; public static final int COPYSHARE = 6; public static final int REPLY = 7; private static final int DEF = OKCANC; private static final String TITLE = A.name(); public static Activity activity; private static String prevOldPwd, prevNewPwd1, prevNewPwd2; //---- inner classes public static class Click implements DialogInterface.OnClickListener { protected DialogInterface dlg; protected int which; @Override public final void onClick(DialogInterface dlg, int which) { this.dlg = dlg; this.which = which; on(); } protected final void dismiss(){ dlg.dismiss(); } // just override this method (default action is to close dialog) public void on() { dlg.cancel(); } } public static abstract class Edited { protected DialogInterface dlg; protected final void dismiss(){ dlg.dismiss(); } private void on(String text, DialogInterface dlg) { this.dlg = dlg; on(text); } public abstract void on(String text); } public static abstract class Timed { protected DialogInterface dlg; protected int hour, mins; public Timed() { hour = mins = 0; } public Timed(int hour, int mins) { this.hour = hour; this.mins = mins; } protected final void dismiss() { dlg.dismiss(); } public abstract void on(); } //---- show message (with buttons) public static final View layout(int resId) { return LayoutInflater.from(A.app()).inflate(resId, null); } public static final AlertDialog msg(String msg) { return msg(TITLE, msg, null, null, null, SIMPLE, true); } public static final AlertDialog msg(String msg, int type) { return msg(TITLE, msg, null, null, null, type, true); } public static final AlertDialog msg(String msg, Click pos, Click neg) { return msg(TITLE, msg, pos, neg, null, DEF, true); } public static final AlertDialog msg(String msg, Click pos, Click neg, int type) { return msg(TITLE, msg, pos, neg, null, type, true); } public static final AlertDialog msg(String msg, Click pos, Click neg, int type, boolean cancelable) { return msg(TITLE, msg, pos, neg, null, type, cancelable); } public static final AlertDialog msg(String msg, Click pos, Click neg, Click neu, int type) { return msg(TITLE, msg, pos, neg, neu, type, true); } public static final AlertDialog msg(String msg, Click pos, Click neg, Click neu, int type, boolean cancelable) { return msg(TITLE, msg, pos, neg, neu, type, cancelable); } public static final AlertDialog msg(String title, String msg, Click pos, Click neg, Click neu, int type, boolean cancelable) { return msg(title, msg, pos, neg, neu, type, cancelable, activity); } public static final AlertDialog msg(String title, String msg, Click pos, Click neg, Click neu, int type, boolean cancelable, Context ctx) { int idPos=0, idNeg=0, idNeu=0; switch(type) { case SIMPLE : idPos = R.string.close ; break; case OKCANC : idPos = R.string.ok ; idNeg = R.string.canc ; break; case YESNO : idPos = R.string.yes ; idNeg = R.string.no ; break; case YESNOCANC: idPos = R.string.yes ; idNeu = R.string.no ; idNeg = R.string.canc; break; case OPENDEL : idPos = R.string.open ; idNeg = R.string.del ; break; case BAKRES : idPos = R.string.backup; idNeg = R.string.restore; break; case COPYSHARE: idPos = R.string.copy ; idNeg = R.string.share ; break; case REPLY : idPos = R.string.reply ; idNeg = R.string.close ; break; } final AlertDialog.Builder adb = new AlertDialog.Builder(ctx); adb.setIcon(R.drawable.ic_bar); adb.setTitle(title); adb.setMessage(msg); adb.setCancelable(cancelable); if(idPos > 0) adb.setPositiveButton(idPos, pos==null? new Click() : pos); if(idNeg > 0) adb.setNegativeButton(idNeg, neg==null? new Click() : neg); if(idNeu > 0) adb.setNeutralButton (idNeu, neu==null? new Click() : neu); return adb.show(); } public static final AlertDialog msg(String title, String msg, Click pos, Click neg, Click neu, int type) { return msg(title, msg, pos, neg, neu, type, true); } public static final AlertDialog msg(String title, String msg, Click pos, Click neg, int type, boolean cancelable) { return msg(title, msg, pos, neg, null, type, cancelable); } public static final AlertDialog msg(String title, String msg, Click pos, Click neg, int type) { return msg(title, msg, pos, neg, null, type, true); } public static final AlertDialog msg(String title, String msg, Click pos, Click neg) { return msg(title, msg, pos, neg, null, DEF, true); } public static final AlertDialog msg(String title, String msg, int type) { return msg(title, msg, null, null, null, type, true); } public static final AlertDialog msg(String title, String msg) { return msg(title, msg, null, null, null, SIMPLE, true); } //---- show edit view public static final EditText edit(String title, final Edited pos, Context ctx) { return edit(title, pos, null, ctx); } public static final EditText edit(String title, String text, final Edited pos, Context ctx) { return edit(title, text, pos, null, ctx); } public static final EditText edit(String title, String text, final Edited pos, final Edited neg, Context ctx) { EditText edit = edit(title, pos, neg, ctx); if(text != null) { edit.setText(text); edit.selectAll(); } return edit; } public static final EditText edit(String title, final Edited pos, final Edited neg, Context ctx) { final View layout = layout(R.layout.alert_text); final EditText edit = (EditText)layout.findViewById(R.id.alert_text_edit); final AlertDialog.Builder adb = new AlertDialog.Builder(ctx); final Click negClick = neg==null? new Click() : new Click(){ public void on(){ neg.on(edit.getText().toString(),dlg); }}; adb.setIcon(R.drawable.ic_bar); adb.setTitle(title); adb.setView(layout); adb.setCancelable(true); adb.setPositiveButton(R.string.ok , pos==null? new Click() : new Click(){ public void on(){ pos.on(edit.getText().toString(),dlg); }}); adb.setNegativeButton(R.string.canc, negClick); if(neg != null) adb.setOnCancelListener(new OnCancelListener() { @Override public void onCancel(DialogInterface dlg) { negClick.dlg = dlg; negClick.on(); } }); adb.show(); return edit; } public static final EditText edit(String title, String text, final Edited pos, final Edited neg) { return edit(title, text, pos, neg, activity); } public static final EditText edit(String title, final Edited pos, final Edited neg) { return edit(title, pos, neg, activity); } public static final EditText edit(String title, String text, final Edited pos) { return edit(title, text, pos, null, activity); } public static final EditText edit(String title, final Edited pos) { return edit(title, pos, null, activity); } public static final AlertDialog choose(String title, String[] items, Click click) { return choose(title, items, click, activity); } public static final AlertDialog choose(String title, String[] items, Click click, Context ctx) { final AlertDialog.Builder adb = new AlertDialog.Builder(ctx); adb.setIcon(R.drawable.ic_bar); adb.setTitle(title); adb.setItems(items, click); adb.setCancelable(true); return adb.show(); } public static final AlertDialog choose(String title, int[] items, Click click, Context ctx) { final int n = items.length; String[] labels = new String[n]; for(int i=0; i<n; i++) labels[i] = A.s(items[i]); return choose(title, labels, click, ctx); } public static final AlertDialog choose(String title, int[] items, Click click) { return choose(title, items, click, activity); } //--- time pick public static final AlertDialog time(String title, final Timed timed, Context ctx) { final View layout = layout(R.layout.alert_time); final TimePicker tp = (TimePicker)layout.findViewById(R.id.alert_time_picker); final SeekBar sb = (SeekBar)layout.findViewById(R.id.alert_time_bar); final int hour = timed.hour; final int mins = timed.mins; sb.setMax(24*4 - 1); sb.setProgress(hour*4 + mins/15); sb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar sb) { } @Override public void onStartTrackingTouch(SeekBar sb) { } @Override public void onProgressChanged(SeekBar sb, int progr, boolean user) { if(!user) return; tp.setCurrentHour (progr / 4); tp.setCurrentMinute((progr % 4) * 15); } }); tp.setCurrentHour (hour); tp.setCurrentMinute(mins); tp.setIs24HourView(true); tp.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() { @Override public void onTimeChanged(TimePicker view, int hour, int mins) { sb.setProgress(hour*4 + mins/15); } }); final AlertDialog.Builder adb = new AlertDialog.Builder(ctx); if(!A.empty(title)) adb.setTitle(title); adb.setIcon(R.drawable.ic_bar); adb.setView(layout); adb.setCancelable(true); adb.setPositiveButton(R.string.ok, new Click(){ public void on(){ timed.hour = tp.getCurrentHour(); timed.mins = tp.getCurrentMinute(); timed.on(); }}); adb.setNegativeButton(R.string.canc, new Click()); timed.dlg = adb.create(); return adb.show(); } public static final AlertDialog time(String title, Timed timed) { return time(title, timed, activity); } public static final AlertDialog time(Timed timed) { return time(null, timed, activity); } public static final AlertDialog time(Timed timed, Context ctx) { return time(null, timed, ctx); } //---- password public static final void resetPwd() { prevOldPwd = prevNewPwd1 = prevNewPwd2 = null; } public static final AlertDialog pwdChoose(final String oldPwd, final Edited pos, final Click neg) { return pwdChoose(TITLE, oldPwd, pos, neg, activity); } public static final AlertDialog pwdChoose(final String oldPwd, final Edited pos) { return pwdChoose(TITLE, oldPwd, pos, null, activity); } public static final AlertDialog pwdChoose(String title, final String oldPwd, final Edited pos) { return pwdChoose(title, oldPwd, pos, null, activity); } public static final AlertDialog pwdChoose(String title, final String oldPwd, final Edited pos, final Click neg) { return pwdChoose(title, oldPwd, pos, neg, activity); } public static final AlertDialog pwdChoose(String title, final String oldPwd, final Edited pos, final Click neg, Context ctx) { final View layout = layout(R.layout.alert_pwd_choose); final EditText editOld = (EditText)layout.findViewById(R.id.alert_pwd_edit_old); final EditText editNew1 = (EditText)layout.findViewById(R.id.alert_pwd_edit_new1); final EditText editNew2 = (EditText)layout.findViewById(R.id.alert_pwd_edit_new2); final CheckBox checkBox = (CheckBox)layout.findViewById(R.id.alert_pwd_check); final boolean hasOld = !A.empty(oldPwd); editOld.setEnabled(hasOld); if(prevOldPwd != null) editOld .setText(prevOldPwd ); if(prevNewPwd1 != null) editNew1.setText(prevNewPwd1); if(prevNewPwd2 != null) editNew2.setText(prevNewPwd2); if(hidePwd()) checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton view, boolean checked) { final int type = InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD; editOld .setInputType(type); editNew1.setInputType(type); editNew2.setInputType(type); checkBox.setEnabled(false); } }); else { final int type = InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD; editOld .setInputType(type); editNew1.setInputType(type); editNew2.setInputType(type); checkBox.setEnabled(false); checkBox.setChecked(true); } final AlertDialog.Builder adb = new AlertDialog.Builder(ctx); adb.setIcon(R.drawable.ic_bar); adb.setTitle(title); adb.setView(layout); adb.setCancelable(true); adb.setPositiveButton(R.string.ok , pos==null? new Click() : new Click(){ public void on(){ prevOldPwd = editOld .getText().toString(); prevNewPwd1 = editNew1.getText().toString(); prevNewPwd2 = editNew2.getText().toString(); if(hasOld && !prevOldPwd.equals(oldPwd)) { msg(A.s(R.string.err_pwd_old)); return; } if(!prevNewPwd1.equals(prevNewPwd2)) { msg(A.s(R.string.err_pwd_new)); return; } final String pwd = prevNewPwd1; prevOldPwd = prevNewPwd1 = prevNewPwd2 = null; pos.on(pwd, dlg); }}); adb.setNegativeButton(R.string.canc, neg==null? new Click() : neg); return adb.show(); } public static final AlertDialog pwdChoose(final String oldPwd, final Edited pos, final Click neg, Context ctx) { return pwdChoose(TITLE, oldPwd, pos, neg, ctx); } public static final AlertDialog pwdChoose(final String oldPwd, final Edited pos, Context ctx) { return pwdChoose(TITLE, oldPwd, pos, null, ctx); } public static final AlertDialog pwdAsk(final Edited pos, final Click neg) { return pwdAsk(TITLE, pos, neg, activity); } public static final AlertDialog pwdAsk(String title, final Edited pos, final Click neg) { return pwdAsk(title, pos, neg, activity); } public static final AlertDialog pwdAsk(String title, final Edited pos, final Click neg, Context ctx) { final View layout = layout(R.layout.alert_pwd_ask); final EditText edit = (EditText)layout.findViewById(R.id.alert_pwd_edit); final CheckBox checkBox = (CheckBox)layout.findViewById(R.id.alert_pwd_check); if(prevOldPwd != null) edit.setText(prevOldPwd); if(hidePwd()) checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton view, boolean checked) { edit.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD); checkBox.setEnabled(false); } }); else { edit.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD); checkBox.setEnabled(false); checkBox.setChecked(true); } final AlertDialog.Builder adb = new AlertDialog.Builder(ctx); adb.setIcon(R.drawable.ic_bar); adb.setTitle(title); adb.setView(layout); adb.setCancelable(false); adb.setPositiveButton(R.string.ok, pos==null? new Click() : new Click(){ public void on(){ pos.on(prevOldPwd = edit.getText().toString(), dlg); }}); adb.setNegativeButton(R.string.canc, neg==null? new Click() : neg); return adb.show(); } public static final AlertDialog pwdAsk(final Edited pos, final Click neg, Context ctx) { return pwdAsk(TITLE, pos, neg, ctx); } private static boolean hidePwd() { return !A.is(K.PWD_CLEAR); } }