UNPKG

ns-permissions

Version:
261 lines 12 kB
import { Application, ApplicationSettings, AndroidApplication } from '@nativescript/core'; export * from './common'; export const permissionTypes = { get location() { return android.Manifest.permission.ACCESS_FINE_LOCATION; }, get camera() { return android.Manifest.permission.CAMERA; }, get microphone() { return android.Manifest.permission.RECORD_AUDIO; }, get contacts() { return android.Manifest.permission.READ_CONTACTS; }, get event() { return android.Manifest.permission.READ_CALENDAR; }, get storage() { return android.Manifest.permission.READ_EXTERNAL_STORAGE; }, get photo() { return android.Manifest.permission.WRITE_EXTERNAL_STORAGE; }, get callPhone() { return android.Manifest.permission.CALL_PHONE; }, get readSms() { return android.Manifest.permission.READ_SMS; }, get receiveSms() { return android.Manifest.permission.RECEIVE_SMS; } }; const STORAGE_KEY = '@NSPermissions:didAskPermission:'; const setDidAskOnce = (permission) => Promise.resolve().then(() => ApplicationSettings.setBoolean(STORAGE_KEY + permission, true)); const getDidAskOnce = (permission) => Promise.resolve(!!ApplicationSettings.getBoolean(STORAGE_KEY + permission)); export var PermissionStatus; (function (PermissionStatus) { PermissionStatus["GRANTED"] = "authorized"; PermissionStatus["DENIED"] = "denied"; PermissionStatus["NEVER_ASK_AGAIN"] = "never_ask_again"; })(PermissionStatus || (PermissionStatus = {})); export var PermissionsAndroid; (function (PermissionsAndroid) { /** * Returns a promise resolving to a boolean value as to whether the specified * permissions has been granted * * See https://facebook.github.io/react-native/docs/permissionsandroid.html#check */ function check(permission) { const context = Application.android.foregroundActivity || Application.android.startActivity; if (android.os.Build.VERSION.SDK_INT < 23) { return Promise.resolve(context.checkPermission(permission, android.os.Process.myPid(), android.os.Process.myUid()) === android.content.pm.PackageManager.PERMISSION_GRANTED); } return Promise.resolve(context.checkSelfPermission(permission) === android.content.pm.PackageManager.PERMISSION_GRANTED); } PermissionsAndroid.check = check; function hasPermission(permission) { const context = Application.android.foregroundActivity || Application.android.startActivity; if (android.os.Build.VERSION.SDK_INT < 23) { return context.checkPermission(permission, android.os.Process.myPid(), android.os.Process.myUid()) === android.content.pm.PackageManager.PERMISSION_GRANTED; } return context.checkSelfPermission(permission) === android.content.pm.PackageManager.PERMISSION_GRANTED; } PermissionsAndroid.hasPermission = hasPermission; /** * Prompts the user to enable a permission and returns a promise resolving to a * string value indicating whether the user allowed or denied the request * * See https://facebook.github.io/react-native/docs/permissionsandroid.html#request */ async function request(permission, rationale) { // if (rationale) { // const shouldShowRationale = await shouldShowRequestPermissionRationale(permission); // if (shouldShowRationale) { // return new Promise((resolve, reject) => { // NativeModules.DialogManagerAndroid.showAlert(rationale, () => reject(new Error('Error showing rationale')), () => resolve(requestPermission(permission))); // }); // } // } return requestPermission(permission); } PermissionsAndroid.request = request; /** * Prompts the user to enable multiple permissions in the same dialog and * returns an object with the permissions as keys and strings as values * indicating whether the user allowed or denied the request * * See https://facebook.github.io/react-native/docs/permissionsandroid.html#requestPermissions */ function requestPermissions(permissions) { return requestMultiplePermissions(permissions); } PermissionsAndroid.requestPermissions = requestPermissions; })(PermissionsAndroid || (PermissionsAndroid = {})); let mRequestCode = 0; function requestPermission(permission) { const activity = Application.android.foregroundActivity || Application.android.startActivity; if (android.os.Build.VERSION.SDK_INT < 23) { return Promise.resolve(activity.checkPermission(permission, android.os.Process.myPid(), android.os.Process.myUid()) === android.content.pm.PackageManager.PERMISSION_GRANTED ? PermissionStatus.GRANTED : PermissionStatus.DENIED); } if (activity.checkSelfPermission(permission) === android.content.pm.PackageManager.PERMISSION_GRANTED) { return Promise.resolve(PermissionStatus.GRANTED); } return new Promise((resolve, reject) => { try { const requestCode = mRequestCode++; activity.requestPermissions([permission], requestCode); Application.android.on(AndroidApplication.activityRequestPermissionsEvent, (args) => { if (args.requestCode === requestCode) { if (args.grantResults.length > 0 && args.grantResults[0] === android.content.pm.PackageManager.PERMISSION_GRANTED) { resolve(PermissionStatus.GRANTED); } else { if (activity.shouldShowRequestPermissionRationale(permission)) { resolve(PermissionStatus.DENIED); } else { resolve(PermissionStatus.NEVER_ASK_AGAIN); } } } }); } catch (e) { reject(e); } }); } function requestMultiplePermissions(permissions) { const grantedPermissions = {}; const permissionsToCheck = []; let checkedPermissionsCount = 0; const context = Application.android.foregroundActivity || Application.android.startActivity; for (let i = 0; i < permissions.length; i++) { const perm = permissions[i]; if (android.os.Build.VERSION.SDK_INT < 23) { grantedPermissions[perm] = context.checkPermission(perm, android.os.Process.myPid(), android.os.Process.myUid()) === android.content.pm.PackageManager.PERMISSION_GRANTED ? PermissionStatus.GRANTED : PermissionStatus.DENIED; checkedPermissionsCount++; } else if (context.checkSelfPermission(perm) === android.content.pm.PackageManager.PERMISSION_GRANTED) { grantedPermissions[perm] = PermissionStatus.GRANTED; checkedPermissionsCount++; } else { permissionsToCheck.push(perm); } } if (permissions.length === checkedPermissionsCount) { return Promise.resolve(grantedPermissions); } const activity = Application.android.foregroundActivity || Application.android.startActivity; return new Promise((resolve, reject) => { try { const requestCode = mRequestCode++; activity.requestPermissions(permissionsToCheck, requestCode); Application.android.on(AndroidApplication.activityRequestPermissionsEvent, (args) => { if (args.requestCode === requestCode) { const results = args.grantResults; for (let j = 0; j < permissionsToCheck.length; j++) { const permission = permissionsToCheck[j]; if (results.length > j && results[j] === android.content.pm.PackageManager.PERMISSION_GRANTED) { grantedPermissions[permission] = PermissionStatus.GRANTED; } else { if (activity.shouldShowRequestPermissionRationale(permission)) { grantedPermissions[permission] = PermissionStatus.DENIED; } else { grantedPermissions[permission] = PermissionStatus.NEVER_ASK_AGAIN; } } } resolve(grantedPermissions); } // if (args.grantResults.length > 0 && args.grantResults[0] === android.content.pm.PackageManager.PERMISSION_GRANTED) { // resolve(PermissionStatus.GRANTED); // } else { // if (activity.shouldShowRequestPermissionRationale(permission)) { // resolve(PermissionStatus.DENIED); // } else { // resolve(PermissionStatus.NEVER_ASK_AGAIN); // } // } }); } catch (e) { reject(e); } }); } function shouldShowRequestPermissionRationale(permission) { if (android.os.Build.VERSION.SDK_INT < 23) { return Promise.resolve(false); } const activity = Application.android.foregroundActivity || Application.android.startActivity; try { return Promise.resolve(activity.shouldShowRequestPermissionRationale(permission)); } catch (e) { return Promise.reject(e); } } export function canOpenSettings() { return Promise.resolve(false); } export function openSettings() { return Promise.reject(new Error("'openSettings' is deprecated on android")); } export function getTypes() { return Object.keys(permissionTypes); } export function check(aPermission, options) { const permission = permissionTypes[aPermission] ? permissionTypes[aPermission] : aPermission.toString(); return PermissionsAndroid.check(permission).then(isAuthorized => { if (isAuthorized) { return Promise.resolve(['authorized', true]); } return getDidAskOnce(permission).then(didAsk => { if (didAsk) { return shouldShowRequestPermissionRationale(permission).then(shouldShow => [shouldShow ? 'denied' : 'restricted', true]); } return Promise.resolve(['undetermined', true]); }); }); } export function hasPermission(aPermission) { const permission = permissionTypes[aPermission] ? permissionTypes[aPermission] : aPermission.toString(); return PermissionsAndroid.hasPermission(permission); } export function request(aPermission, options) { const permission = permissionTypes[aPermission] ? permissionTypes[aPermission] : aPermission.toString(); const rationale = typeof options === 'string' ? undefined : options && options.rationale; return PermissionsAndroid.request(permission, rationale).then(result => { // PermissionsAndroid.request() to native module resolves to boolean // rather than string if running on OS version prior to Android M if (typeof result === 'boolean') { return [result ? 'authorized' : 'denied', true]; } return setDidAskOnce(permission).then(() => [result, true]); }); } export function requestPermissions(permissions) { const requestPermissions = new Set(permissions.map(p => permissionTypes[p] ? permissionTypes[p] : p.toString())); return requestMultiplePermissions(Array.from(requestPermissions)); } export function checkPermissions(permissions) { return Promise.all(permissions.map(permission => check(permission))).then(result => result.reduce((acc, value, index) => { const name = permissions[index]; acc[name] = value; return acc; }, {})); } //# sourceMappingURL=index.android.js.map