diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index d4433f7..c167594 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -4,6 +4,11 @@
package="luyao.ktx">
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/luyao/util/ktx/ui/ExtActivity.kt b/app/src/main/java/luyao/util/ktx/ui/ExtActivity.kt
index 373f741..7140149 100644
--- a/app/src/main/java/luyao/util/ktx/ui/ExtActivity.kt
+++ b/app/src/main/java/luyao/util/ktx/ui/ExtActivity.kt
@@ -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))
}
}
diff --git a/app/src/main/java/luyao/util/ktx/ui/PermissionExtActivity.kt b/app/src/main/java/luyao/util/ktx/ui/PermissionExtActivity.kt
new file mode 100644
index 0000000..dbc0982
--- /dev/null
+++ b/app/src/main/java/luyao/util/ktx/ui/PermissionExtActivity.kt
@@ -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() }
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_permission_ext.xml b/app/src/main/res/layout/activity_permission_ext.xml
new file mode 100644
index 0000000..9d181c5
--- /dev/null
+++ b/app/src/main/res/layout/activity_permission_ext.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/mainStyles.xml b/app/src/main/res/values/mainStyles.xml
index 9ba5657..fed0436 100644
--- a/app/src/main/res/values/mainStyles.xml
+++ b/app/src/main/res/values/mainStyles.xml
@@ -11,7 +11,7 @@
- 10dp
- 10dp
- 16sp
- - @color/white
- - #333
+ - @color/black
+ - @drawable/ripple
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 938e7b9..aab2d33 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1,4 +1,6 @@
AndroidUtilCodeKTX
I am groot.
+ Agree
+ Disgree
diff --git a/library/src/main/AndroidManifest.xml b/library/src/main/AndroidManifest.xml
index 9236c3a..19d4057 100644
--- a/library/src/main/AndroidManifest.xml
+++ b/library/src/main/AndroidManifest.xml
@@ -1,9 +1,7 @@
-
-
-
+
diff --git a/library/src/main/java/luyao/util/ktx/ext/permission/KtxPermissionFragment.kt b/library/src/main/java/luyao/util/ktx/ext/permission/KtxPermissionFragment.kt
index 20de210..a84e36a 100644
--- a/library/src/main/java/luyao/util/ktx/ext/permission/KtxPermissionFragment.kt
+++ b/library/src/main/java/luyao/util/ktx/ext/permission/KtxPermissionFragment.kt
@@ -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
diff --git a/library/src/main/java/luyao/util/ktx/ext/permission/PermissionExt.kt b/library/src/main/java/luyao/util/ktx/ext/permission/PermissionExt.kt
index 920c6d1..39de9d3 100644
--- a/library/src/main/java/luyao/util/ktx/ext/permission/PermissionExt.kt
+++ b/library/src/main/java/luyao/util/ktx/ext/permission/PermissionExt.kt
@@ -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()
@@ -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
}
diff --git a/library/src/main/java/luyao/util/ktx/ext/permission/PermissionRequest.kt b/library/src/main/java/luyao/util/ktx/ext/permission/PermissionRequest.kt
new file mode 100644
index 0000000..74fea83
--- /dev/null
+++ b/library/src/main/java/luyao/util/ktx/ext/permission/PermissionRequest.kt
@@ -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,
+ val requestCode: Int
+) {
+
+ fun retry() {
+ permissionFragment.requestPermissionsByFragment(permissions.toTypedArray(), requestCode)
+ }
+}
\ No newline at end of file
diff --git a/library/src/main/java/luyao/util/ktx/ext/permission/PermissionsCallback.kt b/library/src/main/java/luyao/util/ktx/ext/permission/PermissionsCallback.kt
index dc4c1b0..4f33d7c 100644
--- a/library/src/main/java/luyao/util/ktx/ext/permission/PermissionsCallback.kt
+++ b/library/src/main/java/luyao/util/ktx/ext/permission/PermissionsCallback.kt
@@ -6,7 +6,7 @@ interface PermissionsCallback {
fun onDenied(permissions: List)
- fun onShowRationale(permissions: List)
+ fun onShowRationale(request: PermissionRequest)
fun onNeverAskAgain(permissions: List)
}
@@ -18,7 +18,7 @@ class PermissionsCallbackDSL : PermissionsCallback {
private var onGranted: () -> Unit = {}
private var onDenied: (permissions: List) -> Unit = {}
- private var onShowRationale: (permissions: List) -> Unit = {}
+ private var onShowRationale: (request: PermissionRequest) -> Unit = {}
private var onNeverAskAgain: (permissions: List) -> Unit = {}
fun onGranted(func: () -> Unit) {
@@ -29,7 +29,7 @@ class PermissionsCallbackDSL : PermissionsCallback {
onDenied = func
}
- fun onShowRationale(func: (permissions: List) -> Unit) {
+ fun onShowRationale(func: (request: PermissionRequest) -> Unit) {
onShowRationale = func
}
@@ -45,8 +45,8 @@ class PermissionsCallbackDSL : PermissionsCallback {
onDenied.invoke(permissions)
}
- override fun onShowRationale(permissions: List) {
- onShowRationale.invoke(permissions)
+ override fun onShowRationale(request: PermissionRequest) {
+ onShowRationale.invoke(request)
}
override fun onNeverAskAgain(permissions: List) {