mirror of
https://github.com/NativeScript/NativeScript.git
synced 2025-11-05 13:26:48 +08:00
chore: permission cleanup wip
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
import { AndroidActivityRequestPermissionsEventData, AndroidApplication, Application, Trace, ApplicationSettings } from '@nativescript/core';
|
import { AndroidActivityRequestPermissionsEventData, AndroidApplication, Application, Trace, ApplicationSettings } from '@nativescript/core';
|
||||||
import { PermissionStatus } from './common';
|
import { PermissionStatus } from './common';
|
||||||
import { PermissionCheckOptions, PermissionsType, PermissionRationale, PermissionRequestOptions } from '.';
|
import { PermissionCheckOptions, PermissionsType, PermissionRationale, PermissionRequestOptions, PermissionResult } from '.';
|
||||||
|
|
||||||
export * from './common';
|
export * from './common';
|
||||||
|
|
||||||
@@ -23,7 +23,7 @@ function getAndroidActivity() {
|
|||||||
const NativePermissionsTypes: PermissionsType[] = ['location', 'camera', 'mediaLocation', 'microphone', 'contacts', 'event', 'storage', 'photo', 'callPhone', 'readSms', 'receiveSms', 'bluetoothScan', 'bluetoothConnect', 'bluetooth'];
|
const NativePermissionsTypes: PermissionsType[] = ['location', 'camera', 'mediaLocation', 'microphone', 'contacts', 'event', 'storage', 'photo', 'callPhone', 'readSms', 'receiveSms', 'bluetoothScan', 'bluetoothConnect', 'bluetooth'];
|
||||||
type NativePermissionsNames = typeof NativePermissionsTypes; // type Names = readonly ['Mike', 'Jeff', 'Ben']
|
type NativePermissionsNames = typeof NativePermissionsTypes; // type Names = readonly ['Mike', 'Jeff', 'Ben']
|
||||||
type NativePermissions = NativePermissionsNames[number];
|
type NativePermissions = NativePermissionsNames[number];
|
||||||
function getNativePermissions(permission: NativePermissions, options?) {
|
function getNativePermissions(permission: NativePermissions, options?: PermissionCheckOptions | PermissionRequestOptions) {
|
||||||
switch (permission) {
|
switch (permission) {
|
||||||
case 'location': {
|
case 'location': {
|
||||||
const result = [android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.ACCESS_COARSE_LOCATION];
|
const result = [android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.ACCESS_COARSE_LOCATION];
|
||||||
@@ -139,7 +139,7 @@ namespace PermissionsAndroid {
|
|||||||
*
|
*
|
||||||
* See https://facebook.github.io/react-native/docs/permissionsandroid.html#check
|
* See https://facebook.github.io/react-native/docs/permissionsandroid.html#check
|
||||||
*/
|
*/
|
||||||
export async function check(permission: string | string[]) {
|
export async function check(permission: string | string[]): Promise<PermissionResult> {
|
||||||
const context: android.content.Context = getAndroidActivity();
|
const context: android.content.Context = getAndroidActivity();
|
||||||
let result = true;
|
let result = true;
|
||||||
const granted = android.content.pm.PackageManager.PERMISSION_GRANTED;
|
const granted = android.content.pm.PackageManager.PERMISSION_GRANTED;
|
||||||
@@ -160,7 +160,7 @@ namespace PermissionsAndroid {
|
|||||||
*
|
*
|
||||||
* See https://facebook.github.io/react-native/docs/permissionsandroid.html#request
|
* See https://facebook.github.io/react-native/docs/permissionsandroid.html#request
|
||||||
*/
|
*/
|
||||||
export async function request(permission: string, rationale?: PermissionRationale): Promise<PermissionStatus> {
|
export async function request(permission: string, rationale?: PermissionRationale): Promise<PermissionResult> {
|
||||||
// if (rationale) {
|
// if (rationale) {
|
||||||
// const shouldShowRationale = await shouldShowRequestPermissionRationale(permission);
|
// const shouldShowRationale = await shouldShowRequestPermissionRationale(permission);
|
||||||
|
|
||||||
@@ -181,7 +181,7 @@ namespace PermissionsAndroid {
|
|||||||
*
|
*
|
||||||
* See https://facebook.github.io/react-native/docs/permissionsandroid.html#requestmultiple
|
* See https://facebook.github.io/react-native/docs/permissionsandroid.html#requestmultiple
|
||||||
*/
|
*/
|
||||||
export function requestMultiple(permissions: string[]): Promise<{ [permission: string]: PermissionStatus }> {
|
export function requestMultiple(permissions: string[]): Promise<PermissionResult> {
|
||||||
return requestMultiplePermissions(permissions);
|
return requestMultiplePermissions(permissions);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -226,7 +226,7 @@ function requestPermission(permission: string): Promise<PermissionStatus> {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async function requestMultiplePermissions(permissions: string[], options?: PermissionRequestOptions): Promise<{ [permission: string]: PermissionStatus }> {
|
async function requestMultiplePermissions(permissions: string[], options?: PermissionRequestOptions): Promise<PermissionResult> {
|
||||||
const grantedPermissions = {};
|
const grantedPermissions = {};
|
||||||
const permissionsToCheck = [];
|
const permissionsToCheck = [];
|
||||||
let checkedPermissionsCount = 0;
|
let checkedPermissionsCount = 0;
|
||||||
@@ -332,7 +332,7 @@ export class Permissions {
|
|||||||
return NativePermissionsTypes;
|
return NativePermissionsTypes;
|
||||||
}
|
}
|
||||||
|
|
||||||
static async check(permission: PermissionsType, options?: PermissionCheckOptions): Promise<[PermissionStatus, boolean]> {
|
static async check(permission: PermissionsType, options?: PermissionCheckOptions): Promise<PermissionResult> {
|
||||||
if (Trace.isEnabled()) {
|
if (Trace.isEnabled()) {
|
||||||
Trace.write(`check ${permission}`, Trace.categories.Permissions, Trace.messageType.info);
|
Trace.write(`check ${permission}`, Trace.categories.Permissions, Trace.messageType.info);
|
||||||
}
|
}
|
||||||
@@ -365,7 +365,7 @@ export class Permissions {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
static request(permission: PermissionsType | PermissionsType[] | string[], options?: PermissionRequestOptions): Promise<[PermissionStatus, boolean] | { [permission: string]: PermissionStatus }> {
|
static request(permission: PermissionsType | PermissionsType[] | string[], options?: PermissionRequestOptions): Promise<PermissionResult> {
|
||||||
if (Trace.isEnabled()) {
|
if (Trace.isEnabled()) {
|
||||||
Trace.write(`request ${permission}`, Trace.categories.Permissions, Trace.messageType.info);
|
Trace.write(`request ${permission}`, Trace.categories.Permissions, Trace.messageType.info);
|
||||||
}
|
}
|
||||||
|
|||||||
14
packages/permissions/index.d.ts
vendored
14
packages/permissions/index.d.ts
vendored
@@ -1,6 +1,7 @@
|
|||||||
import type { PermissionStatus } from './common';
|
import type { PermissionStatus } from './common';
|
||||||
export * from './common';
|
export * from './common';
|
||||||
export type PermissionsType = 'location' | 'camera' | 'microphone' | 'photo' | 'contacts' | 'event' | 'reminder' | 'bluetooth' | 'bluetoothConnect' | 'bluetoothScan' | 'notification' | 'backgroundRefresh' | 'speechRecognition' | 'mediaLocation' | 'mediaLibrary' | 'motion' | 'storage' | 'callPhone' | 'readSms' | 'receiveSms';
|
export type PermissionsType = 'location' | 'camera' | 'microphone' | 'photo' | 'contacts' | 'event' | 'reminder' | 'bluetooth' | 'bluetoothConnect' | 'bluetoothScan' | 'notification' | 'backgroundRefresh' | 'speechRecognition' | 'mediaLocation' | 'mediaLibrary' | 'motion' | 'storage' | 'callPhone' | 'readSms' | 'receiveSms';
|
||||||
|
|
||||||
export interface PermissionRationale {
|
export interface PermissionRationale {
|
||||||
title: string;
|
title: string;
|
||||||
message: string;
|
message: string;
|
||||||
@@ -8,15 +9,14 @@ export interface PermissionRationale {
|
|||||||
buttonNegative?: string;
|
buttonNegative?: string;
|
||||||
buttonNeutral?: string;
|
buttonNeutral?: string;
|
||||||
}
|
}
|
||||||
export type PermissionCheckOptions = string | { type: string };
|
export type PermissionCheckOptions = { type: 'always' | null | undefined };
|
||||||
export type PermissionRequestOptions = string | { type: string; rationale?: PermissionRationale };
|
export type PermissionRequestOptions = PermissionCheckOptions & { rationale?: PermissionRationale };
|
||||||
export type PermissionResult<T> = T extends any[] ? { [k: string]: PermissionStatus } : [PermissionStatus, boolean];
|
export type PermissionResult = { [k: PermissionsType]: { status: PermissionStatus; nativePermission: Array<string> } };
|
||||||
|
|
||||||
export class Permissions {
|
export class Permissions {
|
||||||
static canOpenSettings(): Promise<boolean>;
|
static canOpenSettings(): Promise<boolean>;
|
||||||
static openSettings(): Promise<boolean>;
|
static openSettings(): Promise<boolean>;
|
||||||
static getTypes(): Permissions[];
|
static getTypes(): Array<PermissionsType>;
|
||||||
static check<T = Permissions>(permission: T, options?: PermissionCheckOptions): Promise<PermissionResult<T>>;
|
static check(permission: Array<PermissionsType> | PermissionsType, options?: PermissionCheckOptions): Promise<PermissionResult>;
|
||||||
static request<T = Permissions | Permissions[] | string[]>(permission: T, options?: PermissionRequestOptions): Promise<PermissionResult<T>>;
|
static request(permission: Array<PermissionsType> | PermissionsType, options?: PermissionRequestOptions): Promise<PermissionResult>;
|
||||||
static checkMultiple<T = Permissions[]>(permissions: T): Promise<PermissionResult<T>>;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -729,15 +729,7 @@ export class Permissions {
|
|||||||
return Promise.resolve([PermissionStatus.authorized, true]);
|
return Promise.resolve([PermissionStatus.authorized, true]);
|
||||||
}
|
}
|
||||||
|
|
||||||
let type: PermissionCheckOptions;
|
return PermissionsIOS.getPermissionStatus(permission, options?.type || DEFAULTS[permission]);
|
||||||
|
|
||||||
if (typeof options === 'string') {
|
|
||||||
type = options;
|
|
||||||
} else if (options && options.type) {
|
|
||||||
type = options.type;
|
|
||||||
}
|
|
||||||
|
|
||||||
return PermissionsIOS.getPermissionStatus(permission, type || DEFAULTS[permission]);
|
|
||||||
}
|
}
|
||||||
static async request<T extends IOSPermissionTypes | IOSPermissionTypes[]>(permission: T, options?: PermissionRequestOptions): Promise<Result<T>> {
|
static async request<T extends IOSPermissionTypes | IOSPermissionTypes[]>(permission: T, options?: PermissionRequestOptions): Promise<Result<T>> {
|
||||||
if (Trace.isEnabled()) {
|
if (Trace.isEnabled()) {
|
||||||
@@ -764,16 +756,8 @@ export class Permissions {
|
|||||||
throw new Error('You cannot request backgroundRefresh');
|
throw new Error('You cannot request backgroundRefresh');
|
||||||
}
|
}
|
||||||
|
|
||||||
let type: PermissionRequestOptions;
|
|
||||||
|
|
||||||
if (typeof options === 'string') {
|
|
||||||
type = options;
|
|
||||||
} else if (options && options.type) {
|
|
||||||
type = options.type;
|
|
||||||
}
|
|
||||||
|
|
||||||
//@ts-ignore
|
//@ts-ignore
|
||||||
return PermissionsIOS.requestPermission(permission, type || DEFAULTS[permission]);
|
return PermissionsIOS.requestPermission(permission, options?.type || DEFAULTS[permission]);
|
||||||
}
|
}
|
||||||
static checkMultiple(permissions: PermissionsType[]) {
|
static checkMultiple(permissions: PermissionsType[]) {
|
||||||
return Promise.all(permissions.map((permission) => Permissions.check(<any>permission))).then((result) =>
|
return Promise.all(permissions.map((permission) => Permissions.check(<any>permission))).then((result) =>
|
||||||
|
|||||||
Reference in New Issue
Block a user