add PermissionExt Test

This commit is contained in:
luyao 2019-06-21 16:29:02 +08:00
parent 9e883b4d79
commit e9381c468b
11 changed files with 131 additions and 23 deletions

View File

@ -4,6 +4,11 @@
package="luyao.ktx">
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.READ_CALENDAR"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<application
android:allowBackup="true"
@ -24,6 +29,7 @@
<activity android:name="luyao.util.ktx.ui.ExtActivity"/>
<activity android:name="luyao.util.ktx.ui.ToastExtActivity"/>
<activity android:name="luyao.util.ktx.ui.IntentExtActivity"/>
<activity android:name="luyao.util.ktx.ui.PermissionExtActivity"/>
</application>
</manifest>

View File

@ -15,6 +15,7 @@ class ExtActivity : CommonListActivity() {
add(ItemBean("ToastExt", ToastExtActivity::class.java))
add(ItemBean("AppExt", ToastExtActivity::class.java))
add(ItemBean("IntentExt", IntentExtActivity::class.java))
add(ItemBean("PermissionExt",PermissionExtActivity::class.java))
}
}

View File

@ -0,0 +1,56 @@
package luyao.util.ktx.ui
import android.Manifest
import com.afollestad.materialdialogs.MaterialDialog
import kotlinx.android.synthetic.main.activity_permission_ext.*
import luyao.ktx.R
import luyao.util.ktx.base.BaseActivity
import luyao.util.ktx.ext.goToAppInfoPage
import luyao.util.ktx.ext.permission.PermissionRequest
import luyao.util.ktx.ext.permission.request
import luyao.util.ktx.ext.toast
/**
* Created by luyao
* on 2019/6/21 14:28
*/
class PermissionExtActivity : BaseActivity() {
override fun getLayoutResId() = R.layout.activity_permission_ext
override fun initView() {
requestCamera.setOnClickListener { requestCameraPermission() }
requestCalendarAndAudio.setOnClickListener { requestCalendarAndAudioPermission() }
}
override fun initData() {
}
private fun requestCameraPermission() {
request(Manifest.permission.CAMERA) {
onGranted { toast("onGranted") }
onDenied { toast("onDenied") }
onShowRationale { showRationale(it) }
onNeverAskAgain { goToAppInfoPage() }
}
}
private fun showRationale(request: PermissionRequest) {
MaterialDialog(this).show {
title = "Request Permission"
message(text = "We need permission to provide normal service. Do you agree ?")
positiveButton(R.string.agree) { request.retry() }
negativeButton(R.string.disagree)
}
}
private fun requestCalendarAndAudioPermission() {
request(Manifest.permission.READ_CALENDAR, Manifest.permission.RECORD_AUDIO) {
onGranted { toast("onGranted") }
onDenied { toast("onDenied") }
onShowRationale { showRationale(it) }
onNeverAskAgain { goToAppInfoPage() }
}
}
}

View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<include layout="@layout/title_layout"/>
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/requestCamera"
style="@style/NormalButton"
android:text="request Camera"/>
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/requestCalendarAndAudio"
style="@style/NormalButton"
android:text="request Calendar &amp;&amp; Recode Audio"/>
</LinearLayout>

View File

@ -11,7 +11,7 @@
<item name="android:layout_marginLeft">10dp</item>
<item name="android:layout_marginRight">10dp</item>
<item name="android:textSize">16sp</item>
<item name="android:textColor">@color/white</item>
<item name="android:background">#333</item>
<item name="android:textColor">@color/black</item>
<item name="android:background">@drawable/ripple</item>
</style>
</resources>

View File

@ -1,4 +1,6 @@
<resources>
<string name="app_name">AndroidUtilCodeKTX</string>
<string name="groot">I am groot.</string>
<string name="agree">Agree</string>
<string name="disagree">Disgree</string>
</resources>

View File

@ -1,9 +1,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="luyao.util.ktx">
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
<application android:name=".KtxApp">

View File

@ -10,8 +10,6 @@ import androidx.fragment.app.Fragment
*/
class KtxPermissionFragment : Fragment() {
private val PERMISSION_REQUEST_CODE = 0XFF
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
retainInstance = true

View File

@ -6,22 +6,23 @@ import android.os.Build
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.Observer
import com.jeremyliao.liveeventbus.LiveEventBus
/**
* Created by luyao
* on 2019/6/18 15:47
*/
fun FragmentActivity.request(vararg permissions: String) {
ActivityCompat.requestPermissions(this, permissions, 0XFF)
}
fun FragmentActivity.request(vararg permissions: String, callbacks: PermissionsCallbackDSL.() -> Unit) {
val permissionsCallback = PermissionsCallbackDSL().apply { callbacks() }
val requestCode = PermissionsMap.put(permissionsCallback)
val needRequestPermissions = permissions.filter { !isGranted(it) }
if (needRequestPermissions.isEmpty()) {
// onGranted
permissionsCallback.onGranted()
} else {
val shouldShowRationalePermissions = mutableListOf<String>()
@ -34,21 +35,32 @@ fun FragmentActivity.request(vararg permissions: String, callbacks: PermissionsC
}
if (shouldShowRationalePermissions.isNotEmpty()) {
// shouldShowRequestPermissionRationale
permissionsCallback.onShowRationale(shouldShowRationalePermissions)
permissionsCallback.onShowRationale(
PermissionRequest(
getKtxPermissionFragment(this),
shouldShowRationalePermissions,
requestCode
)
)
}
val requestCode = PermissionsMap.put(permissionsCallback)
if (shouldNotShowRationalePermissions.isNotEmpty()) {
val ktxPermissionFragment = KtxPermissionFragment()
supportFragmentManager.beginTransaction().add(ktxPermissionFragment,"ktx").commitNow()
ktxPermissionFragment.requestPermissionsByFragment(shouldNotShowRationalePermissions.toTypedArray(),requestCode)
getKtxPermissionFragment(this).requestPermissionsByFragment(
shouldNotShowRationalePermissions.toTypedArray(),
requestCode
)
}
}
}
private fun startObserve(permissionsCallback: PermissionsCallbackDSL){
private fun getKtxPermissionFragment(activity: FragmentActivity): KtxPermissionFragment {
var fragment = activity.supportFragmentManager.findFragmentByTag("ktx")
if (fragment == null) {
fragment = KtxPermissionFragment()
activity.supportFragmentManager.beginTransaction().add(fragment, "ktx").commitNow()
}
return fragment as KtxPermissionFragment
}

View File

@ -0,0 +1,16 @@
package luyao.util.ktx.ext.permission
/**
* Created by luyao
* on 2019/6/21 15:28
*/
data class PermissionRequest(
val permissionFragment: KtxPermissionFragment,
val permissions: List<String>,
val requestCode: Int
) {
fun retry() {
permissionFragment.requestPermissionsByFragment(permissions.toTypedArray(), requestCode)
}
}

View File

@ -6,7 +6,7 @@ interface PermissionsCallback {
fun onDenied(permissions: List<String>)
fun onShowRationale(permissions: List<String>)
fun onShowRationale(request: PermissionRequest)
fun onNeverAskAgain(permissions: List<String>)
}
@ -18,7 +18,7 @@ class PermissionsCallbackDSL : PermissionsCallback {
private var onGranted: () -> Unit = {}
private var onDenied: (permissions: List<String>) -> Unit = {}
private var onShowRationale: (permissions: List<String>) -> Unit = {}
private var onShowRationale: (request: PermissionRequest) -> Unit = {}
private var onNeverAskAgain: (permissions: List<String>) -> Unit = {}
fun onGranted(func: () -> Unit) {
@ -29,7 +29,7 @@ class PermissionsCallbackDSL : PermissionsCallback {
onDenied = func
}
fun onShowRationale(func: (permissions: List<String>) -> Unit) {
fun onShowRationale(func: (request: PermissionRequest) -> Unit) {
onShowRationale = func
}
@ -45,8 +45,8 @@ class PermissionsCallbackDSL : PermissionsCallback {
onDenied.invoke(permissions)
}
override fun onShowRationale(permissions: List<String>) {
onShowRationale.invoke(permissions)
override fun onShowRationale(request: PermissionRequest) {
onShowRationale.invoke(request)
}
override fun onNeverAskAgain(permissions: List<String>) {