package org.protocoderrunner.apprunner.api.other; import android.animation.Animator; import android.animation.Animator.AnimatorListener; import android.animation.AnimatorInflater; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.LayoutTransition; import android.animation.ObjectAnimator; import android.annotation.TargetApi; import android.app.Activity; import android.graphics.Color; import android.graphics.Typeface; import android.os.Build; import android.os.Handler; import android.view.Gravity; import android.view.View; import android.view.ViewGroup.LayoutParams; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; import org.protocoderrunner.R; import org.protocoderrunner.apidoc.annotation.APIMethod; import org.protocoderrunner.apidoc.annotation.APIParam; import org.protocoderrunner.apprunner.ProtocoderScript; import org.protocoderrunner.utils.MLog; public class PLiveCodingFeedback { private static final String TAG = "PProtocoderFeedback"; protected Activity a; private LinearLayout liveRLayout; float liveTextY = 0; private TextView liveText; private boolean show = true; // private int bgColor = 0x55000000; // OK private String textColor = "#FFFFFFFF"; private int textSize = 12; // OK private boolean autoHide = false; // OK boolean hidingLiveText = true; private final Handler h; private final Runnable r; private final Typeface fontCode; public boolean enable = false; private int paddingLeft = 5; private int paddingBottom = 5; private int alignment = TextView.TEXT_ALIGNMENT_VIEW_END; private long timeToHide = 4000; public PLiveCodingFeedback(Activity a) { this.a = a; fontCode = Typeface.createFromAsset(a.getAssets(), "Inconsolata.otf"); h = new Handler(); r = new Runnable() { @Override public void run() { liveRLayout.animate().alpha(0.0f).setListener(new AnimatorListener() { @Override public void onAnimationStart(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { } @Override public void onAnimationEnd(Animator animation) { // liveRLayout.setVisibility(View.GONE); // MLog.d("qq", "anim stop"); } @Override public void onAnimationCancel(Animator animation) { } }); } }; } @ProtocoderScript @APIMethod(description = "Show/hide the live coding feedback", example = "") @APIParam(params = { "boolean" }) public PLiveCodingFeedback show(boolean b) { this.show = b; if (b) { liveRLayout.setVisibility(View.VISIBLE); } else { liveRLayout.setVisibility(View.GONE); } return this; } @ProtocoderScript @APIMethod(description = "Auto hide the text after shown", example = "") @APIParam(params = { "boolean" }) public PLiveCodingFeedback autoHide(boolean b) { this.autoHide = b; return this; } @ProtocoderScript @APIMethod(description = "Elapsed time until text is hidden", example = "") @APIParam(params = { "milliseconds" }) public PLiveCodingFeedback timeToHide(int t) { this.timeToHide = t; return this; } @ProtocoderScript @APIMethod(description = "Background color", example = "") @APIParam(params = { "colorHex" }) public PLiveCodingFeedback backgroundColor(String c) { new Color(); this.bgColor = Color.parseColor(c); liveRLayout.setBackgroundColor(this.bgColor); return this; } @ProtocoderScript @APIMethod(description = "Text color", example = "") @APIParam(params = { "colorHex" }) public PLiveCodingFeedback textColor(String color) { new Color(); this.textColor = color; liveText.setTextColor(Color.parseColor(this.textColor)); return this; } @ProtocoderScript @APIMethod(description = "Sets up the text size", example = "") @APIParam(params = { "size" }) public PLiveCodingFeedback textSize(int textSize) { this.textSize = textSize; MLog.d(TAG, "textsize " + textSize); // liveText.setTextSize(this.textSize); return this; } @ProtocoderScript @APIMethod(description = "Adds a text padding", example = "") @APIParam(params = { "left", "bottom" }) public PLiveCodingFeedback padding(int left, int bottom) { paddingLeft = left; paddingBottom = bottom; return this; } @ProtocoderScript @APIMethod(description = "Aligns the text", example = "") @APIParam(params = { "align={left,center,right}" }) public PLiveCodingFeedback align(String alignment) { if (alignment.equals("right")) { this.alignment = TextView.TEXT_ALIGNMENT_VIEW_START; } else if (alignment.equals("center")) { this.alignment = Gravity.CENTER; } else if (alignment.equals("left")) { this.alignment = TextView.TEXT_ALIGNMENT_VIEW_END; } return this; } @ProtocoderScript @APIMethod(description = "Writes simple text in the feedback", example = "") @APIParam(params = { "text" }) public PLiveCodingFeedback write(String text) { write(text, this.textColor, this.textSize); return this; } @ProtocoderScript @APIMethod(description = "Writes text specifing the color and the size", example = "") @APIParam(params = { "text", "colorHex", "size" }) public PLiveCodingFeedback write(String text, String color, int size) { // this.text = text; if (enable) { // showing layout and content and removing previous callbacks if (hidingLiveText) { liveRLayout.setVisibility(View.VISIBLE); liveRLayout.animate().alpha(1.0f); h.removeCallbacks(r); if (this.autoHide) { h.postDelayed(r, timeToHide); } } // if there is a textview then remove it if (liveText != null) { liveRLayout.removeView(liveText); } // add text view liveText = new TextView(a); RelativeLayout.LayoutParams liveTextLayoutParams = new RelativeLayout.LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); liveTextLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); liveTextLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT); liveText.setLayoutParams(liveTextLayoutParams); liveText.setBackgroundColor(0x00000000); liveText.setPadding(paddingLeft, 5, 5, paddingBottom); liveText.setTextColor(Color.parseColor(color)); liveText.setTextSize(size); liveText.setShadowLayer(2, 1, 1, 0x55000000); liveText.setTypeface(fontCode); liveText.setGravity(alignment); liveText.setText(text); liveRLayout.addView(liveText); } return this; } @TargetApi(Build.VERSION_CODES.JELLY_BEAN) public View add() { // live execution layout liveRLayout = new LinearLayout(a); RelativeLayout.LayoutParams liveLayoutParams = new RelativeLayout.LayoutParams( android.view.ViewGroup.LayoutParams.MATCH_PARENT, android.view.ViewGroup.LayoutParams.MATCH_PARENT); liveLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); liveLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT); liveRLayout.setLayoutParams(liveLayoutParams); liveRLayout.setGravity(Gravity.BOTTOM); liveRLayout.setBackgroundColor(bgColor); liveRLayout.setPadding(10, 10, 10, 10); liveRLayout.setVisibility(View.GONE); // liveRLayout.setLayoutTransition(transition) // Animation spinin = AnimationUtils.loadAnimation(this, // R.anim.slide_in_left); // liveRLayout.setLayoutAnimation(new // LayoutAnimationController(spinin)); Animator appearingAnimation = ObjectAnimator.ofFloat(null, "translationY", 20, 0); appearingAnimation.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator anim) { View view = (View) ((ObjectAnimator) anim).getTarget(); view.setTranslationX(0f); } }); if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN) { LayoutTransition l = new LayoutTransition(); l.enableTransitionType(LayoutTransition.CHANGING); AnimatorSet as = (AnimatorSet) AnimatorInflater.loadAnimator(a, R.animator.live_code); // as.se l.setAnimator(LayoutTransition.APPEARING, as); l.setDuration(LayoutTransition.APPEARING, 300); l.setStartDelay(LayoutTransition.APPEARING, 0); liveRLayout.setLayoutTransition(l); } return liveRLayout; } }