angularjscordova-3ionic-framework

Cordova backbutton preventDefault is not working


I have application which is done using ionicframework and cordova. In my app i have requirement that if user pressed back button then i need to ignore it. But only after user pressed it third time it should close app.

Previously project was done using phonegap and jquery and same code works. I did small workaround when i am throwing an exception then it app was not closed when it should not.

 document.addEventListener("backbutton", function (e) {
        if (new Date() - firstDateClick > 1000) {
            firstDateClick = new Date();
            totalClicks = 1;
        } else {
            totalClicks++;
            if (totalClicks >= 3) {
                var answer = confirm('Are You Sure You Want Exit');
                if (answer) {
                    var service = angular.injector(['ng', 'starter.services']).get('DanceService');
                    service.logEvent("exit")
                        .then(function () {
                            alert('exit1')
                            if (navigator.app) {
                                navigator.app.exitApp();
                            }
                            else if (navigator.device) {
                                navigator.device.exitApp();
                            }

                        })
                } else {
                    totalClicks = 1;
                }
            }
        }
        throw "ignore"
    });

But i dont like idea to throw exception.


Solution

  • i made two times control before log out from the app. So the user can press one time and a toast will appear with the text "press again to exit" and the second press -> log out.

    This is my service:

        var deregisterFunction = null;
    
        return {
            disableBack: disableBack,
            registerAction: registerAction,
            goHome: goHome,
            goBack: goBack,
            deregisterAction: deregisterAction,
            closeApp: closeApp
        };
    
        function disableBack() {
            deregisterFunction = angular.copy($ionicPlatform.registerBackButtonAction(null, 101));
        }
    
        function registerAction(cb, priority) {
            deregisterFunction = angular.copy($ionicPlatform.registerBackButtonAction(cb, priority));
        }
    
        function deregisterAction() {
            if (deregisterFunction) {
                deregisterFunction();
            }
            goBack();//default behaviour
        }
    
        function goHome() {
            deregisterFunction = angular.copy($ionicPlatform.registerBackButtonAction(function() {
                $state.go('app.home');
            }, 101));
        }
    
        function goBack() {
            deregisterFunction = angular.copy($ionicPlatform.registerBackButtonAction(function() {
                $ionicHistory.goBack();
            }, 101));
        }
    
        function closeApp() {
            deregisterFunction = angular.copy($ionicPlatform.registerBackButtonAction(function() {
                ionic.Platform.exitApp();
            }, 101));
        }
    

    And this my utils service:

        var service = {
          logoutToast: logoutToast,
          resetToastCount: resetToastCount
        };
    
        var toastCount = 0;
    
        return service;
    
        function resetToastCount() {
          toastCount = 0;
        }
    
        function logoutToast() {
          switch (toastCount) {
            case 0:
              $cordovaToast.show('Press again to log out', 'short', 'bottom');
              toastCount++;
              break;
            case 1:
              toastCount = 0;
              //logout
              break;
            default:
              $cordovaToast.show('Error', 'short', 'bottom');
          }
        }
    
    }
    }());
    

    So in my controller i have this for register the action of my service:

    $scope.$on('$ionicView.afterEnter', backButtonService.registerAction(utils.logoutToast, 101));
    

    This for reset the count where i want:

    $scope.$on('$ionicView.afterEnter', utils.resetToastCount());
    

    And this for deregister my action when i navigate:

    $scope.$on('$stateChangeStart', backButtonService.deregisterAction);
    

    Hope this will helps you :)