/** * This method is called by SDL using JNI. Shows the messagebox from UI thread and block calling * thread. buttonFlags, buttonIds and buttonTexts must have same length. * * @param buttonFlags array containing flags for every button. * @param buttonIds array containing id for every button. * @param buttonTexts array containing text for every button. * @param colors null for default or array of length 5 containing colors. * @return button id or -1. */ public int messageboxShowMessageBox( final int flags, final String title, final String message, final int[] buttonFlags, final int[] buttonIds, final String[] buttonTexts, final int[] colors) { messageboxSelection[0] = -1; // sanity checks if ((buttonFlags.length != buttonIds.length) && (buttonIds.length != buttonTexts.length)) { return -1; // implementation broken } // collect arguments for Dialog final Bundle args = new Bundle(); args.putInt("flags", flags); args.putString("title", title); args.putString("message", message); args.putIntArray("buttonFlags", buttonFlags); args.putIntArray("buttonIds", buttonIds); args.putStringArray("buttonTexts", buttonTexts); args.putIntArray("colors", colors); // trigger Dialog creation on UI thread runOnUiThread( new Runnable() { @Override public void run() { showDialog(dialogs++, args); } }); // block the calling thread synchronized (messageboxSelection) { try { messageboxSelection.wait(); } catch (InterruptedException ex) { ex.printStackTrace(); return -1; } } // return selected value return messageboxSelection[0]; }
@Override protected Dialog onCreateDialog(int ignore, Bundle args) { // TODO set values from "flags" to messagebox dialog // get colors int[] colors = args.getIntArray("colors"); int backgroundColor; int textColor; int buttonBorderColor; int buttonBackgroundColor; int buttonSelectedColor; if (colors != null) { int i = -1; backgroundColor = colors[++i]; textColor = colors[++i]; buttonBorderColor = colors[++i]; buttonBackgroundColor = colors[++i]; buttonSelectedColor = colors[++i]; } else { backgroundColor = Color.TRANSPARENT; textColor = Color.TRANSPARENT; buttonBorderColor = Color.TRANSPARENT; buttonBackgroundColor = Color.TRANSPARENT; buttonSelectedColor = Color.TRANSPARENT; } // create dialog with title and a listener to wake up calling thread final Dialog dialog = new Dialog(this); dialog.setTitle(args.getString("title")); dialog.setCancelable(false); dialog.setOnDismissListener( new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface unused) { synchronized (messageboxSelection) { messageboxSelection.notify(); } } }); // create text TextView message = new TextView(this); message.setGravity(Gravity.CENTER); message.setText(args.getString("message")); if (textColor != Color.TRANSPARENT) { message.setTextColor(textColor); } // create buttons int[] buttonFlags = args.getIntArray("buttonFlags"); int[] buttonIds = args.getIntArray("buttonIds"); String[] buttonTexts = args.getStringArray("buttonTexts"); final SparseArray<Button> mapping = new SparseArray<Button>(); LinearLayout buttons = new LinearLayout(this); buttons.setOrientation(LinearLayout.HORIZONTAL); buttons.setGravity(Gravity.CENTER); for (int i = 0; i < buttonTexts.length; ++i) { Button button = new Button(this); final int id = buttonIds[i]; button.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { messageboxSelection[0] = id; dialog.dismiss(); } }); if (buttonFlags[i] != 0) { // see SDL_messagebox.h if ((buttonFlags[i] & 0x00000001) != 0) { mapping.put(KeyEvent.KEYCODE_ENTER, button); } if ((buttonFlags[i] & 0x00000002) != 0) { mapping.put(111, button); /* API 11: KeyEvent.KEYCODE_ESCAPE */ } } button.setText(buttonTexts[i]); if (textColor != Color.TRANSPARENT) { button.setTextColor(textColor); } if (buttonBorderColor != Color.TRANSPARENT) { // TODO set color for border of messagebox button } if (buttonBackgroundColor != Color.TRANSPARENT) { Drawable drawable = button.getBackground(); if (drawable == null) { // setting the color this way removes the style button.setBackgroundColor(buttonBackgroundColor); } else { // setting the color this way keeps the style (gradient, padding, etc.) drawable.setColorFilter(buttonBackgroundColor, PorterDuff.Mode.MULTIPLY); } } if (buttonSelectedColor != Color.TRANSPARENT) { // TODO set color for selected messagebox button } buttons.addView(button); } // create content LinearLayout content = new LinearLayout(this); content.setOrientation(LinearLayout.VERTICAL); content.addView(message); content.addView(buttons); if (backgroundColor != Color.TRANSPARENT) { content.setBackgroundColor(backgroundColor); } // add content to dialog and return dialog.setContentView(content); dialog.setOnKeyListener( new Dialog.OnKeyListener() { @Override public boolean onKey(DialogInterface d, int keyCode, KeyEvent event) { Button button = mapping.get(keyCode); if (button != null) { if (event.getAction() == KeyEvent.ACTION_UP) { button.performClick(); } return true; // also for ignored actions } return false; } }); return dialog; }