Skip to content
This repository has been archived by the owner on Feb 4, 2024. It is now read-only.

refactor: small adjustments and removal of some deprecations #331

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ buildscript {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:4.0.0'
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.0'
classpath 'com.android.tools.build:gradle:4.0.1'
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.5'
classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1'
}
}
Expand All @@ -22,15 +22,15 @@ ext {
compileSdkVersion = 29
targetSdkVersion = compileSdkVersion

rxJava = 'io.reactivex.rxjava3:rxjava:3.0.4'
rxJava = 'io.reactivex.rxjava3:rxjava:3.0.6'
junit = 'junit:junit:4.13'
mockito = 'org.mockito:mockito-core:3.3.3'
mockito = 'org.mockito:mockito-core:3.5.10'

androidXFragment = 'androidx.fragment:fragment:1.2.5'
androidXAnnotation = 'androidx.annotation:annotation:1.1.0'
androidXAppcompat = 'androidx.appcompat:appcompat:1.1.0'
androidXAppcompat = 'androidx.appcompat:appcompat:1.2.0'

robolectricVersion = '4.3.1'
robolectricVersion = '4.4'
robolectric = "org.robolectric:robolectric:$robolectricVersion"
robolectricShadowsSupport = "org.robolectric:shadows-support-v4:$robolectricVersion"
// Workaround for https://github.com/robolectric/robolectric/issues/1932
Expand Down
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5.1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-6.6.1-all.zip
2 changes: 1 addition & 1 deletion lib/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ dependencies {
implementation rootProject.ext.androidXAnnotation
implementation rootProject.ext.androidXAppcompat

testImplementation 'junit:junit:4.13'
testImplementation rootProject.ext.junit
testImplementation rootProject.ext.mockito
testImplementation rootProject.ext.robolectric
testImplementation rootProject.ext.khronosOpenGLApi
Expand Down
42 changes: 13 additions & 29 deletions lib/src/main/java/com/tbruyelle/rxpermissions3/Permission.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,6 @@
import java.util.List;

import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.functions.BiConsumer;
import io.reactivex.rxjava3.functions.Function;
import io.reactivex.rxjava3.functions.Predicate;

public class Permission {
public final String name;
Expand Down Expand Up @@ -61,40 +58,27 @@ public String toString() {

private String combineName(List<Permission> permissions) {
return Observable.fromIterable(permissions)
.map(new Function<Permission, String>() {
@Override
public String apply(Permission permission) throws Exception {
return permission.name;
.map(permission -> permission.name)
.collectInto(new StringBuilder(), (s, s2) -> {
if (s.length() == 0) {
s.append(s2);
} else {
s.append(", ").append(s2);
}
}).collectInto(new StringBuilder(), new BiConsumer<StringBuilder, String>() {
@Override
public void accept(StringBuilder s, String s2) throws Exception {
if (s.length() == 0) {
s.append(s2);
} else {
s.append(", ").append(s2);
}
}
}).blockingGet().toString();
})
.blockingGet()
.toString();
}

private Boolean combineGranted(List<Permission> permissions) {
return Observable.fromIterable(permissions)
.all(new Predicate<Permission>() {
@Override
public boolean test(Permission permission) throws Exception {
return permission.granted;
}
}).blockingGet();
.all(permission -> permission.granted)
.blockingGet();
}

private Boolean combineShouldShowRequestPermissionRationale(List<Permission> permissions) {
return Observable.fromIterable(permissions)
.any(new Predicate<Permission>() {
@Override
public boolean test(Permission permission) throws Exception {
return permission.shouldShowRequestPermissionRationale;
}
}).blockingGet();
.any(permission -> permission.shouldShowRequestPermissionRationale)
.blockingGet();
}
}
87 changes: 30 additions & 57 deletions lib/src/main/java/com/tbruyelle/rxpermissions3/RxPermissions.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@

import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
import androidx.core.app.ActivityCompat;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
Expand All @@ -29,9 +30,7 @@
import java.util.List;

import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.ObservableSource;
import io.reactivex.rxjava3.core.ObservableTransformer;
import io.reactivex.rxjava3.functions.Function;
import io.reactivex.rxjava3.subjects.PublishSubject;

public class RxPermissions {
Expand Down Expand Up @@ -97,32 +96,24 @@ public void setLogging(boolean logging) {
*/
@SuppressWarnings("WeakerAccess")
public <T> ObservableTransformer<T, Boolean> ensure(final String... permissions) {
return new ObservableTransformer<T, Boolean>() {
@Override
public ObservableSource<Boolean> apply(Observable<T> o) {
return request(o, permissions)
// Transform Observable<Permission> to Observable<Boolean>
.buffer(permissions.length)
.flatMap(new Function<List<Permission>, ObservableSource<Boolean>>() {
@Override
public ObservableSource<Boolean> apply(List<Permission> permissions) {
if (permissions.isEmpty()) {
// Occurs during orientation change, when the subject receives onComplete.
// In that case we don't want to propagate that empty list to the
// subscriber, only the onComplete.
return Observable.empty();
}
// Return true if all permissions are granted.
for (Permission p : permissions) {
if (!p.granted) {
return Observable.just(false);
}
}
return Observable.just(true);
}
});
}
};
return observable -> request(observable, permissions)
// Transform Observable<Permission> to Observable<Boolean>
.buffer(permissions.length)
.flatMap(permissionsList -> {
if (permissionsList.isEmpty()) {
// Occurs during orientation change, when the subject receives onComplete.
// In that case we don't want to propagate that empty list to the
// subscriber, only the onComplete.
return Observable.empty();
}
// Return true if all permissions are granted.
for (Permission p : permissionsList) {
if (!p.granted) {
return Observable.just(false);
}
}
return Observable.just(true);
});
}

/**
Expand All @@ -134,12 +125,7 @@ public ObservableSource<Boolean> apply(List<Permission> permissions) {
*/
@SuppressWarnings("WeakerAccess")
public <T> ObservableTransformer<T, Permission> ensureEach(final String... permissions) {
return new ObservableTransformer<T, Permission>() {
@Override
public ObservableSource<Permission> apply(Observable<T> o) {
return request(o, permissions);
}
};
return observable -> request(observable, permissions);
}

/**
Expand All @@ -150,22 +136,14 @@ public ObservableSource<Permission> apply(Observable<T> o) {
* to ask the user if he allows the permissions.
*/
public <T> ObservableTransformer<T, Permission> ensureEachCombined(final String... permissions) {
return new ObservableTransformer<T, Permission>() {
@Override
public ObservableSource<Permission> apply(Observable<T> o) {
return request(o, permissions)
.buffer(permissions.length)
.flatMap(new Function<List<Permission>, ObservableSource<Permission>>() {
@Override
public ObservableSource<Permission> apply(List<Permission> permissions) {
if (permissions.isEmpty()) {
return Observable.empty();
}
return Observable.just(new Permission(permissions));
}
});
}
};
return observable -> request(observable, permissions)
.buffer(permissions.length)
.flatMap(permissionsList -> {
if (permissionsList.isEmpty()) {
return Observable.empty();
}
return Observable.just(new Permission(permissionsList));
});
}

/**
Expand Down Expand Up @@ -199,12 +177,7 @@ private Observable<Permission> request(final Observable<?> trigger, final String
throw new IllegalArgumentException("RxPermissions.request/requestEach requires at least one input permission");
}
return oneOf(trigger, pending(permissions))
.flatMap(new Function<Object, Observable<Permission>>() {
@Override
public Observable<Permission> apply(Object o) {
return requestImplementation(permissions);
}
});
.flatMap(object -> requestImplementation(permissions));
}

private Observable<?> pending(final String... permissions) {
Expand Down Expand Up @@ -286,7 +259,7 @@ public Observable<Boolean> shouldShowRequestPermissionRationale(final Activity a
@TargetApi(Build.VERSION_CODES.M)
private boolean shouldShowRequestPermissionRationaleImplementation(final Activity activity, final String... permissions) {
for (String p : permissions) {
if (!isGranted(p) && !activity.shouldShowRequestPermissionRationale(p)) {
if (!isGranted(p) && !ActivityCompat.shouldShowRequestPermissionRationale(activity,p)) {
return false;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ boolean isRevoked(String permission) {
if (fragmentActivity == null) {
throw new IllegalStateException("This fragment must be attached to an activity.");
}
return fragmentActivity.getPackageManager().isPermissionRevokedByPolicy(permission, getActivity().getPackageName());
return fragmentActivity.getPackageManager().isPermissionRevokedByPolicy(permission, fragmentActivity.getPackageName());
}

public void setLogging(boolean logging) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doCallRealMethod;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
Expand Down
2 changes: 1 addition & 1 deletion sample/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,6 @@ dependencies {
implementation 'com.jakewharton.rxbinding4:rxbinding:4.0.0'
implementation rootProject.ext.androidXAppcompat

testImplementation 'junit:junit:4.13'
testImplementation rootProject.ext.junit
testImplementation rootProject.ext.mockito
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,11 @@
import androidx.appcompat.app.AppCompatActivity;

import com.jakewharton.rxbinding4.view.RxView;
import com.tbruyelle.rxpermissions3.Permission;
import com.tbruyelle.rxpermissions3.RxPermissions;

import java.io.IOException;

import io.reactivex.rxjava3.disposables.Disposable;
import io.reactivex.rxjava3.functions.Action;
import io.reactivex.rxjava3.functions.Consumer;


public class MainActivity extends AppCompatActivity {
Expand All @@ -40,45 +37,32 @@ protected void onCreate(Bundle savedInstanceState) {
disposable = RxView.clicks(findViewById(R.id.enableCamera))
// Ask for permissions when button is clicked
.compose(rxPermissions.ensureEach(permission.CAMERA))
.subscribe(new Consumer<Permission>() {
@Override
public void accept(Permission permission) {
Log.i(TAG, "Permission result " + permission);
if (permission.granted) {
releaseCamera();
camera = Camera.open(0);
try {
camera.setPreviewDisplay(surfaceView.getHolder());
camera.startPreview();
} catch (IOException e) {
Log.e(TAG, "Error while trying to display the camera preview", e);
}
} else if (permission.shouldShowRequestPermissionRationale) {
// Denied permission without ask never again
Toast.makeText(MainActivity.this,
"Denied permission without ask never again",
Toast.LENGTH_SHORT).show();
} else {
// Denied permission with ask never again
// Need to go to the settings
Toast.makeText(MainActivity.this,
"Permission denied, can't enable the camera",
Toast.LENGTH_SHORT).show();
}
}
},
new Consumer<Throwable>() {
@Override
public void accept(Throwable t) {
Log.e(TAG, "onError", t);
}
},
new Action() {
@Override
public void run() {
Log.i(TAG, "OnComplete");
}
});
.subscribe(permission -> {
Log.i(TAG, "Permission result " + permission);
if (permission.granted) {
releaseCamera();
camera = Camera.open(0);
try {
camera.setPreviewDisplay(surfaceView.getHolder());
camera.startPreview();
} catch (IOException e) {
Log.e(TAG, "Error while trying to display the camera preview", e);
}
} else if (permission.shouldShowRequestPermissionRationale) {
// Denied permission without ask never again
Toast.makeText(MainActivity.this,
"Denied permission without ask never again",
Toast.LENGTH_SHORT).show();
} else {
// Denied permission with ask never again
// Need to go to the settings
Toast.makeText(MainActivity.this,
"Permission denied, can't enable the camera",
Toast.LENGTH_SHORT).show();
}
},
t -> Log.e(TAG, "onError", t),
() -> Log.i(TAG, "OnComplete"));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import android.Manifest;
import android.annotation.TargetApi;
import android.app.Activity;
import android.os.Build;

import com.tbruyelle.rxpermissions3.Permission;
Expand All @@ -28,7 +27,7 @@ public class RxPermissionsSampleTest {

@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
MockitoAnnotations.openMocks(this);
}

@Test
Expand Down