mirror of
https://github.com/EddyVerbruggen/Toast-PhoneGap-Plugin.git
synced 2026-07-31 00:02:14 +08:00
Merge with EddyVerbruggen/master
This commit is contained in:
@@ -3,6 +3,11 @@ package nl.xservices.plugins;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.drawable.GradientDrawable;
|
||||
import android.os.Build;
|
||||
import android.os.CountDownTimer;
|
||||
import android.text.Layout;
|
||||
import android.text.Spannable;
|
||||
import android.text.SpannableString;
|
||||
import android.text.style.AlignmentSpan;
|
||||
import android.view.Gravity;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
@@ -16,16 +21,6 @@ import org.json.JSONArray;
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
/*
|
||||
// TODO nice way for the Toast plugin to offer a longer delay than the default short and long options
|
||||
// TODO also look at https://github.com/JohnPersano/Supertoasts
|
||||
new CountDownTimer(6000, 1000) {
|
||||
public void onTick(long millisUntilFinished) {toast.show();}
|
||||
public void onFinish() {toast.show();}
|
||||
}.start();
|
||||
|
||||
Also, check https://github.com/JohnPersano/SuperToasts
|
||||
*/
|
||||
public class Toast extends CordovaPlugin {
|
||||
|
||||
private static final String ACTION_SHOW_EVENT = "show";
|
||||
@@ -47,43 +42,55 @@ public class Toast extends CordovaPlugin {
|
||||
|
||||
private String currentMessage;
|
||||
private JSONObject currentData;
|
||||
private static CountDownTimer _timer;
|
||||
|
||||
@Override
|
||||
public boolean execute(String action, JSONArray args, final CallbackContext callbackContext) throws JSONException {
|
||||
if (ACTION_HIDE_EVENT.equals(action)) {
|
||||
if (mostRecentToast != null) {
|
||||
mostRecentToast.cancel();
|
||||
getViewGroup().setOnTouchListener(null);
|
||||
returnTapEvent("hide", currentMessage, currentData, callbackContext);
|
||||
mostRecentToast = null;
|
||||
}
|
||||
returnTapEvent("hide", currentMessage, currentData, callbackContext);
|
||||
hide();
|
||||
callbackContext.success();
|
||||
return true;
|
||||
|
||||
} else if (ACTION_SHOW_EVENT.equals(action)) {
|
||||
|
||||
if (this.isPaused) {
|
||||
return true;
|
||||
}
|
||||
|
||||
final JSONObject options = args.getJSONObject(0);
|
||||
final String msg = options.getString("message");
|
||||
final Spannable message = new SpannableString(msg);
|
||||
message.setSpan(
|
||||
new AlignmentSpan.Standard(Layout.Alignment.ALIGN_CENTER),
|
||||
0,
|
||||
msg.length() - 1,
|
||||
Spannable.SPAN_INCLUSIVE_INCLUSIVE);
|
||||
|
||||
final String message = options.getString("message");
|
||||
final String duration = options.getString("duration");
|
||||
final String position = options.getString("position");
|
||||
final int addPixelsY = options.has("addPixelsY") ? options.getInt("addPixelsY") : 0;
|
||||
final JSONObject data = options.has("data") ? options.getJSONObject("data") : null;
|
||||
final JSONObject styling = options.optJSONObject("styling");
|
||||
|
||||
currentMessage = message;
|
||||
currentMessage = msg;
|
||||
currentData = data;
|
||||
|
||||
cordova.getActivity().runOnUiThread(new Runnable() {
|
||||
public void run() {
|
||||
int hideAfterMs;
|
||||
if ("short".equalsIgnoreCase(duration)) {
|
||||
hideAfterMs = 2000;
|
||||
} else if ("long".equalsIgnoreCase(duration)) {
|
||||
hideAfterMs = 4000;
|
||||
} else {
|
||||
// assuming a number of ms
|
||||
hideAfterMs = Integer.parseInt(duration);
|
||||
}
|
||||
final android.widget.Toast toast = android.widget.Toast.makeText(
|
||||
IS_AT_LEAST_LOLLIPOP ? cordova.getActivity().getWindow().getContext() : cordova.getActivity().getApplicationContext(),
|
||||
message,
|
||||
"short".equals(duration) ? android.widget.Toast.LENGTH_SHORT : android.widget.Toast.LENGTH_LONG);
|
||||
android.widget.Toast.LENGTH_LONG // actually controlled by a timer further down
|
||||
);
|
||||
|
||||
if ("top".equals(position)) {
|
||||
toast.setGravity(GRAVITY_TOP, 0, BASE_TOP_BOTTOM_OFFSET + addPixelsY);
|
||||
@@ -102,6 +109,7 @@ public class Toast extends CordovaPlugin {
|
||||
// the defaults mimic the default toast as close as possible
|
||||
final String backgroundColor = styling.optString("backgroundColor", "#333333");
|
||||
final String textColor = styling.optString("textColor", "#ffffff");
|
||||
final Double textSize = styling.optDouble("textSize", -1);
|
||||
final double opacity = styling.optDouble("opacity", 0.8);
|
||||
final int cornerRadius = styling.optInt("cornerRadius", 100);
|
||||
final int horizontalPadding = styling.optInt("horizontalPadding", 50);
|
||||
@@ -112,11 +120,14 @@ public class Toast extends CordovaPlugin {
|
||||
shape.setAlpha((int)(opacity * 255)); // 0-255, where 0 is an invisible background
|
||||
shape.setColor(Color.parseColor(backgroundColor));
|
||||
toast.getView().setBackground(shape);
|
||||
|
||||
|
||||
final TextView toastTextView;
|
||||
toastTextView = (TextView) toast.getView().findViewById(android.R.id.message);
|
||||
toastTextView.setTextColor(Color.parseColor(textColor));
|
||||
|
||||
if (textSize > -1) {
|
||||
toastTextView.setTextSize(textSize.floatValue());
|
||||
}
|
||||
|
||||
toast.getView().setPadding(horizontalPadding, verticalPadding, horizontalPadding, verticalPadding);
|
||||
|
||||
// this gives the toast a very subtle shadow on newer devices
|
||||
@@ -168,39 +179,25 @@ public class Toast extends CordovaPlugin {
|
||||
final boolean tapped = tapX >= startX && tapX <= endX &&
|
||||
tapY >= startY && tapY <= endY;
|
||||
|
||||
if (tapped) {
|
||||
getViewGroup().setOnTouchListener(null);
|
||||
return returnTapEvent("touch", message, data, callbackContext);
|
||||
}
|
||||
return false;
|
||||
return tapped && returnTapEvent("touch", msg, data, callbackContext);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
toast.getView().setOnTouchListener(new View.OnTouchListener() {
|
||||
@Override
|
||||
public boolean onTouch(View view, MotionEvent motionEvent) {
|
||||
return motionEvent.getAction() == MotionEvent.ACTION_DOWN && returnTapEvent("touch", message, data, callbackContext);
|
||||
return motionEvent.getAction() == MotionEvent.ACTION_DOWN && returnTapEvent("touch", msg, data, callbackContext);
|
||||
}
|
||||
});
|
||||
}
|
||||
// trigger show every 2500 ms for as long as the requested duration
|
||||
_timer = new CountDownTimer(hideAfterMs, 2500) {
|
||||
public void onTick(long millisUntilFinished) {toast.show();}
|
||||
public void onFinish() {toast.cancel();}
|
||||
}.start();
|
||||
|
||||
Thread thread = new Thread(){
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
Thread.sleep("short".equals(duration) ? 2000 : 3500);
|
||||
if (mostRecentToast != null) {
|
||||
returnTapEvent("hide", message, data, callbackContext);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
toast.show();
|
||||
thread.start();
|
||||
mostRecentToast = toast;
|
||||
toast.show();
|
||||
|
||||
PluginResult pr = new PluginResult(PluginResult.Status.OK);
|
||||
pr.setKeepCallback(true);
|
||||
@@ -215,6 +212,17 @@ public class Toast extends CordovaPlugin {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void hide() {
|
||||
if (mostRecentToast != null) {
|
||||
mostRecentToast.cancel();
|
||||
getViewGroup().setOnTouchListener(null);
|
||||
}
|
||||
if (_timer != null) {
|
||||
_timer.cancel();
|
||||
}
|
||||
}
|
||||
|
||||
private boolean returnTapEvent(String eventName, String message, JSONObject data, CallbackContext callbackContext) {
|
||||
final JSONObject json = new JSONObject();
|
||||
try {
|
||||
@@ -238,10 +246,7 @@ public class Toast extends CordovaPlugin {
|
||||
|
||||
@Override
|
||||
public void onPause(boolean multitasking) {
|
||||
if (mostRecentToast != null) {
|
||||
mostRecentToast.cancel();
|
||||
getViewGroup().setOnTouchListener(null);
|
||||
}
|
||||
hide();
|
||||
this.isPaused = true;
|
||||
}
|
||||
|
||||
@@ -249,4 +254,4 @@ public class Toast extends CordovaPlugin {
|
||||
public void onResume(boolean multitasking) {
|
||||
this.isPaused = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user