From 6245d459fee01af27f5eaa6c0f8ae5ec9ca583db Mon Sep 17 00:00:00 2001 From: KnightWood <33772264+Knightwood@users.noreply.github.com> Date: Sat, 28 Sep 2024 18:12:56 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9C=A8component=20activity=E4=B8=AD=E4=B9=9F?= =?UTF-8?q?=E8=83=BD=E7=94=B3=E8=AF=B7=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 35 +++++--- .../app/ExampleComponentActivity.kt | 81 +++++++++++++++++++ .../java/com/permissionx/app/MainFragment.kt | 34 +++++++- .../com/permissionx/app/MainJavaActivity.java | 41 +++++++++- .../res/layout/activity_example_component.xml | 13 +++ .../main/res/layout/activity_main_java.xml | 8 ++ app/src/main/res/layout/fragment_main.xml | 15 ++++ gradle/libs.versions.toml | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- permissionx/src/main/AndroidManifest.xml | 5 ++ .../permissionx/guolindev/PermissionX.java | 33 ++++++++ .../guolindev/patch/DelegateActivity.kt | 51 ++++++++++++ .../patch/PermissionDelegateHolder.kt | 62 ++++++++++++++ .../guolindev/request/PermissionBuilder.kt | 6 ++ 14 files changed, 366 insertions(+), 22 deletions(-) create mode 100644 app/src/main/java/com/permissionx/app/ExampleComponentActivity.kt create mode 100644 app/src/main/res/layout/activity_example_component.xml create mode 100644 permissionx/src/main/java/com/permissionx/guolindev/patch/DelegateActivity.kt create mode 100644 permissionx/src/main/java/com/permissionx/guolindev/patch/PermissionDelegateHolder.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7b58c90..0e73156 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -36,14 +36,18 @@ - + - - @@ -53,9 +57,9 @@ - - - + + + - - + + --> + + + \ No newline at end of file diff --git a/app/src/main/java/com/permissionx/app/ExampleComponentActivity.kt b/app/src/main/java/com/permissionx/app/ExampleComponentActivity.kt new file mode 100644 index 0000000..affb5fa --- /dev/null +++ b/app/src/main/java/com/permissionx/app/ExampleComponentActivity.kt @@ -0,0 +1,81 @@ +package com.permissionx.app + +import android.Manifest +import android.graphics.Color +import android.os.Bundle +import android.widget.Toast +import androidx.activity.ComponentActivity +import com.permissionx.app.databinding.ActivityExampleComponentBinding +import com.permissionx.guolindev.PermissionX +import com.permissionx.guolindev.patch.PermissionDelegateHolder + +class ExampleComponentActivity : ComponentActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + val layout = ActivityExampleComponentBinding.inflate(layoutInflater) + layout.makeRequestBtn.setOnClickListener { + + PermissionX.init(this) { + it.permissions(Manifest.permission.CAMERA) + .request { allGranted, grantedList, deniedList -> + if (allGranted) { + Toast.makeText(this, "All permissions are granted", Toast.LENGTH_SHORT) + .show() + } else { + Toast.makeText( + this, + "The following permissions are denied:$deniedList", + Toast.LENGTH_SHORT + ).show() + } + } + } + // or directly use PermissionDelegateHolder +// requestPerms() + } + setContentView(layout.root) + } + + fun requestPerms() { + PermissionDelegateHolder.delegate(this) { + PermissionX.init(it) + .permissions( + Manifest.permission.CAMERA, + Manifest.permission.ACCESS_FINE_LOCATION, + Manifest.permission.RECORD_AUDIO, +// Manifest.permission.READ_CALENDAR, +// Manifest.permission.READ_CALL_LOG, +// Manifest.permission.READ_CONTACTS, +// Manifest.permission.READ_PHONE_STATE, +// Manifest.permission.BODY_SENSORS, +// Manifest.permission.ACTIVITY_RECOGNITION, +// Manifest.permission.SEND_SMS, +// Manifest.permission.READ_EXTERNAL_STORAGE + ) + .setDialogTintColor(Color.parseColor("#1972e8"), Color.parseColor("#8ab6f5")) + .onExplainRequestReason { scope, deniedList, beforeRequest -> + val message = "PermissionX needs following permissions to continue" + scope.showRequestReasonDialog(deniedList, message, "Allow", "Deny") +// val message = "Please allow the following permissions in settings" +// val dialog = CustomDialogFragment(message, deniedList) +// scope.showRequestReasonDialog(dialog) + } + .onForwardToSettings { scope, deniedList -> + val message = "Please allow following permissions in settings" + scope.showForwardToSettingsDialog(deniedList, message, "Allow", "Deny") + } + .request { allGranted, grantedList, deniedList -> + if (allGranted) { + Toast.makeText(it, "All permissions are granted", Toast.LENGTH_SHORT) + .show() + } else { + Toast.makeText( + it, + "The following permissions are denied:$deniedList", + Toast.LENGTH_SHORT + ).show() + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/permissionx/app/MainFragment.kt b/app/src/main/java/com/permissionx/app/MainFragment.kt index be3fff9..3139b2a 100644 --- a/app/src/main/java/com/permissionx/app/MainFragment.kt +++ b/app/src/main/java/com/permissionx/app/MainFragment.kt @@ -1,6 +1,7 @@ package com.permissionx.app import android.Manifest +import android.content.Intent import android.graphics.Color import android.os.Bundle import android.view.LayoutInflater @@ -17,7 +18,11 @@ class MainFragment : Fragment() { private val binding get() = _binding!! - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { _binding = FragmentMainBinding.inflate(inflater, container, false) return binding.root } @@ -28,7 +33,7 @@ class MainFragment : Fragment() { binding.makeRequestBtn.setOnClickListener { PermissionX.init(this) .permissions( - Manifest.permission.CAMERA, + Manifest.permission.CAMERA, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.RECORD_AUDIO, // Manifest.permission.READ_CALENDAR, @@ -54,12 +59,33 @@ class MainFragment : Fragment() { } .request { allGranted, grantedList, deniedList -> if (allGranted) { - Toast.makeText(activity, "All permissions are granted", Toast.LENGTH_SHORT).show() + Toast.makeText(activity, "All permissions are granted", Toast.LENGTH_SHORT) + .show() } else { - Toast.makeText(activity, "The following permissions are denied:$deniedList", Toast.LENGTH_SHORT).show() + Toast.makeText( + activity, + "The following permissions are denied:$deniedList", + Toast.LENGTH_SHORT + ).show() } } } + binding.makeRequestBtn2.setOnClickListener { + requireActivity().startActivity( + Intent( + requireActivity(), + ExampleComponentActivity::class.java + ) + ) + } + binding.makeRequestBtn3.setOnClickListener { + requireActivity().startActivity( + Intent( + requireActivity(), + MainJavaActivity::class.java + ) + ) + } } override fun onDestroyView() { diff --git a/app/src/main/java/com/permissionx/app/MainJavaActivity.java b/app/src/main/java/com/permissionx/app/MainJavaActivity.java index b38d871..b59cbdd 100644 --- a/app/src/main/java/com/permissionx/app/MainJavaActivity.java +++ b/app/src/main/java/com/permissionx/app/MainJavaActivity.java @@ -5,9 +5,15 @@ import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; +import androidx.fragment.app.FragmentActivity; import com.permissionx.app.databinding.ActivityMainJavaBinding; +import com.permissionx.guolindev.PermissionMediator; import com.permissionx.guolindev.PermissionX; +import com.permissionx.guolindev.patch.PermissionDelegateHolder; + +import kotlin.Unit; +import kotlin.jvm.functions.Function1; public class MainJavaActivity extends AppCompatActivity { @@ -16,11 +22,40 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ActivityMainJavaBinding binding = ActivityMainJavaBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); - binding.makeRequestBtn.setOnClickListener(view -> PermissionX.init(MainJavaActivity.this) + + binding.makeRequestBtn.setOnClickListener(view -> { + requestCameraPermission(MainJavaActivity.this); + }); + + binding.makeRequestBtn2.setOnClickListener(view -> { + PermissionX.init(this, permissionMediator -> { + permissionMediator + .permissions(Manifest.permission.WRITE_EXTERNAL_STORAGE) + .explainReasonBeforeRequest() + .request((allGranted, grantedList, deniedList) -> { + if (allGranted) { + Toast.makeText(MainJavaActivity.this, "All permissions are granted", Toast.LENGTH_SHORT).show(); + } else { + Toast.makeText(MainJavaActivity.this, "The following permissions are denied:" + deniedList, Toast.LENGTH_SHORT).show(); + } + }); + return null; + }); + + // or directly use PermissionDelegateHolder +// PermissionDelegateHolder.delegate(this, fragmentActivity -> { +// requestCameraPermission(fragmentActivity);// use the activity argument, do not use MainJavaActivity.this +// return null; +// }); + }); + } + + private void requestCameraPermission(FragmentActivity activity) { + PermissionX.init(activity) .permissions(Manifest.permission.WRITE_EXTERNAL_STORAGE) .explainReasonBeforeRequest() .onExplainRequestReason((scope, deniedList, beforeRequest) -> { -// CustomDialog customDialog = new CustomDialog(MainJavaActivity.this, "PermissionX needs following permissions to continue", deniedList); +// CustomDialog customDialog = new CustomDialog(activity, "PermissionX needs following permissions to continue", deniedList); // scope.showRequestReasonDialog(customDialog); scope.showRequestReasonDialog(deniedList, "PermissionX needs following permissions to continue", "Allow"); }) @@ -33,6 +68,6 @@ protected void onCreate(Bundle savedInstanceState) { } else { Toast.makeText(MainJavaActivity.this, "The following permissions are denied:" + deniedList, Toast.LENGTH_SHORT).show(); } - })); + }); } } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_example_component.xml b/app/src/main/res/layout/activity_example_component.xml new file mode 100644 index 0000000..7ec095b --- /dev/null +++ b/app/src/main/res/layout/activity_example_component.xml @@ -0,0 +1,13 @@ + + + +