/* * Protocoder * A prototyping platform for Android devices * * Victor Diaz Barrales victormdb@gmail.com * * Copyright (C) 2014 Victor Diaz * Copyright (C) 2013 Motorola Mobility LLC * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software * is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * */ package org.protocoderrunner.apprunner.api; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.animation.ValueAnimator; import android.annotation.TargetApi; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.pm.ActivityInfo; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Color; import android.graphics.Outline; import android.graphics.PointF; import android.graphics.Rect; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; import android.support.v4.app.FragmentTransaction; import android.support.v4.view.ViewCompat; import android.support.v7.graphics.Palette; import android.text.InputType; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.ScaleGestureDetector; import android.view.View; import android.view.View.OnTouchListener; import android.view.ViewAnimationUtils; import android.view.ViewGroup.LayoutParams; import android.view.ViewOutlineProvider; import android.view.animation.CycleInterpolator; import android.view.inputmethod.InputMethodManager; import android.widget.EditText; import android.widget.FrameLayout; import android.widget.Toast; import org.json.JSONException; import org.json.JSONObject; import org.mozilla.javascript.NativeArray; import org.protocoderrunner.AppSettings; import org.protocoderrunner.R; import org.protocoderrunner.apidoc.annotation.APIMethod; import org.protocoderrunner.apidoc.annotation.APIParam; import org.protocoderrunner.apprunner.AppRunnerActivity; import org.protocoderrunner.apprunner.AppRunnerSettings; import org.protocoderrunner.apprunner.ProtocoderScript; import org.protocoderrunner.apprunner.api.other.PCamera; import org.protocoderrunner.apprunner.api.other.PProcessing; import org.protocoderrunner.apprunner.api.other.PVideo; import org.protocoderrunner.apprunner.api.widgets.PAbsoluteLayout; import org.protocoderrunner.apprunner.api.widgets.PButton; import org.protocoderrunner.apprunner.api.widgets.PCanvasView; import org.protocoderrunner.apprunner.api.widgets.PCard; import org.protocoderrunner.apprunner.api.widgets.PCheckBox; import org.protocoderrunner.apprunner.api.widgets.PEditText; import org.protocoderrunner.apprunner.api.widgets.PGrid; import org.protocoderrunner.apprunner.api.widgets.PImageButton; import org.protocoderrunner.apprunner.api.widgets.PImageView; import org.protocoderrunner.apprunner.api.widgets.PList; import org.protocoderrunner.apprunner.api.widgets.PMap; import org.protocoderrunner.apprunner.api.widgets.PNumberPicker; import org.protocoderrunner.apprunner.api.widgets.PPadView; import org.protocoderrunner.apprunner.api.widgets.PPlotView; import org.protocoderrunner.apprunner.api.widgets.PPopupCustomFragment; import org.protocoderrunner.apprunner.api.widgets.PProgressBar; import org.protocoderrunner.apprunner.api.widgets.PRadioButton; import org.protocoderrunner.apprunner.api.widgets.PSlider; import org.protocoderrunner.apprunner.api.widgets.PSpinner; import org.protocoderrunner.apprunner.api.widgets.PSwitch; import org.protocoderrunner.apprunner.api.widgets.PTextView; import org.protocoderrunner.apprunner.api.widgets.PToggleButton; import org.protocoderrunner.apprunner.api.widgets.PUIGeneric; import org.protocoderrunner.apprunner.api.widgets.PWebView; import org.protocoderrunner.apprunner.api.widgets.PWindow; import org.protocoderrunner.sensors.WhatIsRunning; import org.protocoderrunner.utils.AndroidUtils; import org.protocoderrunner.views.TouchAreaView; import java.io.File; import processing.core.PApplet; import static android.view.ScaleGestureDetector.OnScaleGestureListener; //import android.support.v7.graphics.Palette; @TargetApi(Build.VERSION_CODES.JELLY_BEAN) public class PUI extends PUIGeneric { String TAG = "PUI"; public PUI(Activity a) { super(a); WhatIsRunning.getInstance().add(this); } @ProtocoderScript @APIMethod(description = "Gets the main layout, usually absolute", example = "") @APIParam(params = { "" }) public View getMainLayout() { return ((AppRunnerActivity) a.get()).mainLayout; } @ProtocoderScript @APIMethod(description = "Gets the parent layout where the mainLayout resides", example = "") @APIParam(params = { "" }) public View getParentLayout() { View v = (View) ((AppRunnerActivity) a.get()).mainLayout.getParent(); return v; } @ProtocoderScript @APIMethod(description = "Gets the activity layout, including the action bar", example = "") @APIParam(params = { "" }) public View getActivityLayout() { View v = (View) ((AppRunnerActivity) a.get()).mainLayout.getParent().getParent(); return v; } @ProtocoderScript @APIMethod(description = "Set a title name", example = "") @APIParam(params = { "titleName" }) public void setToolbarTitle(String title) { if (noActionBarAllowed) { return; } appRunnerActivity.get().getSupportActionBar().setTitle(title); //appRunnerActivity.get().setActionBar(null, null); //appRunnerActivity.get().actionBar.setTitle(title); } @ProtocoderScript @APIMethod(description = "Sets a secondary title", example = "") @APIParam(params = { "subtitleName" }) public void setToolbarSubtitle(String title) { if (noActionBarAllowed) { return; } appRunnerActivity.get().getSupportActionBar().setSubtitle(title); // // appRunnerActivity.get().setActionBar(null, null); // appRunnerActivity.get().actionBar.setSubtitle(title); } @ProtocoderScript @APIMethod(description = "Show/Hide title bar", example = "") @APIParam(params = { "boolean" }) public void showToolbar(Boolean b) { if (noActionBarAllowed) { return; } //a.get().setActionBar(null, null); if (b) { appRunnerActivity.get().getSupportActionBar().show(); } else { appRunnerActivity.get().getSupportActionBar().hide(); } } @ProtocoderScript @APIMethod(description = "Changes the title bar color", example = "") @APIParam(params = { "r", "g", "b", "a" }) public void setToolbarBgColor(int r, int g, int b, int alpha) { if (noActionBarAllowed) { return; } int c = Color.argb(alpha, r, g, b); appRunnerActivity.get().setActionBar(c, null); } @ProtocoderScript @APIMethod(description = "Changes the title text color", example = "") @APIParam(params = { "r", "g", "b", "a" }) public void setToolbarTextColor(int r, int g, int b, int alpha) { if (noActionBarAllowed) { return; } int c = Color.argb(alpha, r, g, b); appRunnerActivity.get().setActionBar(null, c); } @ProtocoderScript @APIMethod(description = "Sets an image rather than text as a title", example = "") @APIParam(params = { "imageName" }) public void setToolbarImage(String imagePath) { if (noActionBarAllowed) { return; } Bitmap myBitmap = BitmapFactory.decodeFile(AppRunnerSettings.get().project.getStoragePath() + imagePath); Drawable icon = new BitmapDrawable(a.get().getResources(), myBitmap); appRunnerActivity.get().actionBar.setIcon(icon); } //TODO doesnt work properly @ProtocoderScript @APIMethod(description = "Shows/Hide the home bar", example = "") @APIParam(params = { "boolean" }) public void showHomeBar(boolean b) { appRunnerActivity.get().showHomeBar(b); } @ProtocoderScript @APIMethod(description = "Sets the fullscreen / immersive / dimBars mode", example = "") @APIParam(params = { "mode={fullscreen, immersive, lightsOut}" }) public void setScreenMode(String mode) { if (mode.equals("fullscreen")) { appRunnerActivity.get().setFullScreen(); isFullscreenMode = true; } else if (mode.equals("lightsOut")) { appRunnerActivity.get().lightsOutMode(); } else if (mode.equals("immersive")) { // isImmersiveMode = true; appRunnerActivity.get().setImmersive(); updateScreenSizes(); //do nothing } else { } } @ProtocoderScript @APIMethod(description = "Forces landscape mode in the app", example = "") @APIParam(params = {"mode={'landscape', 'portrait', 'other'"}) public void setScreenOrientation(String mode) { if (mode.equals("landscape")) { appRunnerActivity.get().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); } else if(mode.equals("portrait")) { appRunnerActivity.get().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } else { appRunnerActivity.get().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); } } @ProtocoderScript @APIMethod(description = "Shows a little popup with a given text", example = "") @APIParam(params = { "text" }) public void toast(String text) { Toast.makeText(a.get(), text, Toast.LENGTH_SHORT).show(); } @ProtocoderScript @APIMethod(description = "Shows a little popup with a given text during t time", example = "") @APIParam(params = { "text", "duration" }) public void toast(String text, int duration) { Toast.makeText(a.get(), text, duration).show(); } @ProtocoderScript @APIMethod(description = "Sets the main layout padding", example = "") @APIParam(params = { "left", "top", "right", "bottom" }) public void setPadding(int left, int top, int right, int bottom) { initializeLayout(); uiAbsoluteLayout.setPadding(left, top, right, bottom); } @ProtocoderScript @APIMethod(description = "Resize a view to a given width and height. If a parameter is -1 then that dimension is not changed", example = "") @APIParam(params = { "View", "width", "height" }) public void resize(final View v, int h, int w) { boolean animated = false; if (!animated) { if (h != -1) { v.getLayoutParams().height = h; } if (w != -1) { v.getLayoutParams().width = w; } v.setLayoutParams(v.getLayoutParams()); } else { int initHeight = v.getLayoutParams().height; // v.setLayoutParams(v.getLayoutParams()); ValueAnimator anim = ValueAnimator.ofInt(initHeight, h); anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { int val = (Integer) valueAnimator.getAnimatedValue(); v.getLayoutParams().height = val; v.setLayoutParams(v.getLayoutParams()); } }); anim.setDuration(200); anim.start(); } } @ProtocoderScript @APIMethod(description = "Show/Hide a view", example = "") @APIParam(params = { "View", "boolean" }) public void show(View v, boolean b) { if (b) { v.setVisibility(View.VISIBLE); } else { v.setVisibility(View.GONE); } } @ProtocoderScript @APIMethod(description = "Moves a view to a position using a normal transition", example = "") @APIParam(params = { "View", "x", "y" }) public void move(View v, float x, float y) { v.animate().x(x).setDuration(AppSettings.animGeneralSpeed); v.animate().y(y).setDuration(AppSettings.animGeneralSpeed); } @ProtocoderScript @APIMethod(description = "Moves a view by given units from the current position using a normal transition", example = "") @APIParam(params = { "View", "x", "y" }) public void moveBy(View v, float x, float y) { v.animate().xBy(x).setDuration(AppSettings.animGeneralSpeed); v.animate().yBy(y).setDuration(AppSettings.animGeneralSpeed); } //@TargetApi(L) @ProtocoderScript @APIParam(params = { "View" }) public void clipAndShadow(View v, int type, int r) { AndroidUtils.setViewGenericShadow(v, type, 0, 0, v.getWidth(), v.getHeight(), r); } //@TargetApi(L) @ProtocoderScript @APIParam(params = { "View" }) public void clipAndShadow(View v, int type, int x, int y, int w, int h, int r) { AndroidUtils.setViewGenericShadow(v, type, x, y, w, h, r); } //@TargetApi(L) @TargetApi(Build.VERSION_CODES.LOLLIPOP) @ProtocoderScript @APIParam(params = { "View" }) public void reveal(final View v) { // previously invisible view // get the center for the clipping circle int cx = (v.getLeft() + v.getRight()) / 2; int cy = (v.getTop() + v.getBottom()) / 2; // get the final radius for the clipping circle int finalRadius = v.getWidth(); // create and start the animator for this view // (the start radius is zero) ValueAnimator anim = (ValueAnimator) ViewAnimationUtils.createCircularReveal(v, cx, cy, 0, finalRadius); anim.setDuration(1000); anim.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { super.onAnimationStart(animation); v.setVisibility(View.VISIBLE); } }); anim.start(); } @TargetApi(Build.VERSION_CODES.LOLLIPOP) @ProtocoderScript @APIParam(params = { "View" }) public void unreveal(final View v) { // get the center for the clipping circle int cx = (v.getLeft() + v.getRight()) / 2; int cy = (v.getTop() + v.getBottom()) / 2; // get the initial radius for the clipping circle int initialRadius = v.getWidth(); // create the animation (the final radius is zero) ValueAnimator anim = (ValueAnimator) ViewAnimationUtils.createCircularReveal(v, cx, cy, initialRadius, 0); anim.setDuration(1000); // make the view invisible when the animation is done anim.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); v.setVisibility(View.INVISIBLE); } }); // start the animation anim.start(); } @ProtocoderScript @APIParam(params = { "View", "x", "y", "w", "h" }) public void clipCircle(View v, final int x, final int y, final int w, final int h) { Outline outline = new Outline(); outline.setOval(x, y, w, h); v.setClipToOutline(true); ViewOutlineProvider viewOutlineProvider = new ViewOutlineProvider() { @Override public void getOutline(View view, Outline outline) { // Or read size directly from the view's width/height outline.setOval(x, y, w, h); } }; v.setOutlineProvider(viewOutlineProvider); } // http://stackoverflow.com/questions/16557076/how-to-smoothly-move-a-image-view-with-users-finger-on-android-emulator public void draggable(View v) { v.setOnTouchListener(new OnTouchListener() { PointF downPT = new PointF(); // Record Mouse Position When Pressed // Down PointF startPT = new PointF(); // Record Start Position of 'img' @Override public boolean onTouch(View v, MotionEvent event) { int eid = event.getAction(); switch (eid) { case MotionEvent.ACTION_MOVE: PointF mv = new PointF(event.getX() - downPT.x, event.getY() - downPT.y); v.setX((int) (startPT.x + mv.x)); v.setY((int) (startPT.y + mv.y)); startPT = new PointF(v.getX(), v.getY()); break; case MotionEvent.ACTION_DOWN: downPT.x = event.getX(); downPT.y = event.getY(); startPT = new PointF(v.getX(), v.getY()); break; case MotionEvent.ACTION_UP: // Nothing have to do break; default: break; } return true; } }); } @ProtocoderScript @APIMethod(description = "Makes the current view draggable or cancel the drag depending on the boolean state", example = "") @APIParam(params = { "View", "boolean" }) public void draggable(View v, boolean b) { if (b) { this.draggable(v); } else { v.setOnTouchListener(null); } } @ProtocoderScript @APIMethod(description = "Change the animation speed for the default animations", example = "") @APIParam(params = { "View" }) public void animSpeed(int speed) { AppSettings.animGeneralSpeed = speed; } @ProtocoderScript @APIMethod(description = "Makes the view jump", example = "") @APIParam(params = { "View" }) public void jump(View v) { ValueAnimator w = ObjectAnimator.ofFloat(v, "scaleX", 1f, 0.9f, 1.2f, 1f); w.setDuration(AppSettings.animGeneralSpeed); ValueAnimator h = ObjectAnimator.ofFloat(v, "scaleY", 1f, 0.9f, 1.2f, 1f); h.setDuration(AppSettings.animGeneralSpeed); AnimatorSet animatorSet = new AnimatorSet(); animatorSet.play(w).with(h); animatorSet.start(); } @ProtocoderScript @APIMethod(description = "Makes the view blink", example = "") @APIParam(params = { "View", "num" }) public void blink(View v, int num) { ObjectAnimator anim = ObjectAnimator.ofFloat(v, "alpha", 1f, 0f, 1f); anim.setDuration(AppSettings.animGeneralSpeed); anim.setInterpolator(new CycleInterpolator(1)); anim.setRepeatCount(num); anim.start(); } @ProtocoderScript @APIMethod(description = "Makes the view blink", example = "") @APIParam(params = { "View", "speed", "num" }) public void blink(View v, int speed, int num) { ObjectAnimator anim = ObjectAnimator.ofFloat(v, "alpha", 1f, 0f, 1f); anim.setDuration(speed); //anim.setInterpolator(new CycleInterpolator(num)); anim.setRepeatCount(num); anim.start(); } @ProtocoderScript @APIMethod(description = "Rotates the view in the x axis", example = "") @APIParam(params = { "View", "x" }) public void rotate(View v, float x) { v.animate().rotation(x).setDuration(AppSettings.animGeneralSpeed); } @ProtocoderScript @APIMethod(description = "Rotates the view in the x, y, z axis", example = "") @APIParam(params = { "View", "x", "y", "z" }) public void rotate(View v, float x, float y, float z) { v.animate().rotation(x).setDuration(AppSettings.animGeneralSpeed); // looks weird but it works more consistent v.animate().rotationX(y).setDuration(AppSettings.animGeneralSpeed); v.animate().rotationY(z).setDuration(AppSettings.animGeneralSpeed); } @ProtocoderScript @APIMethod(description = "Changes the alpha of a view", example = "") @APIParam(params = { "View", "float={0,1}" }) public void alpha(View v, float alpha) { v.animate().alpha(alpha).setDuration(AppSettings.animGeneralSpeed); } @ProtocoderScript @APIMethod(description = "Scales a view with animation to a given size", example = "") @APIParam(params = { "View", "x", "y" }) public void scale(View v, float x, float y) { v.animate().scaleX(x).setDuration(AppSettings.animGeneralSpeed); v.animate().scaleY(y).setDuration(AppSettings.animGeneralSpeed); } @ProtocoderScript @APIMethod(description = "Scales a view with animation by a given size", example = "") @APIParam(params = { "View", "x", "y" }) public void scaleBy(View v, float x, float y) { v.animate().scaleXBy(x).setDuration(AppSettings.animGeneralSpeed); v.animate().scaleYBy(y).setDuration(AppSettings.animGeneralSpeed); } //TODO doesnt work always @ProtocoderScript @APIMethod(description = "Scales and moves a view to a given position and size", example = "") @APIParam(params = { "View", "x", "y", "w", "h" }) public void amplify(View v, float x, float y, float w, float h) { this.move(v, x, y); float pX = v.getPivotX(); float pY = v.getPivotY(); v.setPivotX(0); v.setPivotY(0); float sX = w / v.getWidth(); float sY = h / v.getHeight(); this.scale(v, sX, sY); v.setPivotX(pX); v.setPivotY(pY); } public Palette getPalette(Bitmap bmp) { Palette palette = Palette.generate(bmp); return palette; } class GestureDetectorReturn { public String type; public JSONObject data; } // --------- addGestureDetector ---------// public interface addGestureDetectorCB { void event(GestureDetectorReturn g); } @ProtocoderScript @APIMethod(description = "Starts a gesture detector over a view", example = "") @APIParam(params = { "View", "function(data)" }) //http://stackoverflow.com/questions/6599329/can-one-ongesturelistener-object-deal-with-two-gesturedetector-objects public void gestureDetector(View v, final addGestureDetectorCB cb) { final GestureDetectorReturn g = new GestureDetectorReturn(); final GestureDetector gestureDetector = new GestureDetector(a.get(), new GestureDetector.OnGestureListener() { @Override public boolean onSingleTapUp(MotionEvent e) { g.type = "up"; cb.event(g); return false; } @Override public void onShowPress(MotionEvent e) { g.type = "showpress"; cb.event(g); } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { g.type = "scroll"; g.data = new JSONObject(); try { g.data.put("distanceX", distanceX); g.data.put("distanceY", distanceY); } catch (JSONException e) { e.printStackTrace(); } cb.event(g); return true; } @Override public void onLongPress(MotionEvent e) { g.type = "longpress"; cb.event(g); } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { g.type = "fling"; g.data = new JSONObject(); try { g.data.put("velocityX", velocityX); g.data.put("velocityY", velocityY); } catch (JSONException e) { e.printStackTrace(); } cb.event(g); return true; } @Override public boolean onDown(MotionEvent e) { g.type = "down"; cb.event(g); return true; } }); final ScaleGestureDetector scaleGestureDetector = new ScaleGestureDetector(a.get(), new OnScaleGestureListener() { @Override public boolean onScale(ScaleGestureDetector scaleGestureDetector) { g.type = "scale"; cb.event(g); return false; } @Override public boolean onScaleBegin(ScaleGestureDetector scaleGestureDetector) { g.type = "scaleBegin"; cb.event(g); return false; } @Override public void onScaleEnd(ScaleGestureDetector scaleGestureDetector) { g.type = "scaleEnd"; cb.event(g); } }); v.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { scaleGestureDetector.onTouchEvent(event); if(scaleGestureDetector.isInProgress()) return true; gestureDetector.onTouchEvent(event); return true; } }); } @ProtocoderScript @APIMethod(description = "Changes the background color using RGB", example = "") @APIParam(params = { "r", "g", "b" }) public void setBackgroundColor(int red, int green, int blue) { initializeLayout(); holderLayout.setBackgroundColor(Color.rgb(red, green, blue)); } @ProtocoderScript @APIMethod(description = "Changes the background color using Hex", example = "") @APIParam(params = { "hex" }) public void setBackgroundColor(String c) { initializeLayout(); holderLayout.setBackgroundColor(Color.parseColor(c)); } @ProtocoderScript @APIMethod(description = "Sets an image as background", example = "") @APIParam(params = { "imageName" }) public void setBackgroundImage(String imagePath) { initializeLayout(); // Add the bg image asynchronously new SetBgImageTask(bgImageView, false).execute(AppRunnerSettings.get().project.getStoragePath() + File.separator + imagePath); } @ProtocoderScript @APIMethod(description = "Sets an image as tiled background", example = "") @APIParam(params = { "imageName" }) public void setBackgroundImageTile(String imagePath) { initializeLayout(); // Add the bg image asynchronously new SetBgImageTask(bgImageView, true).execute(AppRunnerSettings.get().project.getStoragePath() + File.separator + imagePath); } @ProtocoderScript @APIMethod(description = "Creates an absolute layout ", example = "") @APIParam(params = { "x", "y", "w", "h" }) public PAbsoluteLayout addAbsoluteLayout(int x, int y, int w, int h) { PAbsoluteLayout al = newAbsoluteLayout(); addViewAbsolute(al, x, y, w, h); return al; } @ProtocoderScript @APIMethod(description = "Creates a card ", example = "") @APIParam(params = { "label" }) public PCard addCard() { PCard c = newCard(); addViewLinear(c); return c; } @ProtocoderScript @APIMethod(description = "Adds a card that can hold views", example = "") @APIParam(params = { "label", "x", "y", "w", "h" }) public PCard addCard(String label, int x, int y, int w, int h) { PCard c = newCard(); c.setTitle(label); addViewAbsolute(c, x, y, w, h); return c; } @ProtocoderScript @APIMethod(description = "Creates a window that can hold views ", example = "") @APIParam(params = { "label", "x", "y", "w", "h" }) public PWindow addWindow(String label, int x, int y, int w, int h) { PWindow wn = newWindow(); wn.setTitle(label); addViewAbsolute(wn, x, y, w, h); return wn; } @ProtocoderScript @APIMethod(description = "Adds a button", example = "") @APIParam(params = { "label", "x", "y", "w", "h", "function()" }) public PButton addButton(String label, int x, int y, int w, int h, final addGenericButtonCB callbackfn) { PButton b = newButton(label, callbackfn); addViewAbsolute(b, x, y, w, h); return b; } @ProtocoderScript @APIMethod(description = "Adds a button", example = "") @APIParam(params = { "label", "x", "y", "function()" }) public PButton addButton(String label, int x, int y, final addGenericButtonCB callbackfn) { PButton b = newButton(label, callbackfn); addViewAbsolute(b, x, y, -1, -1); return b; } @ProtocoderScript @APIMethod(description = "Adds an invisible touch area", example = "") @APIParam(params = { "x", "y", "w", "h", "bShowArea", "function(touching, x, y)" }) public TouchAreaView addTouchArea(int x, int y, int w, int h, boolean showArea, final addGenericTouchAreaCB callbackfn) { TouchAreaView taV = newTouchArea(showArea, callbackfn); addViewAbsolute(taV, x, y, w, h); return taV; } @ProtocoderScript @APIMethod(description = "Adds a touch area that allows multitouch", example = "") @APIParam(params = { "x", "y", "w", "h", "function(touching, x, y)" }) public PPadView addXYPad(int x, int y, int w, int h, final addPadCB callbackfn) { PPadView taV = newTouchPad(callbackfn); addViewAbsolute(taV, x, y, w, h); return taV; } //TODO removed old one this is a place holder //@ProtocoderScript //@APIMethod(description = "Knob", example = "") //@APIParam(params = { "function(progress)" }) public View addKnob(final addGenericKnobCB callbackfn) { //PKnob pKnob = newKnob(a.get()); //addViewAbsolute(pKnob, x, y, w, h); return null; } @ProtocoderScript @APIMethod(description = "Adds a slider", example = "") @APIParam(params = { "x", "y", "w", "h", "max", "progress", "function(progress)" }) public PSlider addSlider(int x, int y, int w, int h, int min, int max, final addGenericSliderCB callbackfn) { PSlider sb = newSlider(min, max, callbackfn); addViewAbsolute(sb, x, y, w, -1); return sb; } @ProtocoderScript @APIMethod(description = "Adds a list of items passed as array", example = "") @APIParam(params = { "x", "y", "w", "h", "arrayStrings", "function(data)" }) public PSpinner addChoiceBox(int x, int y, int w, int h, final String[] array, final addGenericSpinnerCB callbackfn) { PSpinner spinner = newChoiceBox(array, callbackfn); addViewAbsolute(spinner, x, y, w, h); return spinner; } @ProtocoderScript @APIMethod(description = "Add a progress bar", example = "") @APIParam(params = { "x", "y", "w", "h", "max" }) public PProgressBar addProgressBar(int x, int y, int w, int h, int max) { PProgressBar pb = newProgress(max); addViewAbsolute(pb, x, y, w, -1); return pb; } @ProtocoderScript @APIMethod(description = "Add a text box defined by its position and size", example = "") @APIParam(params = { "label", "x", "y", "w", "h" }) public PTextView addText(String label, int x, int y, int w, int h) { PTextView tv = newText(label); addViewAbsolute(tv, x, y, w, h); return tv; } @ProtocoderScript @APIMethod(description = "Adds a text box defined only by its position", example = "") @APIParam(params = { "label", "x", "y" }) public PTextView addText(String label, int x, int y) { PTextView tv = newText(label); addViewAbsolute(tv, x, y, -1, -1); return tv; } @ProtocoderScript @APIMethod(description = "Adds an input box", example = "") @APIParam(params = { "label", "x", "y", "w", "h", "function()" }) public PEditText addInput(String label, int x, int y, int w, int h, final addGenericInputCB callbackfn) { PEditText et = newInput(label, callbackfn); addViewAbsolute(et, x, y, w, h); return et; } @ProtocoderScript @APIMethod(description = "Adds an input box", example = "") @APIParam(params = { "label", "x", "y", "w", "h" }) public PEditText addInput(String label, int x, int y, int w, int h) { PEditText et = newInput(label, null); addViewAbsolute(et, x, y, w, h); return et; } //number picker @ProtocoderScript @APIMethod(description = "Adds a number picker", example = "") @APIParam(params = { "from", "to", "x", "y", "w", "h" }) public void addNumberPicker(int from, int to, int x, int y, int w, int h, NewGenericNumberPickerCB callback) { PNumberPicker np = newNumberPicker(from, to, callback); addViewAbsolute(np, x, y, w, h); } @ProtocoderScript @APIMethod(description = "Adds a toggle", example = "") @APIParam(params = { "text", "x", "y", "w", "h", "checked", "function(checked)" }) public PToggleButton addToggle(final String label, int x, int y, int w, int h, boolean initstate, final addGenericToggleCB callbackfn) { PToggleButton tb = newToggle(label, initstate, callbackfn); addViewAbsolute(tb, x, y, w, h); return tb; } @ProtocoderScript @APIMethod(description = "Adds a checkbox", example = "") @APIParam(params = { "label", "x", "y", "w", "h", "checked", "function(checked)" }) public PCheckBox addCheckbox(String label, int x, int y, int w, int h, boolean initstate, final addGenericCheckboxCB callbackfn) { PCheckBox cb = newCheckbox(label, initstate, callbackfn); addViewAbsolute(cb, x, y, w, h); return cb; } @ProtocoderScript @APIMethod(description = "Adds a checkbox", example = "") @APIParam(params = { "x", "y", "w", "h", "checked", "function(checked)" }) public PSwitch addSwitch(int x, int y, int w, int h, boolean initstate, final addGenericSwitchCB callbackfn) { PSwitch s = newSwitch(initstate, callbackfn); addViewAbsolute(s, x, y, w, h); return s; } @ProtocoderScript @APIMethod(description = "Adds a radio button", example = "") @APIParam(params = { "label", "x", "y", "w", "h", "checked", "function(checked)" }) public PRadioButton addRadioButton(String label, int x, int y, int w, int h, boolean initstate, final addGenericRadioButtonCB callbackfn) { PRadioButton rb = newRadioButton(label, initstate, callbackfn); addViewAbsolute(rb, x, y, w, h); return rb; } @ProtocoderScript @APIMethod(description = "Adds an image", example = "") @APIParam(params = { "x", "y", "w", "h", "imagePath" }) public PImageView addImage(String imagePath, int x, int y, int w, int h) { final PImageView iv = newImage(imagePath); addViewAbsolute(iv, x, y, w, h); return iv; } @ProtocoderScript @APIMethod(description = "Adds an image", example = "") @APIParam(params = { "x", "y", "w", "h", "imagePath" }) public PImageView addImage(int x, int y, int w, int h) { final PImageView iv = newImage(null); addViewAbsolute(iv, x, y, w, h); return iv; } @ProtocoderScript @APIMethod(description = "Adds an image", example = "") @APIParam(params = { "x", "y", "imagePath" }) public PImageView addImage(String imagePath, int x, int y) { final PImageView iv = newImage(imagePath); addViewAbsolute(iv, x, y, -1, -1); return iv; } @ProtocoderScript @APIMethod(description = "Adds a plot with a range", example = "") @APIParam(params = { "x", "y", "w", "h", "min", "max" }) public PPlotView addPlot(int x, int y, int w, int h, int min, int max) { PPlotView jPlotView = newPlot(min, max); addViewAbsolute(jPlotView, x, y, w, h); return jPlotView; } @ProtocoderScript @APIMethod(description = "Adds a checkbox", example = "") @APIParam(params = { "x", "y", "w", "h", "imageName", "function()" }) public PImageButton addImageButton(int x, int y, int w, int h, String imagePath, final addImageButtonCB callbackfn) { return newImageButton(x, y, w, h, imagePath, "", false, callbackfn); } @APIParam(params = { "x", "y", "w", "h", "imageNameNotPressed", "imageNamePressed", "function()" }) public PImageButton addImageButton(int x, int y, int w, int h, String imgNotPressed, String imgPressed, final addImageButtonCB callbackfn) { return newImageButton(x, y, w, h, imgNotPressed, imgPressed, false, callbackfn); } @ProtocoderScript @APIMethod(description = "Adds a grid of elements given an array of strings", example = "") @APIParam(params = { "type", "arrayStrings", "x", "y", "w", "h", "function(data)" }) public PGrid addGridOf(String type, NativeArray array, int cols, int x, int y, int w, int h, final addGridOfCB callbackfn) { PGrid grid = newGridOf(type, array, cols, callbackfn); addViewAbsolute(grid, x, y, w, h); return grid; } @ProtocoderScript @APIMethod(description = "Adds a canvas view", example = "") @APIParam(params = { "x", "y", "w", "h" }) public PCanvasView addCanvas(int x, int y, int w, int h, boolean autoDraw) { PCanvasView canvasView = newCanvas(w, h); canvasView.autoDraw(autoDraw); addViewAbsolute(canvasView, x, y, w, h); return canvasView; } @ProtocoderScript @APIMethod(description = "Adds a canvas view", example = "") @APIParam(params = { "x", "y", "w", "h" }) public PCanvasView addCanvas(int x, int y, int w, int h) { return addCanvas(x, y, w, h, false); } public PList addList(int x, int y, int w, int h) { PList plist = new PList(a.get()); return plist; } @ProtocoderScript @APIMethod(description = "Adds a processing view", example = "") @APIParam(params = { "x", "y", "w", "h", "mode={'p2d', 'p3d'" }) public PApplet addProcessing(int x, int y, int w, int h, String mode) { initializeLayout(); // Create the main layout. This is where all the items actually go FrameLayout fl = new FrameLayout(a.get()); fl.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); fl.setId(200 + (int) (200 * Math.random())); fl.setBackgroundResource(R.color.transparent); // Add the view addViewAbsolute(fl, x, y, w, h); PProcessing p = new PProcessing(); Bundle bundle = new Bundle(); bundle.putString("mode", mode); p.setArguments(bundle); FragmentTransaction ft = appRunnerActivity.get().getSupportFragmentManager().beginTransaction(); ft.add(fl.getId(), p, String.valueOf(fl.getId())); // ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); // ft.setCustomAnimations(android.R.anim.fade_in, // android.R.anim.fade_out); ft.addToBackStack(null); ft.commit(); return p; } //TODO add again the editor // public EditorFragment addEditor(int x, int y, int w, int h) { // initializeLayout(); // // // Create the main layout. This is where all the items actually go // FrameLayout fl = new FrameLayout(a.get()); // fl.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); // fl.setId(125); // fl.setBackgroundResource(R.color.transparent); // // // Add the view // addViewAbsolute(fl, x, y, w, h); // // EditorFragment ef = new EditorFragment(); // // FragmentTransaction ft = a.get().getSupportFragmentManager().beginTransaction(); // ft.add(fl.getId(), ef, String.valueOf(fl.getId())); // // // ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); // // ft.setCustomAnimations(android.R.anim.fade_in, // // android.R.anim.fade_out); // ft.addToBackStack(null); // ft.commit(); // // return ef; // } @ProtocoderScript @APIMethod(description = "Adds a webview", example = "") @APIParam(params = { "x", "y", "w", "h" }) public PWebView addWebView(int x, int y, int w, int h) { PWebView webView = newWebview(); addViewAbsolute(webView, x, y, w, h); return webView; } @ProtocoderScript @APIMethod(description = "Add camera view", example = "") @APIParam(params = { "type", "x", "y", "w", "h" }) public PCamera addCameraView(String type, int x, int y, int w, int h) { PCamera pCamera = newCamera(type); addViewAbsolute(pCamera, x, y, w, h); return pCamera; } @ProtocoderScript @APIMethod(description = "Adds a video view and starts playing the fileName", example = "") @APIParam(params = { "fileName" }) public PVideo newVideoView(final String videoFile) { PVideo video = newVideo(videoFile); return video; } @ProtocoderScript @APIMethod(description = "Adds a video view and starts playing the fileName", example = "") @APIParam(params = { "fileName", "x", "y", "w", "h" }) public PVideo addVideoView(final String videoFile, int x, int y, int w, int h) { PVideo video = newVideo(videoFile); addViewAbsolute(video, x, y, w, h); return video; } @ProtocoderScript @APIMethod(description = "Add a openstreetmap", example = "") @APIParam(params = { "x", "y", "w", "h" }) public PMap addMap(int x, int y, int w, int h) { PMap mapView = newMap(); addViewAbsolute(mapView, x, y, w, h); return mapView; } // --------- yesno dialog ---------// public interface popupCB { void event(boolean b); } @ProtocoderScript @APIMethod(description = "Shows a popup with a given text", example = "") @APIParam(params = { "title", "message", "okButton", "cancelButton", "function(boolean)" }) public void popupInfo(String title, String msg, String ok, String cancel, final popupCB callbackfn) { AlertDialog.Builder builder = new AlertDialog.Builder(a.get()); builder.setTitle(title); builder.setMessage(msg); if (!ok.isEmpty()) { // Set up the buttons builder.setPositiveButton(ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { if (callbackfn != null) { callbackfn.event(true); } } }); } if (!cancel.isEmpty()) { builder.setNegativeButton(cancel, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); if (callbackfn != null) { callbackfn.event(false); } } }); } if(!((Activity) a.get()).isFinishing()) { builder.show(); } } // --------- inputDialog ---------// interface inputDialogCB { void event(String text); } @ProtocoderScript @APIMethod(description = "Shows an input dialog", example = "") @APIParam(params = { "title", "function(text)" }) public void popupInput(String title, final inputDialogCB callbackfn) { AlertDialog.Builder builder = new AlertDialog.Builder(a.get()); builder.setTitle(title); final EditText input = new EditText(a.get()); input.setInputType(InputType.TYPE_CLASS_TEXT); builder.setView(input); // Set up the buttons builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { String text = input.getText().toString(); callbackfn.event(text); } }); builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); builder.show(); } // --------- choiceDialog ---------// interface choiceDialogCB { void event(String string); } @ProtocoderScript @APIMethod(description = "Shows a choice dialog using a given array of strings", example = "") @APIParam(params = { "title", "arrayStrings", "function(text)" }) public void popupChoice(String title, final String[] choices, final choiceDialogCB callbackfn) { AlertDialog.Builder builder = new AlertDialog.Builder(a.get()); builder.setTitle(title); // Set up the buttons builder.setItems(choices, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { callbackfn.event(choices[which]); } }); builder.show(); } //TODO it works but need a way to wait for it to be shown public PPopupCustomFragment popupCustom() { PPopupCustomFragment pPopupCustomFragment = new PPopupCustomFragment(); android.app.FragmentManager fm = appRunnerActivity.get().getFragmentManager(); pPopupCustomFragment.show(fm, "popUpCustom"); return pPopupCustomFragment; } @ProtocoderScript @APIMethod(description = "Takes a screenshot of the whole app and stores it to a given file name", example = "") @APIParam(params = { "imageName" }) public void takeScreenshot(String imagePath) { AndroidUtils.takeScreenshot(AppRunnerSettings.get().project.getStoragePath(), imagePath, uiAbsoluteLayout); } @ProtocoderScript @APIMethod(description = "Takes a screenshot of a view and save it to an image", example = "") @APIParam(params = { "view", "imageName" }) public void takeViewScreenshot(View v, String imagePath) { AndroidUtils.takeScreenshotView(AppRunnerSettings.get().project.getStoragePath(), imagePath, v); } @ProtocoderScript @APIMethod(description = "Takes a screenshot of a view", example = "") @APIParam(params = { "view" }) public Bitmap takeViewScreenshot(View v) { return AndroidUtils.takeScreenshotView("", "", v); } // it only works with absolute layout and only when // a layout is been used @ProtocoderScript @APIMethod(description = "Show the virtual keyboard", example = "") @APIParam(params = { "boolean" }) public void showVirtualKeys(boolean show) { initializeLayout(); InputMethodManager imm = (InputMethodManager) a.get().getSystemService(a.get().INPUT_METHOD_SERVICE); if (show) { imm.showSoftInput(appRunnerActivity.get().getCurrentFocus(), InputMethodManager.SHOW_FORCED); uiAbsoluteLayout.setFocusable(true); uiAbsoluteLayout.setFocusableInTouchMode(true); } else { imm.hideSoftInputFromWindow(appRunnerActivity.get().getCurrentFocus().getWindowToken(), 0); } } public void stop() { } // @JavascriptInterface // @APIParam( params = {"milliseconds", "function()"} ) // public void startTrackingTouches(String b) { // } }