/* * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * */ var screenOrientation = {}; if (!window.OrientationType) { window.OrientationType = { 'portrait-primary': 0, 'portrait-secondary': 180, 'landscape-primary': 90, 'landscape-secondary': -90 }; } if (!window.OrientationLockType) { window.OrientationLockType = { 'portrait-primary': 1, 'portrait-secondary': 2, 'landscape-primary': 4, 'landscape-secondary': 8, 'portrait': 3, // either portrait-primary or portrait-secondary. 'landscape': 12, // either landscape-primary or landscape-secondary. 'any': 15 // All orientations are supported (unlocked orientation) }; } var orientationMask = 1; screenOrientation.setOrientation = function(orientation) { orientationMask = window.OrientationLockType[orientation]; cordova.exec(null, null, "CDVOrientation", "screenOrientation", [orientationMask, orientation]); }; if (!screen.orientation) { screen.orientation = {}; } setOrientationProperties(); function addScreenOrientationApi(screenObject) { if (screenObject.unlock || screenObject.lock) { screenObject.nativeLock = screenObject.lock; } screenObject.lock = function(orientation) { var promiseLock; var p = new Promise(function(resolve, reject) { if (screenObject.nativeLock) { promiseLock = screenObject.nativeLock(orientation); promiseLock.then(function success(res) { resolve(); }, function error(err) { screenObject.nativeLock = null; resolveOrientation(orientation, resolve, reject); }); } else { resolveOrientation(orientation, resolve, reject); } }); return p; }; screenObject.unlock = function() { screenOrientation.setOrientation('any'); }; } function resolveOrientation(orientation, resolve, reject) { if (!OrientationLockType.hasOwnProperty(orientation)) { var err = new Error(); err.name = "NotSupportedError"; reject(err); //"cannot change orientation"); } else { screenOrientation.setOrientation(orientation); resolve("Orientation set"); // orientation change successful } } addScreenOrientationApi(screen.orientation); var onChangeListener = null; Object.defineProperty(screen.orientation, 'onchange', { set: function(listener) { if (onChangeListener) { screen.orientation.removeEventListener('change', onChangeListener); } onChangeListener = listener; if (onChangeListener) { screen.orientation.addEventListener('change', onChangeListener); } }, get: function() { return (onChangeListener ? onChangeListener : null); }, enumerable: true, }); var evtTarget = new XMLHttpRequest(); //document.createElement('div'); var orientationchange = function() { setOrientationProperties(); var event = document.createEvent('Events'); event.initEvent("change", false, false); evtTarget.dispatchEvent(event); }; screen.orientation.addEventListener = function(a,b,c) { return evtTarget.addEventListener(a,b,c); }; screen.orientation.removeEventListener = function(a,b,c) { return evtTarget.removeEventListener(a,b,c); }; function setOrientationProperties() { switch (window.orientation) { case 0: screen.orientation.type = 'portrait-primary'; break; case 90: screen.orientation.type = 'landscape-primary'; break; case 180: screen.orientation.type = 'portrait-secondary'; break; case -90: screen.orientation.type = 'landscape-secondary'; break; default: screen.orientation.type = 'portrait-primary'; break; } screen.orientation.angle = window.orientation || 0; } window.addEventListener("orientationchange", orientationchange, true); module.exports = screenOrientation;