Explorar o código

添加kotlin jar包

yanyi %!s(int64=4) %!d(string=hai) anos
pai
achega
eb9b0f6ed4

+ 2 - 1
app/build.gradle

@@ -24,5 +24,6 @@ dependencies {
     testImplementation 'junit:junit:4.12'
     androidTestImplementation 'androidx.test.ext:junit:1.1.1'
     androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0'
-    implementation project(':permissionlib')
+    implementation project(':permission-kt')
+//    implementation project(':permissionlib')
 }

+ 11 - 39
app/src/main/java/com/yanyi/basepermission/MainActivity.java

@@ -7,13 +7,8 @@ import android.util.Log;
 import androidx.annotation.Nullable;
 import androidx.appcompat.app.AppCompatActivity;
 
-import com.benyanyi.permissionlib.PermissionBind;
-import com.benyanyi.permissionlib.PermissionDialogInfo;
-import com.benyanyi.permissionlib.annotation.GetPermissionComplete;
-import com.benyanyi.permissionlib.annotation.GetPermissionDialogInfo;
-import com.benyanyi.permissionlib.annotation.GetPermissionFailure;
-import com.benyanyi.permissionlib.annotation.GetPermissionSuccess;
-import com.benyanyi.permissionlib.annotation.GetPermissions;
+import com.benyanyi.permission.kt.PermissionHelper;
+import com.benyanyi.permission.kt.callback.PermissionAction;
 
 /**
  * @author myLove
@@ -21,41 +16,24 @@ import com.benyanyi.permissionlib.annotation.GetPermissions;
  * @email ben@yanyi.red
  * @overview
  */
-@GetPermissions({Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.READ_PHONE_STATE})
 public class MainActivity extends AppCompatActivity {
 
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.act_main);
-        PermissionBind.request(this, this);
-    }
+        PermissionHelper.Companion.getInstance(this)
+                .setPermissions(Manifest.permission.READ_EXTERNAL_STORAGE,
+                        Manifest.permission.READ_EXTERNAL_STORAGE)
+                .request()
+                .onPermissionSuccess(new PermissionAction() {
+                    @Override
+                    public void accept() {
 
-    @GetPermissionSuccess
-    private void success() {
-        log("成功");
+                    }
+                });
     }
 
-    @GetPermissionFailure
-    private void failure(String[] failureMsg) {
-        StringBuilder s = new StringBuilder();
-        for (String str : failureMsg) {
-            s.append(str);
-        }
-        log(s.toString());
-    }
-
-    @GetPermissionComplete
-    private void complete() {
-        log("aaa");
-    }
-
-    @GetPermissionDialogInfo
-    private PermissionDialogInfo setPermissionDialogInfo(PermissionDialogInfo dialogInfo) {
-        dialogInfo.isShow = true;
-        dialogInfo.title = "哈哈哈";
-        return dialogInfo;
-    }
 
     private void log(Object object) {
         Log.d(defaultTag(), object.toString());
@@ -80,10 +58,4 @@ public class MainActivity extends AppCompatActivity {
         }
         return tag;
     }
-
-    private PermissionDialogInfo dialogInfo() {
-        PermissionDialogInfo dialogInfo = new PermissionDialogInfo();
-        dialogInfo.isShow = false;
-        return dialogInfo;
-    }
 }

+ 4 - 0
build.gradle

@@ -2,6 +2,9 @@
 
 buildscript {
 
+    ext {
+        kotlin_version = '1.3.40'
+    }
     repositories {
         google()
         jcenter()
@@ -10,6 +13,7 @@ buildscript {
     dependencies {
         classpath 'com.android.tools.build:gradle:3.2.0'
         classpath 'com.github.dcendents:android-maven-gradle-plugin:2.0'
+        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
 
         // NOTE: Do not place your application dependencies here; they belong
         // in the individual module build.gradle files

+ 1 - 0
permission-kt/.gitignore

@@ -0,0 +1 @@
+/build

+ 43 - 0
permission-kt/build.gradle

@@ -0,0 +1,43 @@
+apply plugin: 'com.android.library'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+    compileSdkVersion 30
+    buildToolsVersion "30.0.3"
+
+    defaultConfig {
+        minSdkVersion 15
+        targetSdkVersion 30
+        versionCode 1
+        versionName "1.0"
+
+        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+        consumerProguardFiles "consumer-rules.pro"
+    }
+
+    buildTypes {
+        release {
+            minifyEnabled false
+            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+        }
+    }
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_8
+        targetCompatibility JavaVersion.VERSION_1_8
+    }
+    kotlinOptions {
+        jvmTarget = '1.8'
+    }
+}
+
+dependencies {
+
+    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
+    implementation 'androidx.core:core-ktx:1.3.2'
+    implementation 'androidx.appcompat:appcompat:1.2.0'
+    implementation 'com.google.android.material:material:1.2.1'
+    testImplementation 'junit:junit:4.+'
+    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
+    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
+}

+ 0 - 0
permission-kt/consumer-rules.pro


+ 21 - 0
permission-kt/proguard-rules.pro

@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+#   public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile

+ 24 - 0
permission-kt/src/androidTest/java/com/benyanyi/permission/kt/ExampleInstrumentedTest.kt

@@ -0,0 +1,24 @@
+package com.benyanyi.permission.kt
+
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.ext.junit.runners.AndroidJUnit4
+
+import org.junit.Test
+import org.junit.runner.RunWith
+
+import org.junit.Assert.*
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+@RunWith(AndroidJUnit4::class)
+class ExampleInstrumentedTest {
+    @Test
+    fun useAppContext() {
+        // Context of the app under test.
+        val appContext = InstrumentationRegistry.getInstrumentation().targetContext
+        assertEquals("com.benyanyi.permissionlib.test", appContext.packageName)
+    }
+}

+ 5 - 0
permission-kt/src/main/AndroidManifest.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.benyanyi.permission.kt">
+
+</manifest>

+ 27 - 0
permission-kt/src/main/java/com/benyanyi/permission/kt/PermissionConfig.kt

@@ -0,0 +1,27 @@
+package com.benyanyi.permission.kt
+
+import com.benyanyi.permission.kt.info.PermissionDialogInfo
+
+/**
+ * @author YanYi
+ * @date 2019/5/24 11:47
+ * @email ben@yanyi.red
+ * @overview
+ */
+interface PermissionConfig {
+    /**
+     * 添加权限
+     *
+     * @param permissions 权限
+     * @return
+     */
+    fun setPermissions(vararg permissions: String): PermissionConfig
+
+    /**
+     * 设置权限弹窗
+     */
+    fun setPermissionDialogInfo(info: PermissionDialogInfo): PermissionConfig
+
+    fun request(): PermissionRequest
+
+}

+ 180 - 0
permission-kt/src/main/java/com/benyanyi/permission/kt/PermissionFragment.kt

@@ -0,0 +1,180 @@
+package com.benyanyi.permission.kt
+
+import android.app.AlertDialog
+import android.content.Intent
+import android.content.pm.PackageManager
+import android.content.pm.PermissionInfo
+import android.os.Build
+import android.os.Bundle
+import android.text.TextUtils
+import androidx.core.app.ActivityCompat
+import androidx.core.content.ContextCompat
+import androidx.fragment.app.Fragment
+import com.benyanyi.permission.kt.callback.PermissionCallBack
+import com.benyanyi.permission.kt.info.PermissionDialogInfo
+
+/**
+ * @author YanYi
+ * @date 2021/3/22 14:43
+ * @email ben@yanyi.red
+ * @overview
+ */
+class PermissionFragment : Fragment() {
+
+    private val code1 = 0x101
+    private val code2 = 0x102
+    private val requestCode = 0x103
+
+    private var permissions: Array<out String>? = null
+    private val oList = arrayListOf<String>()
+    private var callBack: PermissionCallBack? = null
+
+    private var info: PermissionDialogInfo? = null
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        retainInstance = true
+    }
+
+    fun setPermissions(permissions: Array<out String>) {
+        this.permissions = permissions
+    }
+
+    fun setPermissionInfo(permissionInfo: PermissionDialogInfo) {
+        this.info = permissionInfo
+    }
+
+    fun startForPermissionResult(request: PermissionRequest) {
+        this.callBack = request.getCallBack()
+        if (checkPermission()) {
+            callBack?.onPermissionSuccess()
+            callBack?.onPermissionComplete()
+        } else {
+            requestPermission(code1)
+        }
+    }
+
+    /**
+     * 判断权限是否拥有
+     *
+     * @return 权限是否获取(获取true)
+     */
+    private fun checkPermission(): Boolean {
+        oList.clear()
+        if (permissions != null && permissions!!.isNotEmpty()) {
+            return true
+        }
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+            permissions?.forEach {
+                if (ContextCompat.checkSelfPermission(requireContext(), it) != PackageManager.PERMISSION_GRANTED) {
+                    if (!oList.contains(it)) {
+                        oList.add(it)
+                    }
+                }
+            }
+        } else {
+            permissions?.forEach {
+                if (ActivityCompat.checkSelfPermission(requireContext(), it) != PackageManager.PERMISSION_GRANTED) {
+                    if (!oList.contains(it)) {
+                        oList.add(it)
+                    }
+                }
+            }
+        }
+        return oList.isEmpty()
+    }
+
+    private fun requestPermission(code: Int) {
+        requestPermissions(permissions!!, code)
+    }
+
+    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
+        super.onActivityResult(requestCode, resultCode, data)
+        if (this.requestCode == requestCode) {
+            requestPermission(code2)
+        }
+    }
+
+    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
+        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+        val list = hasAllPermissionsGranted(permissions, grantResults)
+        val boo = list.isEmpty() && (code1 == requestCode || code2 == requestCode)
+        if (boo) {
+            callBack?.onPermissionSuccess()
+            callBack?.onPermissionComplete()
+        } else {
+            this.oList.clear()
+            list.forEach {
+                oList.add(it)
+            }
+            if (code1 == requestCode) {
+                val isShow = info?.isShow ?: false
+                if (isShow) {
+                    showDialog()
+                } else {
+                    callBack?.onPermissionFailure(oList.toTypedArray())
+                    callBack?.onPermissionComplete()
+                }
+            } else if (code2 == requestCode) {
+                callBack?.onPermissionFailure(oList.toTypedArray())
+                callBack?.onPermissionComplete()
+            }
+        }
+    }
+
+    private fun hasAllPermissionsGranted(permissions: Array<out String>, grantResults: IntArray): List<String> {
+        val list = arrayListOf<String>()
+        if (grantResults.isEmpty()) {
+            return list
+        }
+        for (i in grantResults.indices) {
+            if (grantResults[i] == PackageManager.PERMISSION_DENIED) {
+                list.add(permissions[i])
+            }
+        }
+        return list
+    }
+
+    /**
+     * 权限请求拒绝后弹窗
+     * Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
+     * intent.setData(Uri.parse("package:" + getActivity().getPackageName()));
+     * getActivity().startActivityForResult(intent, requestCode);
+     */
+    private fun showDialog() {
+        val builder = AlertDialog.Builder(activity)
+        val title = info?.title ?: "权限不足"
+        val message = info?.message ?: "需要必须的权限才能正常使用本应用"
+        val positiveText = info?.positiveText ?: "重新获取权限"
+        val negativeText = info?.negativeText ?: "退出"
+        val isShow = info?.isShow ?: false
+        val negativeClick: PermissionDialogInfo.NegativeClick? = info?.negativeClick
+        val positiveClick: PermissionDialogInfo.PositiveClick? = info?.positiveClick
+        builder.setTitle(title)
+        builder.setMessage(message)
+        builder.setCancelable(false)
+        builder.setPositiveButton(positiveText) { dialog, _ ->
+            if (positiveClick != null) {
+                positiveClick.onClick(dialog, oList.toTypedArray())
+            } else {
+                dialog.dismiss()
+                requestPermission(code2)
+            }
+        }
+        builder.setNegativeButton(negativeText) { dialog, _ ->
+            if (negativeClick != null) {
+                negativeClick.onClick(dialog, oList.toTypedArray())
+            } else {
+                dialog.dismiss()
+                callBack?.onPermissionFailure(oList.toTypedArray())
+                callBack?.onPermissionComplete()
+            }
+        }
+        if (isShow) {
+            builder.show()
+        } else {
+            callBack?.onPermissionFailure(oList.toTypedArray())
+            callBack?.onPermissionComplete()
+        }
+    }
+}

+ 69 - 0
permission-kt/src/main/java/com/benyanyi/permission/kt/PermissionHelper.kt

@@ -0,0 +1,69 @@
+package com.benyanyi.permission.kt
+
+import androidx.appcompat.app.AppCompatActivity
+import com.benyanyi.permission.kt.info.PermissionDialogInfo
+
+/**
+ * @author YanYi
+ * @date 2021/3/22 14:38
+ * @email ben@yanyi.red
+ * @overview
+ */
+class PermissionHelper : PermissionConfig {
+
+
+    companion object {
+
+        private var instance: PermissionConfig? = null
+        private lateinit var mActivity: AppCompatActivity
+
+        fun getInstance(activity: AppCompatActivity): PermissionConfig {
+            if (instance == null) {
+                mActivity = activity
+                instance = PermissionHelper()
+            }
+            if (activity != mActivity) {
+                mActivity = activity
+                instance = PermissionHelper()
+            }
+            return instance!!
+        }
+    }
+
+    private val tag = "PermissionHelper"
+
+    private val fragment: PermissionFragment by lazy {
+        val findFragmentByTag = mActivity.supportFragmentManager.findFragmentByTag(tag)
+        if (findFragmentByTag == null || findFragmentByTag !is PermissionFragment) {
+            val permissionFragment = PermissionFragment()
+            val supportFragmentManager = mActivity.supportFragmentManager
+            supportFragmentManager.beginTransaction()
+                    .add(permissionFragment, tag)
+                    .commitAllowingStateLoss()
+            supportFragmentManager.executePendingTransactions()
+            permissionFragment
+        } else {
+            findFragmentByTag
+        }
+    }
+
+    private val request by lazy {
+        PermissionRequest()
+    }
+
+    override fun setPermissions(vararg permissions: String): PermissionConfig {
+        fragment.setPermissions(permissions)
+        return this
+    }
+
+    override fun setPermissionDialogInfo(info: PermissionDialogInfo): PermissionConfig {
+        fragment.setPermissionInfo(info)
+        return this
+    }
+
+
+    override fun request(): PermissionRequest {
+        fragment.startForPermissionResult(request)
+        return request
+    }
+}

+ 49 - 0
permission-kt/src/main/java/com/benyanyi/permission/kt/PermissionRequest.kt

@@ -0,0 +1,49 @@
+package com.benyanyi.permission.kt
+
+import com.benyanyi.permission.kt.callback.PermissionAction
+import com.benyanyi.permission.kt.callback.PermissionCallBack
+import com.benyanyi.permission.kt.callback.PermissionConsumer
+
+/**
+ * @author YanYi
+ * @date 2021/3/22 15:34
+ * @email ben@yanyi.red
+ * @overview
+ */
+class PermissionRequest {
+
+    private val callBack by lazy {
+        object : PermissionCallBack {
+            override fun onPermissionSuccess() {
+                successAction?.accept()
+            }
+
+            override fun onPermissionFailure(permissions: Array<out String>) {
+                failureConsumer?.accept(permissions)
+            }
+
+            override fun onPermissionComplete() {
+                completeAction?.accept()
+            }
+        }
+    }
+    private var successAction: PermissionAction? = null
+    private var failureConsumer: PermissionConsumer<Array<out String>>? = null
+    private var completeAction: PermissionAction? = null
+
+    fun getCallBack(): PermissionCallBack {
+        return callBack
+    }
+
+    fun onPermissionSuccess(action: PermissionAction) {
+        this.successAction = action
+    }
+
+    fun onPermissionFailure(consumer: PermissionConsumer<Array<out String>>) {
+        this.failureConsumer = consumer
+    }
+
+    fun onPermissionComplete(action: PermissionAction) {
+        this.completeAction = action
+    }
+}

+ 11 - 0
permission-kt/src/main/java/com/benyanyi/permission/kt/callback/PermissionAction.kt

@@ -0,0 +1,11 @@
+package com.benyanyi.permission.kt.callback
+
+/**
+ * @author YanYi
+ * @date 2021/3/22 16:15
+ * @email ben@yanyi.red
+ * @overview
+ */
+interface PermissionAction {
+    fun accept()
+}

+ 26 - 0
permission-kt/src/main/java/com/benyanyi/permission/kt/callback/PermissionCallBack.kt

@@ -0,0 +1,26 @@
+package com.benyanyi.permission.kt.callback
+
+import com.benyanyi.permission.kt.msg.FailureMsg
+
+/**
+ * @author YanYi
+ * @date 2021/3/22 16:16
+ * @email ben@yanyi.red
+ * @overview
+ */
+interface PermissionCallBack {
+    /**
+     * 拥有所有权限
+     */
+    fun onPermissionSuccess()
+
+    /**
+     * 没有拥有所有权限
+     */
+    fun onPermissionFailure(permissions: Array<out String>)
+
+    /**
+     * 申请权限后执行该操作,不管有没有获取到所有权限
+     */
+    fun onPermissionComplete()
+}

+ 11 - 0
permission-kt/src/main/java/com/benyanyi/permission/kt/callback/PermissionConsumer.kt

@@ -0,0 +1,11 @@
+package com.benyanyi.permission.kt.callback
+
+/**
+ * @author YanYi
+ * @date 2021/3/22 16:14
+ * @email ben@yanyi.red
+ * @overview
+ */
+interface PermissionConsumer<T> {
+    fun accept(t: T)
+}

+ 37 - 0
permission-kt/src/main/java/com/benyanyi/permission/kt/info/PermissionDialogInfo.kt

@@ -0,0 +1,37 @@
+package com.benyanyi.permission.kt.info
+
+import android.content.DialogInterface
+
+/**
+ * @author myLove
+ * @date 2018-06-09 10:02
+ * @email ben@yanyi.red
+ * @overview
+ */
+class PermissionDialogInfo {
+    var title: String? = null
+    var message: String? = null
+    var positiveText: String? = null
+    var negativeText: String? = null
+    var isShow = true
+    var positiveClick: PositiveClick? = null
+    var negativeClick: NegativeClick? = null
+
+    interface PositiveClick : PermissionDialogOnClick {
+        /**
+         * 点击
+         *
+         * @param failurePermissions
+         */
+        override fun onClick(dialog: DialogInterface, failurePermissions: Array<String>)
+    }
+
+    interface NegativeClick : PermissionDialogOnClick {
+        /**
+         * 点击
+         *
+         * @param failurePermissions
+         */
+        override fun onClick(dialog: DialogInterface, failurePermissions: Array<String>)
+    }
+}

+ 18 - 0
permission-kt/src/main/java/com/benyanyi/permission/kt/info/PermissionDialogOnClick.kt

@@ -0,0 +1,18 @@
+package com.benyanyi.permission.kt.info
+
+import android.content.DialogInterface
+
+/**
+ * @author YanYi
+ * @date 2019/5/24 14:20
+ * @email ben@yanyi.red
+ * @overview
+ */
+interface PermissionDialogOnClick {
+    /**
+     * 点击
+     *
+     * @param failurePermissions
+     */
+    fun onClick(dialog: DialogInterface, failurePermissions: Array<String>)
+}

+ 17 - 0
permission-kt/src/test/java/com/benyanyi/permission/kt/ExampleUnitTest.kt

@@ -0,0 +1,17 @@
+package com.benyanyi.permission.kt
+
+import org.junit.Test
+
+import org.junit.Assert.*
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+class ExampleUnitTest {
+    @Test
+    fun addition_isCorrect() {
+        assertEquals(4, 2 + 2)
+    }
+}

+ 1 - 0
settings.gradle

@@ -1 +1,2 @@
+include ':permission-kt'
 include ':app', ':permissionlib'