Search code examples
javascriptandroidcordovainappbrowser

cordova inAppBrowser "Before Exit" event


I have a cordova (android) app with window popout using window.open javascript that override with cordova inAppBrowser when device is ready refer to the code below:

 document.addEventListener("deviceready", onDeviceReady, false);
 function onDeviceReady() {
    window.open = cordova.InAppBrowser.open;
}

Then i want to set an event when user press phone back button or press "x" button to close the popout a dialog will pop out and asked "Are you sure? Y/N" before closing window popout. The code look like this:

var newwindow;
newwindow = window.open('something', '_self ', 'location=no'); 
newwindow.addEventListener('exit', function(event){ Exit() });
 function Exit(){
              navigator.notification.confirm(
                'Are you sure?',  
                function(i){
                    if(i==2)
                     {
                      //exit the window popout
                     }
                },              
                'App Name',            
                'Cancel,Exit'          
              );

But it doesn't work as i wanted, the popout window closed then dialog is prompt to user...How can i show a dialog and decides whether to close popout window.

Note: Sorry for bad grammar, i try my best to explain my problem.


Solution

  • I have found a fairly easy solution (android) for simple prompt like "Are you sure" "yes/no?" by editing the inappbrowser.dialog.java file. This solution is only prompting for confirmation before closing inappbrowser, which is suitable for my case.

    Modify the java file InAppBrowserDialog.java in this location:

    [your cordova project]/platforms/android/src/org/apache/cordova/inappbrowser/
    
    1. ADD REQUIRED IMPORTS: import android.content.DialogInterface;

    2. MODIFY THE onBackPressed() FUNCTION

    FROM:

    public void onBackPressed () {
        if (this.inAppBrowser == null) {
            this.dismiss();
        } else {
            // better to go through the in inAppBrowser
            // because it does a clean up
            if (this.inAppBrowser.hardwareBack() && this.inAppBrowser.canGoBack()) {
                this.inAppBrowser.goBack();
            }  else {
                this.inAppBrowser.closeDialog();
            }
        }
    }
    

    TO:

    public void onBackPressed() {
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context)
            .setTitle("Exit")
            .setMessage("You are about to exit, are you sure?")
            .setPositiveButton("Exit", new DialogInterface.OnClickListener(){
                public void onClick(DialogInterface dialog, int which){
                    if (inAppBrowser == null) {
                        dismiss();
                    } 
                    else {
                        // better to go through the in inAppBrowser
                        // because it does a clean up
                        if (inAppBrowser.hardwareBack() && inAppBrowser.canGoBack()) {
                            inAppBrowser.goBack();
                        }  else {
                            inAppBrowser.closeDialog();
                        }
                    }
                }
            })
            .setNegativeButton("Cancel", new DialogInterface.OnClickListener(){
                public void onClick(DialogInterface dialog,int which){
                    dialog.cancel();
                }
            });
            alertDialogBuilder.create();
            alertDialogBuilder.show();
    }
    

    I basically just create an alert dialog on top of checking for inappbrowser when back button is pressed.