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) {