Skip to content

Commit c2e2a44

Browse files
authored
fix returning status in requestRecordingPermissions (#473)
* fix: ios fix * fix: android fix * fix: 2nd iteration of andoroid implementation
1 parent e8e51ac commit c2e2a44

File tree

6 files changed

+106
-23
lines changed

6 files changed

+106
-23
lines changed

packages/react-native-audio-api/android/src/main/java/com/swmansion/audioapi/AudioAPIModule.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import com.facebook.react.common.annotations.FrameworkAPI
99
import com.facebook.react.module.annotations.ReactModule
1010
import com.facebook.react.turbomodule.core.CallInvokerHolderImpl
1111
import com.swmansion.audioapi.system.MediaSessionManager
12+
import com.swmansion.audioapi.system.PermissionRequestListener
1213
import java.lang.ref.WeakReference
1314

1415
@OptIn(FrameworkAPI::class)
@@ -93,13 +94,12 @@ class AudioAPIModule(
9394
MediaSessionManager.observeVolumeChanges(enabled)
9495
}
9596

96-
override fun requestRecordingPermissions(promise: Promise?) {
97-
val res = MediaSessionManager.requestRecordingPermissions(currentActivity)
98-
promise!!.resolve(res)
97+
override fun requestRecordingPermissions(promise: Promise) {
98+
val permissionRequestListener = PermissionRequestListener(promise)
99+
MediaSessionManager.requestRecordingPermissions(permissionRequestListener)
99100
}
100101

101-
override fun checkRecordingPermissions(promise: Promise?) {
102-
val res = MediaSessionManager.checkRecordingPermissions()
103-
promise!!.resolve(res)
102+
override fun checkRecordingPermissions(promise: Promise) {
103+
promise.resolve(MediaSessionManager.checkRecordingPermissions())
104104
}
105105
}

packages/react-native-audio-api/android/src/main/java/com/swmansion/audioapi/system/MediaSessionManager.kt

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.swmansion.audioapi.system
22

33
import android.Manifest
4-
import android.app.Activity
54
import android.app.NotificationChannel
65
import android.app.NotificationManager
76
import android.content.ComponentName
@@ -16,12 +15,14 @@ import android.os.IBinder
1615
import android.support.v4.media.session.MediaSessionCompat
1716
import android.util.Log
1817
import androidx.annotation.RequiresApi
19-
import androidx.core.app.ActivityCompat
2018
import androidx.core.app.NotificationCompat
2119
import androidx.core.content.ContextCompat
2220
import com.facebook.react.bridge.ReactApplicationContext
2321
import com.facebook.react.bridge.ReadableMap
22+
import com.facebook.react.modules.core.PermissionAwareActivity
23+
import com.facebook.react.modules.core.PermissionListener
2424
import com.swmansion.audioapi.AudioAPIModule
25+
import com.swmansion.audioapi.system.PermissionRequestListener.Companion.RECORDING_REQUEST_CODE
2526
import java.lang.ref.WeakReference
2627

2728
object MediaSessionManager {
@@ -158,14 +159,13 @@ object MediaSessionManager {
158159
}
159160
}
160161

161-
fun requestRecordingPermissions(currentActivity: Activity?): String {
162-
ActivityCompat.requestPermissions(currentActivity!!, arrayOf(Manifest.permission.RECORD_AUDIO), 200)
163-
return checkRecordingPermissions()
162+
fun requestRecordingPermissions(permissionListener: PermissionListener) {
163+
val permissionAwareActivity = reactContext.get()!!.currentActivity as PermissionAwareActivity
164+
permissionAwareActivity.requestPermissions(arrayOf(Manifest.permission.RECORD_AUDIO), RECORDING_REQUEST_CODE, permissionListener)
164165
}
165166

166167
fun checkRecordingPermissions(): String =
167-
if (ContextCompat.checkSelfPermission(
168-
reactContext.get()!!,
168+
if (reactContext.get()!!.checkSelfPermission(
169169
Manifest.permission.RECORD_AUDIO,
170170
) == PackageManager.PERMISSION_GRANTED
171171
) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.swmansion.audioapi.system
2+
3+
import android.content.pm.PackageManager
4+
import com.facebook.react.bridge.Promise
5+
import com.facebook.react.modules.core.PermissionListener
6+
7+
class PermissionRequestListener(
8+
private val promise: Promise,
9+
) : PermissionListener {
10+
companion object {
11+
const val RECORDING_REQUEST_CODE = 1234
12+
}
13+
14+
override fun onRequestPermissionsResult(
15+
requestCode: Int,
16+
permissions: Array<String>,
17+
grantResults: IntArray,
18+
): Boolean {
19+
if (requestCode == RECORDING_REQUEST_CODE) {
20+
if (grantResults.isEmpty()) {
21+
this.promise.resolve("Undetermined")
22+
} else {
23+
val granted = grantResults[0] == PackageManager.PERMISSION_GRANTED
24+
if (granted) {
25+
this.promise.resolve("Granted")
26+
} else {
27+
this.promise.resolve("Denied")
28+
}
29+
}
30+
}
31+
return true
32+
}
33+
}

packages/react-native-audio-api/ios/audioapi/ios/AudioAPIModule.mm

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -131,15 +131,13 @@ - (void)invalidate
131131
requestRecordingPermissions : (nonnull RCTPromiseResolveBlock)resolve reject : (nonnull RCTPromiseRejectBlock)
132132
reject)
133133
{
134-
NSString *res = [self.audioSessionManager requestRecordingPermissions];
135-
resolve(res);
134+
[self.audioSessionManager requestRecordingPermissions:resolve reject:reject];
136135
}
137136

138137
RCT_EXPORT_METHOD(
139138
checkRecordingPermissions : (nonnull RCTPromiseResolveBlock)resolve reject : (nonnull RCTPromiseRejectBlock)reject)
140139
{
141-
NSString *res = [self.audioSessionManager checkRecordingPermissions];
142-
resolve(res);
140+
[self.audioSessionManager checkRecordingPermissions:resolve reject:reject];
143141
}
144142

145143
#ifdef RCT_NEW_ARCH_ENABLED

packages/react-native-audio-api/ios/audioapi/ios/system/AudioSessionManager.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
#import <AVFoundation/AVFoundation.h>
44
#import <Foundation/Foundation.h>
5+
#import <React/RCTBridgeModule.h>
56

67
@interface AudioSessionManager : NSObject
78

@@ -20,7 +21,7 @@
2021
- (NSNumber *)getDevicePreferredSampleRate;
2122
- (void)setAudioSessionOptions:(NSString *)category mode:(NSString *)mode options:(NSArray *)options;
2223
- (bool)setActive:(bool)active;
23-
- (NSString *)requestRecordingPermissions;
24-
- (NSString *)checkRecordingPermissions;
24+
- (void)requestRecordingPermissions:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject;
25+
- (void)checkRecordingPermissions:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject;
2526

2627
@end

packages/react-native-audio-api/ios/audioapi/ios/system/AudioSessionManager.mm

Lines changed: 55 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -175,11 +175,62 @@ - (bool)configureAudioSession
175175
return true;
176176
}
177177

178-
- (NSString *)requestRecordingPermissions
178+
- (void)requestRecordingPermissions:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject
179179
{
180-
[self.audioSession requestRecordPermission:^(BOOL granted){
181-
}];
182-
return [self checkRecordingPermissions];
180+
if (@available(iOS 17, *)) {
181+
[AVAudioSession.sharedInstance requestRecordPermission:^(BOOL granted) {
182+
if (granted) {
183+
resolve(@"Granted");
184+
} else {
185+
resolve(@"Denied");
186+
}
187+
}];
188+
} else {
189+
[self.audioSession requestRecordPermission:^(BOOL granted) {
190+
if (granted) {
191+
resolve(@"Granted");
192+
} else {
193+
resolve(@"Denied");
194+
}
195+
}];
196+
}
197+
}
198+
199+
- (void)checkRecordingPermissions:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject
200+
{
201+
if (@available(iOS 17, *)) {
202+
NSInteger res = [[AVAudioApplication sharedInstance] recordPermission];
203+
switch (res) {
204+
case AVAudioApplicationRecordPermissionUndetermined:
205+
resolve(@"Undetermined");
206+
break;
207+
case AVAudioApplicationRecordPermissionGranted:
208+
resolve(@"Granted");
209+
break;
210+
case AVAudioApplicationRecordPermissionDenied:
211+
resolve(@"Denied");
212+
break;
213+
default:
214+
resolve(@"Undetermined");
215+
break;
216+
}
217+
} else {
218+
NSInteger res = [self.audioSession recordPermission];
219+
switch (res) {
220+
case AVAudioSessionRecordPermissionUndetermined:
221+
resolve(@"Undetermined");
222+
break;
223+
case AVAudioSessionRecordPermissionGranted:
224+
resolve(@"Granted");
225+
break;
226+
case AVAudioSessionRecordPermissionDenied:
227+
resolve(@"Denied");
228+
break;
229+
default:
230+
resolve(@"Undetermined");
231+
break;
232+
}
233+
}
183234
}
184235

185236
- (NSString *)checkRecordingPermissions

0 commit comments

Comments
 (0)