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