Skip to content

Commit

Permalink
Added granted permissions cache in CheckerPermission. (#802)
Browse files Browse the repository at this point in the history
  • Loading branch information
dariuszseweryn committed Jul 9, 2022
1 parent 2af6539 commit ef2db2d
Show file tree
Hide file tree
Showing 3 changed files with 63 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,16 @@

import com.polidea.rxandroidble2.ClientScope;

import java.util.HashSet;
import java.util.Set;

import bleshadow.javax.inject.Inject;

@ClientScope
public class CheckerPermission {

private final Context context;
private final Set<String> grantedPermissions = new HashSet<>();

@Inject
CheckerPermission(Context context) {
Expand All @@ -37,6 +41,16 @@ private boolean isPermissionGranted(String permission) {
throw new IllegalArgumentException("permission is null");
}

return context.checkPermission(permission, Process.myPid(), Process.myUid()) == PackageManager.PERMISSION_GRANTED;
if (grantedPermissions.contains(permission)) {
return true;
}

boolean isGranted = context.checkPermission(permission, Process.myPid(), Process.myUid()) == PackageManager.PERMISSION_GRANTED;

if (isGranted) {
grantedPermissions.add(permission);
}

return isGranted;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package com.polidea.rxandroidble2.internal.util

import android.content.Context
import android.content.pm.PackageManager
import spock.lang.Specification

class CheckerPermissionTest extends Specification {

String testPermissionString = "random.package.RANDOM_PERMISSION"
def testPermissionArray = new String[] { testPermissionString }
def mockContext = Mock Context
CheckerPermission objectUnderTest

def "should cache granted permissions"() {

given:
objectUnderTest = new CheckerPermission(mockContext)

when:
def result0 = objectUnderTest.isAnyPermissionGranted(testPermissionArray)
def result1 = objectUnderTest.isAnyPermissionGranted(testPermissionArray)

then:
1 * mockContext.checkPermission(testPermissionString, _, _) >> PackageManager.PERMISSION_GRANTED

and:
result0
result1
}

def "should call context each time if permission is not granted"() {

given:
objectUnderTest = new CheckerPermission(mockContext)

when:
def result0 = objectUnderTest.isAnyPermissionGranted(testPermissionArray)
def result1 = objectUnderTest.isAnyPermissionGranted(testPermissionArray)

then:
2 * mockContext.checkPermission(testPermissionString, _, _) >> PackageManager.PERMISSION_DENIED

and:
!result0
!result1
}
}
1 change: 1 addition & 0 deletions rxandroidble/src/test/java/android/content/Context.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,6 @@ public abstract class Context {
public abstract ContentResolver getContentResolver();
public abstract Intent registerReceiver(BroadcastReceiver receiver, IntentFilter intentFilter);
public abstract void unregisterReceiver(BroadcastReceiver receiver);
public abstract int checkPermission(String permission, int pid, int uid);

}

0 comments on commit ef2db2d

Please sign in to comment.