98 lines
4.6 KiB
Java
98 lines
4.6 KiB
Java
package com.safemobile.lib;
|
|
|
|
import android.Manifest;
|
|
import android.app.Activity;
|
|
import android.content.pm.PackageManager;
|
|
|
|
import androidx.core.app.ActivityCompat;
|
|
import androidx.core.content.ContextCompat;
|
|
|
|
import com.safemobile.enums.AuthorizationCode;
|
|
import com.safemobile.enums.AuthorizationStatus;
|
|
import com.safemobile.interfaces.IPermissionModule;
|
|
|
|
import java.security.InvalidParameterException;
|
|
|
|
public class PermissionModule implements IPermissionModule {
|
|
private static final String[] AUDIO_PERMISSIONS = {Manifest.permission.RECORD_AUDIO};
|
|
private static final String[] LOCATION_PERMISSIONS = {
|
|
Manifest.permission.ACCESS_COARSE_LOCATION,
|
|
Manifest.permission.ACCESS_FINE_LOCATION
|
|
};
|
|
private static final String[] CAMERA_PERMISSIONS = {Manifest.permission.CAMERA};
|
|
private static final String[] READ_EXTERNAL_STORAGE_PERMISSIONS = {Manifest.permission.READ_EXTERNAL_STORAGE};
|
|
private static final String[] WRITE_EXTERNAL_STORAGE_PERMISSIONS = {Manifest.permission.WRITE_EXTERNAL_STORAGE};
|
|
|
|
public static final int RECORD_AUDIO_PERMISSION_REQUEST_CODE = 13042022;
|
|
public static final int LOCATION_PERMISSION_REQUEST_CODE = 12021990;
|
|
public static final int CAMERA_PERMISSION_REQUEST_CODE = 16031989;
|
|
public static final int READ_STORAGE_PERMISSION_REQUEST_CODE = 30062018;
|
|
public static final int WRITE_STORAGE_PERMISSION_REQUEST_CODE = 13122012;
|
|
|
|
private boolean permissionPrompShowed;
|
|
|
|
|
|
@Override
|
|
public AuthorizationStatus getAuthorizationStatus(Activity activity, AuthorizationCode authorizationCode) {
|
|
switch (authorizationCode) {
|
|
case RECORD_AUDIO:
|
|
return getPermissionAuthorizationStatus(activity, Manifest.permission.RECORD_AUDIO);
|
|
case CAMERA:
|
|
return getPermissionAuthorizationStatus(activity, Manifest.permission.CAMERA);
|
|
case GEOLOCATION:
|
|
return getPermissionAuthorizationStatus(activity, Manifest.permission.ACCESS_COARSE_LOCATION);
|
|
case READ_EXTERNAL_STORAGE:
|
|
return getPermissionAuthorizationStatus(activity, Manifest.permission.READ_EXTERNAL_STORAGE);
|
|
case WRITE_EXTERNAL_STORAGE:
|
|
return getPermissionAuthorizationStatus(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
|
|
case UNKNOWN:
|
|
throw new InvalidParameterException(authorizationCode.name());
|
|
default:
|
|
throw new IllegalArgumentException(authorizationCode.name());
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void requestAuthorization(Activity activity, AuthorizationCode authorizationCode) {
|
|
switch (authorizationCode) {
|
|
case RECORD_AUDIO:
|
|
ActivityCompat.requestPermissions(activity, AUDIO_PERMISSIONS, RECORD_AUDIO_PERMISSION_REQUEST_CODE);
|
|
break;
|
|
case CAMERA:
|
|
ActivityCompat.requestPermissions(activity, CAMERA_PERMISSIONS, CAMERA_PERMISSION_REQUEST_CODE);
|
|
break;
|
|
case GEOLOCATION:
|
|
ActivityCompat.requestPermissions(activity, LOCATION_PERMISSIONS, LOCATION_PERMISSION_REQUEST_CODE);
|
|
break;
|
|
case READ_EXTERNAL_STORAGE:
|
|
ActivityCompat.requestPermissions(activity, READ_EXTERNAL_STORAGE_PERMISSIONS, READ_STORAGE_PERMISSION_REQUEST_CODE);
|
|
break;
|
|
case WRITE_EXTERNAL_STORAGE:
|
|
ActivityCompat.requestPermissions(activity, WRITE_EXTERNAL_STORAGE_PERMISSIONS, WRITE_STORAGE_PERMISSION_REQUEST_CODE);
|
|
break;
|
|
case UNKNOWN:
|
|
throw new InvalidParameterException(authorizationCode.name());
|
|
default:
|
|
throw new IllegalArgumentException(authorizationCode.name());
|
|
}
|
|
permissionPrompShowed = true;
|
|
}
|
|
|
|
private AuthorizationStatus getPermissionAuthorizationStatus(Activity activity, String permission) {
|
|
int permissionState = ContextCompat.checkSelfPermission(activity.getApplicationContext(), permission);
|
|
|
|
return authorizationStatus(activity, permissionState);
|
|
}
|
|
|
|
private AuthorizationStatus authorizationStatus(Activity activity, int permissionState) {
|
|
if (permissionState == PackageManager.PERMISSION_GRANTED)
|
|
return AuthorizationStatus.AUTHORIZE;
|
|
if (!permissionPrompShowed)
|
|
return AuthorizationStatus.NOT_DETERMINED;
|
|
|
|
boolean shouldShowPermissionPrompt = ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.ACCESS_COARSE_LOCATION);
|
|
|
|
return shouldShowPermissionPrompt ? AuthorizationStatus.NOT_DETERMINED : AuthorizationStatus.DENIED;
|
|
}
|
|
}
|