Search code examples
cordovasamsung-smart-tvtelevision

Toast build for orsay not working


I create an application for smart tvs with TOAST project. During the development I test everything with tizen emulator and tizen studio and everything was fine.

After finishing development I tried to run the application on both orsay TV and orsay emulator and unfortunatly there was a lots of issue in that platform. I fixed some issues in design but I can't fix the main issue.

When I run the application, There is a line in console that say : deviceready has not fired after 5 seconds. And I can't use any of the TOAST api functionalities.

I create an empty project and do exactly what this page say: https://github.com/Samsung/cordova-plugin-toast#prepare-to-start

But again I got the same error. Please help me.

Here is the log:

cordova/platform: orsay bootstrap BEGIN cordova.js:1365 adding proxy for NetworkStatus cordova.js:887 adding proxy for Console cordova.js:887 adding proxy for Device cordova.js:887 adding proxy for Globalization cordova.js:887 cordova/platform: orsay bootstrap END cordova.js:1460 adding proxy for toast.inputdevice cordova.js:1880 return Window cordova.js:1880 adding proxy for toast.tvwindow cordova.js:1880 return Window cordova.js:1880 adding proxy for toast.tvchannel cordova.js:1880 adding proxy for toast.tvaudiocontrol cordova.js:1880 adding proxy for toast.drminfo cordova.js:1880 adding proxy for toast.application cordova.js:1880 adding proxy for toast.Media cordova.js:1880 Failed to load resource: fail to read a resource form decryptied file file:///home/smarttv/Apps/xThreeApp/cordova_plugins.js deviceready has not fired after 5 seconds. cordova.js:1880 Channel not fired: onNativeReady cordova.js:1880 Channel not fired: onCordovaReady cordova.js:1880 Channel not fired: onCordovaConnectionReady cordova.js:1880 Channel not fired: onCordovaInfoReady cordova.js:1880

enter image description here

UPDATE:

Ok I just find out two things:

  • when I run the application on the emulator with Debug As/Samsung Smart Tv Emulator the devicereaday won't fired but if I close the app in the emulator and and open it again from the app page in emulator, the deviceready event will work perfect
  • Even with the above trick, when I navigate to the second page, deviceready again won't fire! (Even I tried to navigate to the current page but second attamp will fail to fire the deviceready event)

I tried lots of method to navigating to the second page but all have the same result. (I use methods like window.location.href = url; and window.location.replace(url); and ...)


Solution

  • OK I answer to myself, It was a bug in cordova.js

    To fix this issue, you can change the bootstrap function to the following source code in cordova.js:

    bootstrap: function() {
        console.log('cordova/platform: orsay bootstrap BEGIN');
    
        var modulemapper = require('cordova/modulemapper');
        var channel = require('cordova/channel');
        var SEF = require('cordova/plugin/SEF');
        var isWebapisLoaded = false;
        var isOnShowEventFire = false;
    
        modulemapper.clobbers('cordova/exec/proxy', 'cordova.commandProxy');
    
        var fireNativeReadyEvent = function() {
            if(isWebapisLoaded && isOnShowEventFire) {
                channel.onNativeReady.fire();
            }
        };
    
        for (var k in define.moduleMap) {
            if (/cordova.*\/proxy/.exec(k)) {
                require(k);
            }
            if (/cordova.*\/symbols/.exec(k)) {
                require(k);
            }
        }
    
        var head = document.getElementsByTagName('head')[0];
        var script = document.createElement('script');
        script.type = 'text/javascript';
        script.src = '$MANAGER_WIDGET/Common/webapi/1.0/webapis.js';
        script.onload = function() {
            isWebapisLoaded = true;
            fireNativeReadyEvent();
            require('cordova/plugin/ime-via-input');
        };
        head.appendChild(script);
    
        window.onPause = function () {
            channel.onPause.fire();
        };
    
        window.onResume = function () {
            channel.onResume.fire();
        };
    
        window.onHide = function() {
            localStorage.clear();
        };
    
        window.addEventListener('load', function () {
            var AppCommonPlugin = null;
            var NNaviPlugin = null;
    
            window.onShow = function () {
                localStorage.setItem('showEventFlag', 'true');
                settingInfo();
            };
    
            if(localStorage.getItem('showEventFlag') == 'true') {
                settingInfo();
            }
    
            if(window.curWidget && typeof window.curWidget.setPreference == 'function') {
                console.log('window.curWidget');
                window.curWidget.setPreference('ready', 'true');
            }
        });
    
        window.addEventListener('unload', function () {
            SEF.close();
        });
    
        window.addEventListener('keydown', function (e) {
            switch(e.keyCode) {
                case 88: // RETURN key
                    // default action disabled.
                    // Calling 'setPreference('return', 'true')' is needed explicitly to exit the application
                    e.preventDefault();
                    break;
                case 45: // EXIT key
                    // NOTHING to prevent.
                    break;
            }
        });
    
        function settingInfo() {
            try {
                AppCommonPlugin = SEF.get('AppCommon');
            }
            catch(e) {
                Error(e);
            }
            AppCommonPlugin.Execute('UnregisterAllKey');
            AppCommonPlugin.Execute('RegisterKey',29460); //up
            AppCommonPlugin.Execute('RegisterKey',29461); //down
            AppCommonPlugin.Execute('RegisterKey',4); //left
            AppCommonPlugin.Execute('RegisterKey',5); //right
            AppCommonPlugin.Execute('RegisterKey',29443); //enter
            AppCommonPlugin.Execute('RegisterKey',88); // return
    
            try {
                NNaviPlugin = SEF.get('NNavi');
            }
            catch(e) {
                Error(e);
            }
    
            NNaviPlugin.Execute('SetBannerState',2);
            isOnShowEventFire = true;
            fireNativeReadyEvent();
        }
    
        // End of bootstrap
        console.log('cordova/platform: orsay bootstrap END');
    }