Skip to content

Commit c80da05

Browse files
author
kuldip-simform
committed
feat(UNT-T20529): ask media access permission iOS
1 parent 0cd0c35 commit c80da05

File tree

11 files changed

+113
-50
lines changed

11 files changed

+113
-50
lines changed

example/src/App.tsx

Lines changed: 49 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useRef, useState } from 'react';
1+
import { useCallback, useEffect, useRef, useState } from 'react';
22
import { Button, Linking, SafeAreaView, ScrollView, View } from 'react-native';
33
import {
44
FinishMode,
@@ -9,7 +9,7 @@ import {
99
RecorderState,
1010
UpdateFrequency,
1111
Waveform,
12-
useRecorderPermission,
12+
useAudioPermission,
1313
} from 'react-native-audio-waveform';
1414
import { GestureHandlerRootView } from 'react-native-gesture-handler';
1515
import RNFetchBlob from 'rn-fetch-blob';
@@ -71,8 +71,8 @@ const ListItem = ({
7171
const LivePlayerComponent = () => {
7272
const newRef = useRef<IRecordWaveformRef>(null);
7373
const [recorderState, setRecorderState] = useState(RecorderState.stopped);
74-
const { checkHasRecorderPermission, getAudioRecorderPermission } =
75-
useRecorderPermission();
74+
const { checkHasAudioRecorderPermission, getAudioRecorderPermission } =
75+
useAudioPermission();
7676

7777
const startRecording = () => {
7878
newRef.current
@@ -89,7 +89,7 @@ const LivePlayerComponent = () => {
8989
title={Strings.start}
9090
disabled={recorderState !== RecorderState.stopped}
9191
onPress={async () => {
92-
let hasPermission = await checkHasRecorderPermission();
92+
let hasPermission = await checkHasAudioRecorderPermission();
9393

9494
if (hasPermission === PermissionStatus.granted) {
9595
startRecording();
@@ -136,27 +136,57 @@ const LivePlayerComponent = () => {
136136

137137
const App = () => {
138138
const [shouldScroll, setShouldScroll] = useState(true);
139+
const [list, setList] = useState<string[]>([]);
140+
const [hasAudioReadPermission, setHasAudioReadPermission] = useState(
141+
PermissionStatus.granted
142+
);
139143
const { fs } = RNFetchBlob;
140144
const filePath = `${fs.dirs.MainBundleDir}`;
141-
const list = [
142-
`${filePath}/file_example_MP3_1MG.mp3`,
143-
`${filePath}/file_example_MP3_700KB.mp3`,
144-
];
145+
146+
const { checkHasAudioReadPermission, getAudioReadPermission } =
147+
useAudioPermission();
148+
const checkAudioReadPermission = useCallback(async () => {
149+
const hasPermission = await checkHasAudioReadPermission();
150+
setHasAudioReadPermission(hasPermission);
151+
if (hasPermission) {
152+
const newList = [
153+
`${filePath}/file_example_MP3_1MG.mp3`,
154+
`${filePath}/file_example_MP3_700KB.mp3`,
155+
];
156+
setList(newList);
157+
}
158+
}, []);
159+
160+
const getPermissionForAudioRead = async () => {
161+
const hasPermission = await getAudioReadPermission();
162+
setHasAudioReadPermission(hasPermission);
163+
};
164+
165+
useEffect(() => {
166+
checkAudioReadPermission();
167+
}, [checkHasAudioReadPermission]);
168+
145169
return (
146170
<SafeAreaView style={styles.container}>
147171
<GestureHandlerRootView style={styles.container}>
148172
<View style={styles.container}>
149173
<LivePlayerComponent />
150-
<ScrollView scrollEnabled={shouldScroll}>
151-
{list.map((item, index) => (
152-
<ListItem
153-
key={`${item}${index}`}
154-
index={index}
155-
item={item}
156-
onPanStateChange={value => setShouldScroll(!value)}
157-
/>
158-
))}
159-
</ScrollView>
174+
{hasAudioReadPermission === PermissionStatus.granted ? (
175+
<ScrollView scrollEnabled={shouldScroll}>
176+
{list.map((item, index) => (
177+
<ListItem
178+
key={`${item}${index}`}
179+
index={index}
180+
item={item}
181+
onPanStateChange={value => setShouldScroll(!value)}
182+
/>
183+
))}
184+
</ScrollView>
185+
) : (
186+
<Button
187+
title={Strings.getAudioReadPermission}
188+
onPress={getPermissionForAudioRead}></Button>
189+
)}
160190
</View>
161191
</GestureHandlerRootView>
162192
</SafeAreaView>

example/src/constants/Strings.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@ export default {
33
start: 'Start',
44
pause: 'Pause',
55
resume: 'Resume',
6+
getAudioReadPermission: 'Get Audio Read Permission',
67
};

ios/AudioRecorder.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ public class AudioRecorder: NSObject, AVAudioRecorderDelegate{
146146
resolve(getDecibelLevel())
147147
}
148148

149-
public func checkHasPermission(_ resolve: RCTPromiseResolveBlock) -> Void{
149+
public func checkHasAudioRecorderPermission(_ resolve: RCTPromiseResolveBlock) -> Void{
150150
var hasPermission = ""
151151
switch AVAudioSession.sharedInstance().recordPermission{
152152
case .granted:
@@ -163,7 +163,7 @@ public class AudioRecorder: NSObject, AVAudioRecorderDelegate{
163163
resolve(hasPermission)
164164
}
165165

166-
public func getAudioPermission(_ resolve: @escaping RCTPromiseResolveBlock) -> Void{
166+
public func getAudioRecorderPermission(_ resolve: @escaping RCTPromiseResolveBlock) -> Void{
167167
AVAudioSession.sharedInstance().requestRecordPermission() { allowed in
168168
DispatchQueue.main.async {
169169
print("Permission \(allowed)")

ios/AudioWaveform.m

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,15 @@
1212

1313
@interface RCT_EXTERN_MODULE(AudioWaveform, RCTEventEmitter)
1414

15-
RCT_EXTERN_METHOD(checkHasPermission:(RCTPromiseResolveBlock)resolve
15+
RCT_EXTERN_METHOD(checkHasAudioRecorderPermission:(RCTPromiseResolveBlock)resolve
1616
rejecter: (RCTPromiseRejectBlock)reject)
17-
RCT_EXTERN_METHOD(getAudioPermission:(RCTPromiseResolveBlock)resolve
17+
RCT_EXTERN_METHOD(getAudioRecorderPermission:(RCTPromiseResolveBlock)resolve
1818
rejecter: (RCTPromiseRejectBlock)reject)
19+
RCT_EXTERN_METHOD(checkHasAudioReadPermission:(RCTPromiseResolveBlock)resolve
20+
rejecter: (RCTPromiseRejectBlock)reject)
21+
RCT_EXTERN_METHOD(getAudioReadPermission:(RCTPromiseResolveBlock)resolve
22+
rejecter: (RCTPromiseRejectBlock)reject)
23+
1924
RCT_EXTERN_METHOD(startRecording:(NSDictionary *)args
2025
resolver: (RCTPromiseResolveBlock)resolve
2126
rejecter: (RCTPromiseRejectBlock)reject)

ios/AudioWaveform.swift

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,22 @@ class AudioWaveform: RCTEventEmitter {
4242
return ["AudioPlayerEvent"]
4343
}
4444

45-
@objc func checkHasPermission(_ resolve: @escaping RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) -> Void {
46-
audioRecorder.checkHasPermission(resolve)
45+
@objc func checkHasAudioRecorderPermission(_ resolve: @escaping RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) -> Void {
46+
audioRecorder.checkHasAudioRecorderPermission(resolve)
4747
}
48+
49+
@objc func checkHasAudioReadPermission(_ resolve: @escaping RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) -> Void {
50+
// iOS does not need to ask for permission to read files so this will resolve "granted" every time
51+
resolve("granted")
52+
}
53+
54+
@objc func getAudioReadPermission(_ resolve: @escaping RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) -> Void {
55+
// iOS does not need to ask for permission to read files so this will resolve "granted" every time
56+
resolve("granted")
57+
}
4858

49-
@objc func getAudioPermission(_ resolve: @escaping RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) -> Void {
50-
audioRecorder.getAudioPermission(resolve)
59+
@objc func getAudioRecorderPermission(_ resolve: @escaping RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) -> Void {
60+
audioRecorder.getAudioRecorderPermission(resolve)
5161
}
5262

5363
@objc func startRecording(_ args: NSDictionary?, resolver resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) -> Void {

src/components/Waveform/Waveform.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import {
2626
import {
2727
useAudioPlayer,
2828
useAudioRecorder,
29-
useRecorderPermission,
29+
useAudioPermission,
3030
} from '../../hooks';
3131
import type { IStartRecording } from '../../types';
3232
import { WaveformCandle } from '../WaveformCandle';
@@ -95,7 +95,7 @@ export const Waveform: <T extends StaticOrLive>(
9595
resumeRecording,
9696
} = useAudioRecorder();
9797

98-
const { checkHasRecorderPermission } = useRecorderPermission();
98+
const { checkHasAudioRecorderPermission } = useAudioPermission();
9999

100100
const preparePlayerForPath = async () => {
101101
if (!isNil(path) && !isEmpty(path)) {
@@ -230,7 +230,7 @@ export const Waveform: <T extends StaticOrLive>(
230230

231231
const startRecordingAction = async (args?: Partial<IStartRecording>) => {
232232
try {
233-
const hasPermission = await checkHasRecorderPermission();
233+
const hasPermission = await checkHasAudioRecorderPermission();
234234

235235
if (hasPermission === PermissionStatus.granted) {
236236
const start = await startRecording(args);
@@ -296,7 +296,7 @@ export const Waveform: <T extends StaticOrLive>(
296296

297297
const resumeRecordingAction = async () => {
298298
try {
299-
const hasPermission = await checkHasRecorderPermission();
299+
const hasPermission = await checkHasAudioRecorderPermission();
300300
if (hasPermission === PermissionStatus.granted) {
301301
const resume = await resumeRecording();
302302
if (!isNil(resume)) {

src/hooks/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1+
export * from './useAudioPermission';
12
export * from './useAudioPlayer';
23
export * from './useAudioRecorder';
3-
export * from './useRecorderPermission';

src/hooks/useAudioPermission.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { AudioWaveform } from '../audioWaveform';
2+
3+
export const useAudioPermission = () => {
4+
const checkHasAudioRecorderPermission = () => {
5+
return AudioWaveform.checkHasAudioRecorderPermission();
6+
};
7+
8+
const getAudioRecorderPermission = () => {
9+
return AudioWaveform.getAudioRecorderPermission();
10+
};
11+
12+
const checkHasAudioReadPermission = () => {
13+
return AudioWaveform.checkHasAudioRecorderPermission();
14+
};
15+
16+
const getAudioReadPermission = () => {
17+
return AudioWaveform.getAudioReadPermission();
18+
};
19+
20+
return {
21+
checkHasAudioRecorderPermission,
22+
getAudioRecorderPermission,
23+
checkHasAudioReadPermission,
24+
getAudioReadPermission,
25+
};
26+
};

src/hooks/useRecorderPermission.ts

Lines changed: 0 additions & 15 deletions
This file was deleted.

src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,4 @@ export {
1010
RecorderState,
1111
UpdateFrequency,
1212
} from './constants';
13-
export { useRecorderPermission } from './hooks';
13+
export { useAudioPermission } from './hooks';

0 commit comments

Comments
 (0)