Skip to content

Commit 18ce7ad

Browse files
committed
Refactor RxPermissions
1 parent f47fc52 commit 18ce7ad

File tree

4 files changed

+92
-92
lines changed

4 files changed

+92
-92
lines changed

app/src/main/java/me/li2/android/commonsample/MainActivity.kt

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
package me.li2.android.commonsample
22

3+
import android.hardware.Sensor
34
import android.os.Bundle
45
import android.widget.Button
56
import androidx.appcompat.app.AppCompatActivity
67
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
78
import io.reactivex.rxjava3.disposables.Disposable
89
import io.reactivex.rxjava3.schedulers.Schedulers
9-
import me.li2.android.common.rx.bluetoothStateChanges
10-
import me.li2.android.common.rx.sdcardStateChanges
10+
import me.li2.android.common.bluetooth.bluetoothStateChanges
1111
import me.li2.android.common.rx.subscribeOnLifecycle
12+
import me.li2.android.common.sdcard.sdcardStateChanges
1213
import me.li2.android.common.sensor.sensorChanges
1314
import timber.log.Timber.d
1415
import java.util.concurrent.TimeUnit
@@ -33,7 +34,7 @@ class MainActivity : AppCompatActivity() {
3334
}
3435

3536
private fun trySensorChangesFlowable() {
36-
sensorDisposable = sensorChanges()
37+
sensorDisposable = sensorChanges(Sensor.TYPE_LINEAR_ACCELERATION)
3738
.doOnSubscribe { d("doOnSubscribe") }
3839
.doOnCancel { d("doOnCancel") }
3940
.throttleFirst(5, TimeUnit.SECONDS)

common/src/main/java/me/li2/android/common/rx/RxBluetooth.kt renamed to common/src/main/java/me/li2/android/common/bluetooth/BluetoothStateChangesObservable.kt

+3-1
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@
44
*/
55
@file:Suppress("unused")
66

7-
package me.li2.android.common.rx
7+
package me.li2.android.common.bluetooth
88

99
import android.annotation.SuppressLint
1010
import android.bluetooth.BluetoothAdapter.*
1111
import android.content.Context
1212
import androidx.fragment.app.FragmentActivity
1313
import io.reactivex.rxjava3.core.Observable
14+
import me.li2.android.common.framework.PermissionResult
15+
import me.li2.android.common.framework.checkAndRequestBluetoothPermission
1416
import me.li2.android.common.framework.onBroadcast
1517
import me.li2.android.common.logic.orFalse
1618

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
/*
2+
* Created by Weiyi Li on 16/03/20.
3+
* https://github.com/li2
4+
*/
5+
@file:Suppress("unused")
6+
7+
package me.li2.android.common.framework
8+
9+
import android.Manifest.permission.*
10+
import android.app.Activity
11+
import android.content.Context
12+
import android.content.DialogInterface
13+
import android.content.pm.PackageManager.PERMISSION_GRANTED
14+
import androidx.appcompat.app.AlertDialog
15+
import androidx.core.content.ContextCompat
16+
import com.tbruyelle.rxpermissions2.RxPermissions
17+
import hu.akarnokd.rxjava3.bridge.RxJavaBridge
18+
import io.reactivex.rxjava3.core.Observable
19+
import me.li2.android.common.framework.PermissionResult.*
20+
import me.li2.android.common.rx.buttonClicks
21+
22+
enum class PermissionResult {
23+
GRANTED,
24+
DENIED,
25+
DENIED_NOT_ASK_AGAIN,
26+
}
27+
28+
fun Context.isPermissionGranted(permission: String): Boolean {
29+
return ContextCompat.checkSelfPermission(this, permission) == PERMISSION_GRANTED
30+
}
31+
32+
fun Activity.requestPermission(permission: String): Observable<PermissionResult> =
33+
requestPermissions(listOf(permission))
34+
35+
fun Activity.requestPermissions(permissions: List<String>): Observable<PermissionResult> =
36+
// todo remove RxJavaBridge when RxPermissions migrated to RxJava3
37+
RxJavaBridge
38+
.toV3Observable(RxPermissions(this).requestEach(*permissions.toTypedArray()))
39+
.map { permission ->
40+
when {
41+
// permission is granted
42+
permission.granted -> GRANTED
43+
// Denied permission without ask never again
44+
permission.shouldShowRequestPermissionRationale -> DENIED
45+
// Denied permission with ask never again, need to go to the settings
46+
else -> DENIED_NOT_ASK_AGAIN
47+
}
48+
}
49+
50+
fun Activity.checkAndRequestPermission(
51+
permission: String,
52+
prompt: AlertDialog? = null
53+
): Observable<PermissionResult> {
54+
return Observable.just(isPermissionGranted(permission))
55+
.flatMap { granted ->
56+
when {
57+
!granted && prompt != null -> {
58+
prompt.also { it.show() }.buttonClicks().flatMap { which ->
59+
if (which == DialogInterface.BUTTON_POSITIVE) {
60+
requestPermission(permission)
61+
} else {
62+
Observable.just(DENIED)
63+
}
64+
}
65+
}
66+
!granted && prompt == null -> requestPermission(permission)
67+
else -> Observable.just(GRANTED)
68+
}
69+
}
70+
}
71+
72+
/*
73+
* ACCESS_FINE_LOCATION for both NETWORK_PROVIDER and GPS_PROVIDER
74+
* ACCESS_COARSE_LOCATION only for NETWORK_PROVIDER.
75+
*/
76+
fun Context.isLocationPermissionGranted(): Boolean = isPermissionGranted(ACCESS_FINE_LOCATION)
77+
78+
fun Activity.checkAndRequestLocationPermission(prompt: AlertDialog? = null): Observable<PermissionResult> =
79+
checkAndRequestPermission(ACCESS_FINE_LOCATION, prompt)
80+
81+
fun Activity.checkAndRequestCameraPermission(prompt: AlertDialog? = null): Observable<PermissionResult> =
82+
checkAndRequestPermission(CAMERA, prompt)
83+
84+
fun Activity.checkAndRequestBluetoothPermission(prompt: AlertDialog? = null): Observable<PermissionResult> =
85+
checkAndRequestPermission(BLUETOOTH, prompt)

common/src/main/java/me/li2/android/common/rx/RxPermissions.kt

-88
This file was deleted.

0 commit comments

Comments
 (0)