package com.berider.app.common.utils import android.Manifest.permission.* import android.app.Activity import android.content.Context import android.content.pm.PackageManager import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import com.berider.app.analytics.base.AnalyticsService import com.berider.app.analytics.base.Event import com.berider.app.common.utils.PermissionConstants.REQUEST_LOCATION import com.berider.app.common.utils.PermissionConstants.locationPermissions /** * Created by pavel.petkevich@skodaautodigilab.com on 20.March.2020 */ object PermissionConstants { const val REQUEST_STORAGE = 1000 const val REQUEST_CAMERA = 1001 const val REQUEST_LOCATION = 1002 val permissionMap = mapOf( CAMERA to REQUEST_CAMERA, READ_EXTERNAL_STORAGE to REQUEST_STORAGE, ACCESS_FINE_LOCATION to REQUEST_LOCATION ) internal val locationPermissions = arrayOf(ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION) } /** * Context extension function, check if permission is gived or not. * @return Boolean - true in case of gived otherwise false. */ fun Context.isLocationPermissionGranted() = ContextCompat.checkSelfPermission(this, ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED /** * Fragment extension function for running code with following [permission]. * @param permission - manifest permission. * @param granted - lambda function invoked in case of permission already granted. * @param showRationale - lambda function invoked in case of needs to show rationale before requesting [permission]. */ fun Fragment.runWithPermission( permission: String, granted: () -> Unit, analyticsService: AnalyticsService, showRationale: (() -> Unit)? = null ) { activity?.let { act -> when { ContextCompat.checkSelfPermission(act, permission) == PackageManager.PERMISSION_GRANTED -> granted.invoke() ActivityCompat.shouldShowRequestPermissionRationale( act, READ_CONTACTS // TODO PermissionRationale: ignoring(set it on READ_CONTACTS) replace with [permission]. ) -> showRationale?.invoke() else -> PermissionConstants.permissionMap[permission]?.let { analyticsService.logEvent(Event.Names.GLOBAL_PERMISSION.name, Event.Parameters.TYPE.name to permission) requestPermissions(it.getPermissions(permission), it) } } } } /** * Activity extension function for running code with following [permission]. * @param permission - manifest permission. * @param granted - lambda function invoked in case of permission already granted. * @param showRationale - lambda function invoked in case of needs to show rationale before requesting [permission]. */ fun Activity.runWithPermission( permission: String, granted: (() -> Unit)? = null, analyticsService: AnalyticsService, showRationale: (() -> Unit)? = null ) { when { ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED -> granted?.invoke() ActivityCompat.shouldShowRequestPermissionRationale( this, READ_CONTACTS // TODO PermissionRationale: ignoring(set it on READ_CONTACTS) replace with [permission]. ) -> showRationale?.invoke() else -> PermissionConstants.permissionMap[permission]?.let { analyticsService.logEvent(Event.Names.GLOBAL_PERMISSION.name, Event.Parameters.TYPE.name to permission) requestPermissions(it.getPermissions(permission), it) } } } private fun Int.getPermissions(permission: String) = when (this) { REQUEST_LOCATION -> locationPermissions else -> arrayOf(permission) }