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

Commit

Permalink
refactor: small adjustments and removal of some deprecations
Browse files Browse the repository at this point in the history
  • Loading branch information
galuszkak committed Aug 29, 2020
1 parent cc45207 commit 6aa38e1
Show file tree
Hide file tree
Showing 10 changed files with 80 additions and 138 deletions.
8 changes: 4 additions & 4 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ buildscript {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:4.0.0'
classpath 'com.android.tools.build:gradle:4.0.1'
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.0'
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.7'

androidXFragment = 'androidx.fragment:fragment:1.2.5'
androidXAnnotation = 'androidx.annotation:annotation:1.1.0'
androidXAppcompat = 'androidx.appcompat:appcompat:1.1.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();
}
}
85 changes: 30 additions & 55 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 Down Expand Up @@ -97,32 +98,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((Function<List<Permission>, ObservableSource<Boolean>>) 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 +127,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 +138,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((Function<List<Permission>, ObservableSource<Permission>>) permissionsList -> {
if (permissionsList.isEmpty()) {
return Observable.empty();
}
return Observable.just(new Permission(permissionsList));
});
}

/**
Expand Down Expand Up @@ -199,12 +179,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((Function<Object, Observable<Permission>>) observable -> requestImplementation(permissions));
}

private Observable<?> pending(final String... permissions) {
Expand Down Expand Up @@ -286,7 +261,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

0 comments on commit 6aa38e1

Please sign in to comment.