If you still want to cheat with access rights / requests, you still create something like PermissionHandler , but refer only to it in your view class. For instance -
Interface:
public interface PermissionsHandler { boolean checkHasPermission(AppCompatActivity activity, String permission); void requestPermission(AppCompatActivity activity, String[] permissions, int requestCode); }
Production implementation:
public class PermissionsHandlerAndroid implements PermissionsHandler { @Override public boolean checkHasPermission(AppCompatActivity activity, String permission) { return ContextCompat.checkSelfPermission(activity, permission) == PackageManager.PERMISSION_GRANTED; } @Override public void requestPermission(AppCompatActivity activity, String[] permissions, int requestCode){ ActivityCompat.requestPermissions(activity, permissions, requestCode); } }
A dedicated class (for example, to check and make sure that your activity correctly processes onRequestPermissionsResult )
public class PermissionsHandlerMocked implements PermissionsHandler { @Override public boolean checkHasPermission(AppCompatActivity activity, String permission) { return false; } @Override public void requestPermission(AppCompatActivity activity, String[] permissions, int requestCode){ int[] grantResults = new int[permissions.length]; for (int i = 0; i < permissions.length; i++) { grantResults[i] = PackageManager.PERMISSION_GRANTED } activity.onRequestPermissionResult(requestCode, permissions, grantResults); } }
Then in your activity:
PermissionsHandler permissionsHandler; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); permissionsHandler = Injection.providePermissionsHandler();
fobo66 , you can always force a view to implement much more general methods such as checkLocationPermissionGranted() and requestLocationPermission() . Then your implementation of the view can refer to the activity as necessary, and your host will never have to touch the link to the action.