1 package versioned.host.exp.exponent.modules.universal
2 
3 import android.content.Context
4 import android.content.pm.PackageManager
5 import androidx.core.content.ContextCompat
6 import expo.modules.interfaces.permissions.PermissionsResponseListener
7 import host.exp.exponent.di.NativeModuleDepsProvider
8 import host.exp.exponent.kernel.ExperienceKey
9 import host.exp.exponent.kernel.services.ExpoKernelServiceRegistry
10 import expo.modules.adapters.react.permissions.PermissionsService
11 import expo.modules.core.ModuleRegistry
12 import javax.inject.Inject
13 
14 class ScopedPermissionsService(context: Context, val experienceKey: ExperienceKey) : PermissionsService(context) {
15 
16   // This variable cannot be lateinit, cause the Location module gets permissions before this module is initialized.
17   @Inject
18   var mExpoKernelServiceRegistry: ExpoKernelServiceRegistry? = null
19 
onCreatenull20   override fun onCreate(moduleRegistry: ModuleRegistry) {
21     super.onCreate(moduleRegistry)
22     NativeModuleDepsProvider.instance.inject(ScopedPermissionsService::class.java, this)
23   }
24 
25   // We override this to inject scoped permissions even if the device doesn't support the runtime permissions.
askForManifestPermissionsnull26   override fun askForManifestPermissions(permissions: Array<out String>, listener: PermissionsResponseListener) {
27     delegateRequestToActivity(permissions, listener)
28   }
29 
30   // We override this to scoped permissions in the headless mode.
getManifestPermissionFromContextnull31   override fun getManifestPermissionFromContext(permission: String): Int {
32     val globalPermissions = ContextCompat.checkSelfPermission(context, permission)
33     return mExpoKernelServiceRegistry?.permissionsKernelService?.getPermissions(globalPermissions, context.packageManager, permission, experienceKey)
34       ?: PackageManager.PERMISSION_DENIED
35   }
36 }
37