feat(android): support for Rationale (#2110) (#2206)

depracate permissionDialogTitle and permissionDialogMessage
add new props: androidCameraPermissionOptions and androidRecordAudioPermissionOptions
add functionality: when depracated parameters are provided, they are used instead of new ones (and the warning message is set).
This commit is contained in:
Kacper Kula 2019-04-14 12:46:30 +01:00 committed by Sibelius Seraphini
parent 1a164fa537
commit e564648b7c
2 changed files with 85 additions and 17 deletions

View File

@ -22,8 +22,18 @@ class BadInstagramCloneApp extends Component {
style={styles.preview}
type={RNCamera.Constants.Type.back}
flashMode={RNCamera.Constants.FlashMode.on}
permissionDialogTitle={'Permission to use camera'}
permissionDialogMessage={'We need your permission to use your camera phone'}
androidCameraPermissionOptions={{
title: 'Permission to use camera',
message: 'We need your permission to use your camera',
buttonPositive: 'Ok',
buttonNegative: 'Cancel',
}}
androidRecordAudioPermissionOptions={{
title: 'Permission to use audio recording',
message: 'We need your permission to use your audio',
buttonPositive: 'Ok',
buttonNegative: 'Cancel',
}}
onGoogleVisionBarcodesDetected={({ barcodes }) => {
console.log(barcodes);
}}
@ -102,8 +112,18 @@ class App extends Component {
style={styles.preview}
type={RNCamera.Constants.Type.back}
flashMode={RNCamera.Constants.FlashMode.on}
permissionDialogTitle={'Permission to use camera'}
permissionDialogMessage={'We need your permission to use your camera phone'}
androidCameraPermissionOptions={{
title: 'Permission to use camera',
message: 'We need your permission to use your camera',
buttonPositive: 'Ok',
buttonNegative: 'Cancel',
}}
androidRecordAudioPermissionOptions={{
title: 'Permission to use audio recording',
message: 'We need your permission to use your audio',
buttonPositive: 'Ok',
buttonNegative: 'Cancel',
}}
>
{({ camera, status, recordAudioPermissionStatus }) => {
if (status !== 'READY') return <PendingView />;
@ -245,14 +265,22 @@ Value: float from `0` to `1.0`
Specifies the zoom of your camera. The value 0 is no zoom, 1 is maximum zoom. For a medium zoom, for example, you could pass `0.5`.
#### `Android` `permissionDialogTitle`
#### `Android` `permissionDialogTitle` - Depracated
Starting on android M individual permissions must be granted for certain services, the camera is one of them, you can use this to change the title of the dialog prompt requesting permissions.
#### `Android` `permissionDialogMessage`
#### `Android` `permissionDialogMessage` - Depracated
Starting on android M individual permissions must be granted for certain services, the camera is one of them, you can use this to change the content of the dialog prompt requesting permissions.
#### `Android` `androidRecordAudioPermissionOptions`
Configuration options for permissions request for recording audio. It will be passed as `rationale` parameter to [`PermissionsAndroid.request`](https://facebook.github.io/react-native/docs/permissionsandroid#request). This replaces and deprecates old `permissionDialogTitle` and `permissionDialogMessage` parameters.
#### `Android` `androidCameraPermissionOptions`
Configuration options for permissions request for camera. It will be passed as `rationale` parameter to [`PermissionsAndroid.request`](https://facebook.github.io/react-native/docs/permissionsandroid#request). This replaces and deprecates old `permissionDialogTitle` and `permissionDialogMessage` parameters.
#### `notAuthorizedView`
By default a `Camera not authorized` message will be displayed when access to the camera has been denied, if set displays the passed react element instead of the default one.

View File

@ -16,26 +16,29 @@ import {
import type { FaceFeature } from './FaceDetector';
const Rationale = PropTypes.shape({
title: PropTypes.string.isRequired,
message: PropTypes.string.isRequired,
buttonPositive: PropTypes.string,
buttonNegative: PropTypes.string,
buttonNeutral: PropTypes.string,
});
const requestPermissions = async (
captureAudio: boolean,
CameraManager: any,
permissionDialogTitle?: string,
permissionDialogMessage?: string,
androidCameraPermissionOptions: Rationale,
androidRecordAudioPermissionOptions: Rationale,
): Promise<{ hasCameraPermissions: boolean, hasRecordAudioPermissions: boolean }> => {
let hasCameraPermissions = false;
let hasRecordAudioPermissions = false;
let params = undefined;
if (permissionDialogTitle || permissionDialogMessage) {
params = { title: permissionDialogTitle, message: permissionDialogMessage };
}
if (Platform.OS === 'ios') {
hasCameraPermissions = await CameraManager.checkVideoAuthorizationStatus();
} else if (Platform.OS === 'android') {
const cameraPermissionResult = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.CAMERA,
params,
androidCameraPermissionOptions,
);
if (typeof cameraPermissionResult === 'boolean') {
hasCameraPermissions = cameraPermissionResult;
@ -51,7 +54,7 @@ const requestPermissions = async (
if (await CameraManager.checkIfRecordAudioPermissionsAreDefined()) {
const audioPermissionResult = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.RECORD_AUDIO,
params,
androidRecordAudioPermissionOptions,
);
if (typeof audioPermissionResult === 'boolean') {
hasRecordAudioPermissions = audioPermissionResult;
@ -297,6 +300,8 @@ export default class Camera extends React.Component<PropsType, StateType> {
autoFocusPointOfInterest: PropTypes.shape({ x: PropTypes.number, y: PropTypes.number }),
permissionDialogTitle: PropTypes.string,
permissionDialogMessage: PropTypes.string,
androidCameraPermissionOptions: Rationale,
androidRecordAudioPermissionOptions: Rationale,
notAuthorizedView: PropTypes.element,
pendingAuthorizationView: PropTypes.element,
captureAudio: PropTypes.bool,
@ -327,6 +332,14 @@ export default class Camera extends React.Component<PropsType, StateType> {
faceDetectionClassifications: ((CameraManager.FaceDetection || {}).Classifications || {}).none,
permissionDialogTitle: '',
permissionDialogMessage: '',
androidCameraPermissionOptions: {
title: '',
message: '',
},
androidRecordAudioPermissionOptions: {
title: '',
message: '',
},
notAuthorizedView: (
<View style={styles.authorizationContainer}>
<Text style={styles.notAuthorizedText}>Camera not authorized</Text>
@ -529,12 +542,39 @@ export default class Camera extends React.Component<PropsType, StateType> {
}
async arePermissionsGranted() {
const {
permissionDialogTitle,
permissionDialogMessage,
androidCameraPermissionOptions,
androidRecordAudioPermissionOptions,
} = this.props;
let cameraPermissions = androidCameraPermissionOptions;
let audioPermissions = androidRecordAudioPermissionOptions;
if (permissionDialogTitle || permissionDialogMessage) {
// eslint-disable-next-line no-console
console.warn(
'permissionDialogTitle and permissionDialogMessage are depracated. Please use androidCameraPermissionOptions instead.',
);
cameraPermissions = {
...cameraPermissions,
title: permissionDialogTitle,
message: permissionDialogMessage,
};
audioPermissions = {
...audioPermissions,
title: permissionDialogTitle,
message: permissionDialogMessage,
};
}
const { hasCameraPermissions, hasRecordAudioPermissions } = await requestPermissions(
this.props.captureAudio,
CameraManager,
this.props.permissionDialogTitle,
this.props.permissionDialogMessage,
cameraPermissions,
audioPermissions,
);
const recordAudioPermissionStatus = hasRecordAudioPermissions
? RecordAudioPermissionStatusEnum.AUTHORIZED
: RecordAudioPermissionStatusEnum.NOT_AUTHORIZED;