/
PekoActivity.kt
83 lines (73 loc) · 2.95 KB
/
PekoActivity.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package com.markodevcic.peko
import android.os.Bundle
import android.view.WindowManager
import androidx.core.app.ActivityCompat
import androidx.core.content.PermissionChecker
import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.ViewModelProvider
import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.channels.ReceiveChannel
import java.util.concurrent.ConcurrentHashMap
internal class PekoActivity : FragmentActivity(),
ActivityCompat.OnRequestPermissionsResultCallback,
NativeRequester {
private lateinit var viewModel: PekoViewModel
override val resultsChannel: ReceiveChannel<PermissionResult>
get() = viewModel.channel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
window.addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE)
viewModel = ViewModelProvider(this@PekoActivity)[PekoViewModel::class.java]
}
override fun onPostCreate(savedInstanceState: Bundle?) {
super.onPostCreate(savedInstanceState)
val requestId =
intent.getStringExtra("requestId") ?: throw IllegalStateException("missing request Id intent flag")
val completableDeferred = idToRequesterMap.remove(requestId)
completableDeferred?.complete(this)
}
override fun requestPermissions(permissions: Array<out String>) {
ActivityCompat.requestPermissions(this@PekoActivity, permissions, REQUEST_CODE)
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == REQUEST_CODE) {
val grantedPermissions = mutableSetOf<String>()
val deniedPermissions = mutableSetOf<String>()
for (i in permissions.indices) {
val permission = permissions[i]
when (grantResults[i]) {
PermissionChecker.PERMISSION_DENIED, PermissionChecker.PERMISSION_DENIED_APP_OP -> deniedPermissions.add(
permission
)
PermissionChecker.PERMISSION_GRANTED -> grantedPermissions.add(permission)
}
}
val needsRationalePermissions =
deniedPermissions.filter { p -> ActivityCompat.shouldShowRequestPermissionRationale(this, p) }
val doNotAskAgainPermissions = deniedPermissions.filter { p -> !needsRationalePermissions.contains(p) }
if (permissions.isEmpty()) {
viewModel.channel.trySend(PermissionResult.Cancelled)
} else {
for (p in grantedPermissions) {
viewModel.channel.trySend(PermissionResult.Granted(p))
}
for (p in needsRationalePermissions) {
viewModel.channel.trySend(PermissionResult.Denied.NeedsRationale(p))
}
for (p in doNotAskAgainPermissions) {
viewModel.channel.trySend(PermissionResult.Denied.DeniedPermanently(p))
}
}
viewModel.channel.close()
}
}
override fun finish() {
super.finish()
viewModel.channel.close()
}
companion object {
private const val REQUEST_CODE = 931
internal var idToRequesterMap = ConcurrentHashMap<String, CompletableDeferred<NativeRequester>>()
}
}