Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Touch callback never triggers #88

Open
HikeNH opened this issue Jun 17, 2016 · 18 comments
Open

Touch callback never triggers #88

HikeNH opened this issue Jun 17, 2016 · 18 comments
Assignees

Comments

@HikeNH
Copy link

HikeNH commented Jun 17, 2016

Expected behaviour

the trigger event listed below should trigger.

Actual behaviour

The success is always called upon initializing the toast, and result returns a value of "ok". result.event is never populated. The trigger event works if I set it to occur when the result value is "ok", so whatever I'm doing wrong is specific to the code below. Any help or suggestions?

I'm seeing this behaviour on

Remove this hint: these checkboxes can be checked like this: [x]

  • [X ] iOS device
  • [ X] iOS sim
  • [ X] Android device
  • [ X] Android sim

Code Sample

Acts.prototype.ShowToast = function (st_message,st_duration,st_location,st_offset,st_opacity,st_backcolor,st_textcolor,st_textsize,st_cornerradius,st_hpadding,st_vpadding)
{if(st_location === 0){st_location = "top";}
else if(st_location === 1){st_location = "center";}
else{st_location = "bottom";}
window["plugins"]["toast"]["showWithOptions"]({
"message": st_message,
"duration": st_duration,
"position": st_location,
"addPixelsY": st_offset,
"data": {"foo":"bar"},
"styling": {
"opacity": st_opacity, // 0.0 %28transparent) to 1.0 (opaque). Default 0.8
"backgroundColor": st_backcolor, // make sure you use #RRGGBB. Default #333333
"textColor": st_textcolor, // Ditto. Default #FFFFFF
"textSize": st_textsize, // Default is approx. 13.
"cornerRadius": st_cornerradius, // minimum is 0 (square). iOS default 20, Android default 100
"horizontalPadding": st_hpadding, // iOS default 16, Android default 50
"verticalPadding": st_vpadding // iOS default 12, Android default 30

}
},
// implement the success callback
function(result) {
    ToastMessage = result["event"];
        if (result && result["event"]) {

    if(result["event"] == 'hide')
            {
                ToastRuntime.trigger(cr.plugins_.locke_cordova_toast.prototype.cnds.OnToast, ToastInst);
            }
            else if(result["event"] == 'touch')
            {
            ToastRuntime.trigger(cr.plugins_.locke_cordova_toast.prototype.cnds.OnToastTouch, ToastInst);
          }
  }


},function(result1){
  ToastMessage = result1;
    ToastRuntime.trigger(cr.plugins_.locke_cordova_toast.prototype.cnds.OnToastFail, ToastInst);
}

);
};

@frcol
Copy link

frcol commented Jun 22, 2016

Same problem here.

@lantonello
Copy link

Me too

@EddyVerbruggen
Copy link
Owner

Please add some useful info. Android device/ version at the very least

@lantonello
Copy link

Sorry Eddy,

For me, the touch callback triggers only in Android 5.1. Does not work in Android 4.4, 5.0 and 6.0
The callback also triggers on iOS.
When toast appears on screen, the callback is triggered with result as a String, not an object.

(sorry for my bad english)

@rodrigodobbin
Copy link

rodrigodobbin commented Jun 29, 2016

Same here,

The versions is the same as @lantonello.

my callback:

// implement the success callback
function(result) {
    console.log(result);
    if (result && result.event) {
        ...My code goes here
    }
}

Problem is: the result parameter is return a "OK" string, then we can't capture the result.event when the user touch the screen.

@EddyVerbruggen
Copy link
Owner

Let me try to make time for this tomorrow.

@EddyVerbruggen EddyVerbruggen self-assigned this Jun 29, 2016
@EddyVerbruggen
Copy link
Owner

EddyVerbruggen commented Jun 30, 2016

Before digging into this deeper I really need to confirm something with you. I've installed cordova-plugin-x-toast (mind the x) and threw a button on a vanilla Cordova CLI app which triggers this code:

  function tap() {
     window.plugins.toast.showWithOptions(
      {
        message: "hey there",
        duration: 1500, // ms
        position: "bottom",
        addPixelsY: -40,  // (optional) added a negative value to move it up a bit (default 0)
        data: {'foo':'bar'} // (optional) pass in a JSON object here (it will be sent back in the success callback below)
      },
      // implement the success callback
      function(result) {
        if (result && result.event) {
          console.log("The toast was tapped or got hidden, see the value of result.event");
          console.log("Event: " + result.event); // "touch" when the toast was touched by the user or "hide" when the toast geot hidden
          console.log("Message: " + result.message); // will be equal to the message you passed in
          console.log("data.foo: " + result.data.foo); // .. retrieve passed in data here

          if (result.event === 'hide') {
            console.log("The toast has been shown");
          }
        }
      }
    );
  }

On my KitKat (4.4) device this gives me this (expected) output in the console when tapping the toast:

[INFO:CONSOLE(35)] "The toast was tapped or got hidden, see the value of result.event", source: file:///android_asset/www/index.html (35)
[INFO:CONSOLE(36)] "Event: touch", source: file:///android_asset/www/index.html (36)
[INFO:CONSOLE(37)] "Message: hey there", source: file:///android_asset/www/index.html (37)
[INFO:CONSOLE(38)] "data.foo: bar", source: file:///android_asset/www/index.html (38)

What's different in your setups that you don't see this?

@frcol
Copy link

frcol commented Jun 30, 2016

In my case, I´m using in an Ionic 1 project.
I have a service with:

function ToastService($cordovaToast) {
        return {
            showToast: function(message, duration = 'short', location = 'bottom') {
                $cordovaToast.show(message, duration, location)
                .then(function(result) {
                    console.log("result: "+result);
                    return;
                }, function (error) {
                    console.log("The toast was not shown due to " + error);
                    return;
                });
            }
        }
    };

and the log always shows an "OK" string.

@EddyVerbruggen
Copy link
Owner

@frcol Which plugin version are you using and do you have the same problem if you remove ngCordova from the equation? So replacing $cordovaToast.show by my snippet above?

@ds8k
Copy link

ds8k commented Sep 14, 2016

I'm experiencing the same problem on a Samsung Galaxy S6 running Android 5.1.1, as well as an S7 Edge on 6.0.1.

However I'm not experiencing this on a Galaxy Avant running 4.4.2 or a Nexus 6P on 7.0. Coincidentally, these are the same devices that have an issue with #95

@EddyVerbruggen
Copy link
Owner

I don't have a S6 or S7 so can't help here..

@jbasinger
Copy link

I have an S4 with 5.0.1 and tapping the toast does nothing =(

@shogunfighter
Copy link

shogunfighter commented Sep 8, 2017

I have the same problem, the touch event is not coming out for s7 edge.

So i tinkered in the Toast.java file for ANDROIDE located in:
<app>/platforms/android/src/nl/xservices/plugins/Toast.java

I commented this entire line:

if (IS_AT_LEAST_LOLLIPOP) {
getViewGroup().setOnTouchListener(new View.OnTouchListener() {
  @Override
  public boolean onTouch(View view, MotionEvent motionEvent) {
	if (motionEvent.getAction() != MotionEvent.ACTION_DOWN) {
	  return false;
	}
	if (mostRecentToast == null || !mostRecentToast.getView().isShown()) {
	  getViewGroup().setOnTouchListener(null);
	  return false;
	}

	float w = mostRecentToast.getView().getWidth();
	float startX = (view.getWidth() / 2) - (w / 2);
	float endX = (view.getWidth() / 2) + (w / 2);

	float startY;
	float endY;

	float g = mostRecentToast.getGravity();
	float y = mostRecentToast.getYOffset();
	float h = mostRecentToast.getView().getHeight();

	if (g == GRAVITY_BOTTOM) {
	  startY = view.getHeight() - y - h;
	  endY = view.getHeight() - y;
	} else if (g == GRAVITY_CENTER) {
	  startY = (view.getHeight() / 2) + y - (h / 2);
	  endY = (view.getHeight() / 2) + y + (h / 2);
	} else {
	  // top
	  startY = y;
	  endY = y + h;
	}

	float tapX = motionEvent.getX();
	float tapY = motionEvent.getY();

	final boolean tapped = tapX >= startX && tapX <= endX &&
		tapY >= startY && tapY <= endY;

	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", msg, data, callbackContext);
  }
});
}

Replaced it with this:

toast.getView().setOnTouchListener(new View.OnTouchListener() {
  @Override
  public boolean onTouch(View view, MotionEvent motionEvent) {
	toast.cancel(); //new code
	return motionEvent.getAction() == MotionEvent.ACTION_DOWN && returnTapEvent("touch", msg, data, callbackContext);
  }
});

Now, I can receive the touch event.

@rafaellop
Copy link

Another observation: #93 (comment)

@elewin
Copy link

elewin commented Aug 7, 2019

I am having a similar issue where on some android (8 and 9) phones, the result from the callback after touching the toast has event set to "hide" instead of "touch", though seems to work properly on iOS

@gabriele-sacchi
Copy link

Same issue here on multiple Android devices.

The touch event is correctly received in a Pixel_2_API_R emulator but that's not the case for some physical devices (eg. Galaxy S9).

This issue is blocking my release to production 😿

@gabriele-sacchi
Copy link

( Same issue as #80 )

@gabriele-sacchi
Copy link

gabriele-sacchi commented Jul 14, 2020

shogunfighter's suggestion above did the trick for me 👍

PS. but introduced the same issue on other devices 😩

Trying to use both handlers for > lollipop + a workaround on the JS side..

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

12 participants