// this function accepts a callback function as params.callback that will be called with the command results // if a callback is not provided it returns a promise that will resolve with the command results function addCommandCallback(command, params, persistCallback) { if(params && (params.callback || params.callbackFunction)){ // execute command with provided callback function addCommand(command, params, persistCallback); } else { // create a temporary function and return a promise that executes command var tempFunctionName = '_gonative_temp_' + Math.random().toString(36).slice(2); if(!params) params = {}; params.callback = tempFunctionName; return new Promise(function(resolve, reject) { // declare a temporary function window[tempFunctionName] = function(data) { resolve(data); delete window[tempFunctionName]; } // execute command addCommand(command, params); }); } } function addCallbackFunction(callbackFunction, persistCallback){ var callbackName; if(typeof callbackFunction === 'string'){ callbackName = callbackFunction; } else { callbackName = '_gonative_temp_' + Math.random().toString(36).slice(2); window[callbackName] = function(...args) { callbackFunction.apply(null, args); if(!persistCallback){ // if callback is used just once delete window[callbackName]; } } } return callbackName; } function addCommand(command, params, persistCallback){ var data = undefined; if(params) { var commandObject = {}; if(params.callback && typeof params.callback === 'function'){ params.callback = addCallbackFunction(params.callback, persistCallback); } if(params.callbackFunction && typeof params.callbackFunction === 'function'){ params.callbackFunction = addCallbackFunction(params.callbackFunction, persistCallback); } if(params.statuscallback && typeof params.statuscallback === 'function'){ params.statuscallback = addCallbackFunction(params.statuscallback, persistCallback); } commandObject.gonativeCommand = command; commandObject.data = params; data = JSON.stringify(commandObject); } else data = command; JSBridge.postMessage(data); } /////////////////////////////// //// General Commands //// /////////////////////////////// var gonative = {}; // to be modified as required gonative.nativebridge = { custom: function (params){ addCommand("gonative://nativebridge/custom", params); }, multi: function (params){ addCommand("gonative://nativebridge/multi", params); } }; gonative.registration = { send: function(customData){ var params = {customData: customData}; addCommand("gonative://registration/send", params); } }; gonative.sidebar = { setItems: function (params){ addCommand("gonative://sidebar/setItems", params); }, getItems: function (params){ return addCommandCallback("gonative://sidebar/getItems", params); } }; gonative.tabNavigation = { selectTab: function (tabIndex){ addCommand("gonative://tabs/select/" + tabIndex); }, deselect: function (){ addCommand("gonative://tabs/deselect"); }, setTabs: function (tabsObject){ var params = {tabs: tabsObject}; addCommand("gonative://tabs/setTabs", params); } }; gonative.share = { sharePage: function (params){ addCommand("gonative://share/sharePage", params); }, downloadFile: function (params){ addCommand("gonative://share/downloadFile", params); }, downloadImage: function(params){ addCommand("gonative://share/downloadImage", params); } }; gonative.open = { appSettings: function (){ addCommand("gonative://open/app-settings"); } }; gonative.webview = { clearCache: function(){ addCommand("gonative://webview/clearCache"); }, clearCookies: function(){ addCommand("gonative://webview/clearCookies"); }, reload: function (){ addCommand("gonative://webview/reload"); } }; gonative.config = { set: function(params){ addCommand("gonative://config/set", params); } }; gonative.navigationTitles = { set: function (parameters){ var params = { persist: parameters.persist, data: parameters }; addCommand("gonative://navigationTitles/set", params); }, setCurrent: function (params){ addCommand("gonative://navigationTitles/setCurrent", params); }, revert: function(){ addCommand("gonative://navigationTitles/set?persist=true"); } }; gonative.navigationLevels = { set: function (parameters){ var params = { persist: parameters.persist, data: parameters }; addCommand("gonative://navigationLevels/set", params); }, setCurrent: function(params){ addCommand("gonative://navigationLevels/set", params); }, revert: function(){ addCommand("gonative://navigationLevels/set?persist=true"); } }; gonative.statusbar = { set: function (params){ addCommand("gonative://statusbar/set", params); } }; gonative.screen = { setBrightness: function(data){ var params = data; if(typeof params === 'number'){ params = {brightness: data}; } addCommand("gonative://screen/setBrightness", params); }, setMode: function(params) { if (params.mode) { addCommand("gonative://screen/setMode", params); } } }; gonative.navigationMaxWindows = { set: function (maxWindows, autoClose){ var params = { data: maxWindows, autoClose: autoClose, persist: true }; addCommand("gonative://navigationMaxWindows/set", params); }, setCurrent: function(maxWindows, autoClose){ var params = {data: maxWindows, autoClose: autoClose}; addCommand("gonative://navigationMaxWindows/set", params); } } gonative.window = { open: function (urlString) { var params = {url: urlString}; addCommand("gonative://window/open", params); }, close: function () { addCommand("gonative://window/close"); } } gonative.connectivity = { get: function (params){ return addCommandCallback("gonative://connectivity/get", params); }, subscribe: function (params){ return addCommandCallback("gonative://connectivity/subscribe", params, true); }, unsubscribe: function (){ addCommand("gonative://connectivity/unsubscribe"); } }; gonative.run = { deviceInfo: function(){ addCommand("gonative://run/gonative_device_info"); } }; gonative.deviceInfo = function(params){ return addCommandCallback("gonative://run/gonative_device_info", params, true); }; gonative.internalExternal = { set: function(params){ addCommand("gonative://internalExternal/set", params); } }; gonative.clipboard = { set: function(params){ addCommand("gonative://clipboard/set", params); }, get: function(params){ return addCommandCallback("gonative://clipboard/get", params); } }; gonative.keyboard = { info: function(params){ return addCommandCallback("gonative://keyboard/info", params); }, listen: function(callback){ var params = {callback}; addCommand("gonative://keyboard/listen", params); } }; ////////////////////////////////////// //// Webpage Helper Functions //// ////////////////////////////////////// function gonative_match_statusbar_to_body_background_color() { let rgb = window.getComputedStyle(document.body, null).getPropertyValue('background-color'); let sep = rgb.indexOf(",") > -1 ? "," : " "; rgb = rgb.substring(rgb.indexOf('(')+1).split(")")[0].split(sep).map(function(x) { return x * 1; }); if(rgb.length === 4){ rgb = rgb.map(function(x){ return parseInt(x * rgb[3]); }) } let hex = '#' + rgb[0].toString(16).padStart(2,'0') + rgb[1].toString(16).padStart(2,'0') + rgb[2].toString(16).padStart(2,'0'); let luma = 0.2126 * rgb[0] + 0.7152 * rgb[1] + 0.0722 * rgb[2]; // per ITU-R BT.709 if(luma > 40){ gonative.statusbar.set({'style': 'dark', 'color': hex}); } else{ gonative.statusbar.set({'style': 'light', 'color': hex}); } } /////////////////////////////// //// Android Exclusive //// /////////////////////////////// gonative.android = {}; gonative.android.geoLocation = { promptLocationServices: function(){ addCommand("gonative://geoLocation/promptLocationServices"); }, isLocationServicesEnabled: function(params) { return addCommandCallback("gonative://geoLocation/isLocationServicesEnabled", params); } }; gonative.android.screen = { fullscreen: function(){ addCommand("gonative://screen/fullscreen"); }, normal: function(){ addCommand("gonative://screen/normal"); }, keepScreenOn: function(){ addCommand("gonative://screen/keepScreenOn"); }, keepScreenNormal: function(){ addCommand("gonative://screen/keepScreenNormal"); } }; gonative.android.audio = { requestFocus: function(enabled){ var params = {enabled: enabled}; addCommand("gonative://audio/requestFocus", params); } }; gonative.android.swipeGestures = { enable: function() { addCommand("gonative://swipeGestures/enable"); }, disable: function() { addCommand("gonative://swipeGestures/disable"); } }