package org.gscript.input; import java.util.ArrayList; import org.gscript.R; import org.gscript.input.InputReceiver; import org.gscript.input.InputRequest; import com.actionbarsherlock.app.SherlockActivity; import android.content.Context; import android.content.Intent; import android.content.res.Resources; import android.os.Bundle; import android.util.TypedValue; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup.LayoutParams; import android.widget.Button; import android.widget.CheckBox; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.TextView; public class InputDialog extends SherlockActivity { static final String TYPE_RADIO = "radio"; static final String STYLE_YESNO = "yesno"; int mRequestId; String mRequestType; LinearLayout linearLayoutControls; TextView mTextViewMessage; Button mButtonCancel; Button mButtonOk; View mButtonDivider; InputControlView mControlView; boolean mResponseSend; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(R.layout.activity_input_dialog); Intent intent = this.getIntent(); mRequestId = intent.getIntExtra(InputRequest.EXTRA_REQUEST_ID, -1); mRequestType = intent.getStringExtra(InputRequest.EXTRA_REQUEST_TYPE); linearLayoutControls = (LinearLayout) findViewById(R.id.linearLayoutControls); mTextViewMessage = (TextView) findViewById(R.id.textViewMessage); mButtonCancel = (Button) findViewById(R.id.buttonCancel); mButtonOk = (Button) findViewById(R.id.buttonOk); mButtonDivider = (View) findViewById(R.id.buttonDivider); this.setTitle(intent.getStringExtra(InputRequest.EXTRA_TITLE)); mTextViewMessage.setText(intent .getStringExtra(InputRequest.EXTRA_MESSAGE)); mButtonOk.setText(R.string.ok); mButtonOk.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String responseOpt = ""; if (mControlView != null) responseOpt = mControlView.getValue(); Intent intent = new Intent(InputReceiver.ACTION_RESPONSE); intent.putExtra(InputReceiver.EXTRA_REQUEST_ID, mRequestId) .putExtra(InputReceiver.EXTRA_RESPONSE_CODE, 1) .putExtra(InputReceiver.EXTRA_RESPONSE_OPT, responseOpt); sendBroadcast(intent); mResponseSend = true; finish(); } }); mButtonCancel.setText(R.string.cancel); mButtonCancel.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { sendCancelBroadcast(); finish(); } }); if (InputRequest.TYPE_DIALOG_MESSAGE.equalsIgnoreCase(mRequestType)) { showCancel(true); String style = intent.getStringExtra(InputRequest.EXTRA_STYLE); if (STYLE_YESNO.equalsIgnoreCase(style)) { mButtonOk.setText(R.string.yes); mButtonCancel.setText(R.string.no); } } if (InputRequest.TYPE_TEXT_ENTRY.equalsIgnoreCase(mRequestType)) { showCancel(true); mControlView = new TextControlView(this); } if (InputRequest.TYPE_LIST.equalsIgnoreCase(mRequestType)) { showCancel(true); String style = intent.getStringExtra(InputRequest.EXTRA_STYLE); String list = intent.getStringExtra(InputRequest.EXTRA_LIST); ArrayList<ListItem> listItems = getListItems(list); if (TYPE_RADIO.equalsIgnoreCase(style)) { mControlView = new RadioControlView(this, listItems); } else { mControlView = new CheckboxControlView(this, listItems); } } if (mControlView != null) { linearLayoutControls.addView(mControlView, LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); } } void showCancel(boolean show) { mButtonCancel.setVisibility((show) ? View.VISIBLE : View.GONE); mButtonDivider.setVisibility((show) ? View.VISIBLE : View.GONE); } void sendCancelBroadcast() { Intent intent = new Intent(InputReceiver.ACTION_RESPONSE); intent.putExtra(InputReceiver.EXTRA_REQUEST_ID, mRequestId).putExtra( InputReceiver.EXTRA_RESPONSE_CODE, 0); sendBroadcast(intent); mResponseSend = true; } abstract class InputControlView extends LinearLayout { public InputControlView(Context context) { super(context); Resources r = getResources(); int px = (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, 10, r.getDisplayMetrics()); this.setPadding(0, px, 0, 0); this.setOrientation(VERTICAL); } public abstract String getValue(); } class TextControlView extends InputControlView { EditText mEditText; public TextControlView(Context context) { super(context); mEditText = new EditText(context); this.addView(mEditText, LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); } @Override public String getValue() { return mEditText.getText().toString(); } } class CheckboxControlView extends InputControlView { ArrayList<CheckBox> mCheckBoxes = new ArrayList<CheckBox>(); public CheckboxControlView(Context context, ArrayList<ListItem> items) { super(context); for (ListItem item : items) { CheckBox cb = new CheckBox(context); cb.setText(item.value); cb.setChecked(item.checked); cb.setTag(item.key); this.addView(cb, LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); mCheckBoxes.add(cb); } } @Override public String getValue() { String checkedArray = ""; int count = mCheckBoxes.size(); for (int i = 0; i < count; ++i) { CheckBox cb = mCheckBoxes.get(i); if (cb.isChecked()) { checkedArray += cb.getTag().toString() + " "; } } checkedArray = checkedArray.trim(); return checkedArray; } } class RadioControlView extends InputControlView { RadioGroup mRadioGroup; public RadioControlView(Context context, ArrayList<ListItem> items) { super(context); mRadioGroup = new RadioGroup(context); int checkedIndex = -1; for (ListItem item : items) { RadioButton rb = new RadioButton(context); rb.setText(item.value); rb.setTag(item.key); mRadioGroup.addView(rb, LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); /* only allow one radiobutton to be pre-checked */ if (item.checked && checkedIndex == -1) checkedIndex = rb.getId(); } mRadioGroup.check(checkedIndex); this.addView(mRadioGroup, LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); } @Override public String getValue() { int checkedId = mRadioGroup.getCheckedRadioButtonId(); return (checkedId == -1 ? "" : mRadioGroup.findViewById(checkedId) .getTag().toString()); } } public ArrayList<ListItem> getListItems(String itemString) { ArrayList<ListItem> listItems = new ArrayList<ListItem>(); /* build hashmap with key/value pairs */ String[] listArr = itemString.split(";"); for (String kvPair : listArr) { kvPair = kvPair.trim(); if (kvPair.length() > 0) { ListItem item = new ListItem(); String[] kvArr = kvPair.split(":"); item.key = kvArr[0]; item.key = item.key.trim().replace(" ", "_"); /* check if pre-checked */ if (item.key.startsWith("*")) { item.key = item.key.substring(1, item.key.length()).trim(); item.checked = true; } item.value = (kvArr.length == 1) ? item.key : kvArr[1].trim(); listItems.add(item); } } return listItems; } class ListItem { String key; String value; boolean checked; } }