package com.scopedstoragepractice import android.Manifest import android.content.Context import android.content.Intent import android.content.pm.PackageManager import android.net.Uri import android.os.Build import android.os.Bundle import android.os.Environment import android.os.storage.StorageManager import android.provider.DocumentsContract import android.util.Log import androidx.activity.result.ActivityResultCallback import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts import androidx.annotation.RequiresApi import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat import androidx.documentfile.provider.DocumentFile import com.scopedstoragepractice.Constants.TAG import com.scopedstoragepractice.databinding.ActivityMainBinding class MainActivity : AppCompatActivity() { lateinit var targetPath: String lateinit var binding: ActivityMainBinding var isLocationGranted: Boolean = false var isReadGranted: Boolean = false var isAudioGranted: Boolean = false lateinit var mPermissionLauncher: ActivityResultLauncher<Array<String>> lateinit var mWhatsLauncher: ActivityResultLauncher<Intent> lateinit var mWhatsLauncherStatus: ActivityResultLauncher<Intent> lateinit var whatsappStatus: String; @RequiresApi(Build.VERSION_CODES.Q) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater); setContentView(binding.root) // mPermissionLauncher = registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()){ permissions-> // isLocationGranted = permissions[Manifest.permission.ACCESS_FINE_LOCATION] ?: isLocationGranted // isReadGranted = permissions[Manifest.permission.READ_EXTERNAL_STORAGE] ?: isReadGranted // isAudioGranted = permissions[Manifest.permission.RECORD_AUDIO] ?: isAudioGranted // } // // requestPermission() mWhatsLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult(), ActivityResultCallback { if (it?.data != null) { val treeUri = it.data!!.data if (treeUri != null){ grantUriPermission(this.packageName,treeUri,Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION) // contentResolver.takePersistableUriPermission(treeUri,Intent.FLAG_GRANT_READ_URI_PERMISSION) getSharedPreferences("MY_PREFS", MODE_PRIVATE).edit().putString("DATA_PATH", treeUri.toString() ).apply() } } }) mWhatsLauncherStatus = registerForActivityResult(ActivityResultContracts.StartActivityForResult(), ActivityResultCallback { if (it?.data != null) { Log.e(TAG, "onCreate: " + it.data!!.data) binding.whatsAppImage.setImageURI(it.data!!.data) } }) binding.btnWhatsApp.setOnClickListener { val result = readfromprefs() if (result){ val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply { addCategory(Intent.CATEGORY_OPENABLE) type = "image/* video/*" // Optionally, specify a URI for the file that should appear in the // system file picker when it loads. putExtra(DocumentsContract.EXTRA_INITIAL_URI, Uri.parse(getSharedPreferences("MY_PREFS", MODE_PRIVATE).getString("DATA_PATH",""))) } mWhatsLauncherStatus.launch(intent) }else{ getFolderPermission() } } } private fun readfromprefs(): Boolean { if (getSharedPreferences("MY_PREFS", MODE_PRIVATE).getString("DATA_PATH","").toString().isEmpty()) return false else return true } @RequiresApi(Build.VERSION_CODES.Q) private fun getFolderPermission() { if (Build.VERSION.SDK_INT < 30) { // Less then 11 targetPath = Environment.getExternalStorageDirectory().absolutePath + "/WhatsApp/Media/.Statuses" } else { // Android 11 targetPath = Environment.getExternalStorageDirectory().absolutePath + "/Android/media/com.whatsapp/WhatsApp/Media/.Statuses" } val storageManager = application.getSystemService(Context.STORAGE_SERVICE) as StorageManager val intent = storageManager.primaryStorageVolume.createOpenDocumentTreeIntent() var uri = intent.getParcelableExtra<Uri>("android.provider.extra.INITIAL_URI") as Uri var scheme = uri.toString() scheme = scheme.replace("/root/", "/document/") scheme += "%3A$targetPath" uri = Uri.parse(scheme) intent.putExtra("android.provider.extra.INITIAL_URI", uri) intent.putExtra("andriod.content.extra.SHOW_ADVANCED", true) mWhatsLauncher.launch(intent) } private fun requestPermission() { isLocationGranted = ContextCompat.checkSelfPermission( this, Manifest.permission.ACCESS_FINE_LOCATION ) == PackageManager.PERMISSION_GRANTED isReadGranted = ContextCompat.checkSelfPermission( this, Manifest.permission.READ_EXTERNAL_STORAGE ) == PackageManager.PERMISSION_GRANTED isAudioGranted = ContextCompat.checkSelfPermission( this, Manifest.permission.RECORD_AUDIO ) == PackageManager.PERMISSION_GRANTED val permissionResuest: MutableList<String> = ArrayList() if (!isLocationGranted) { permissionResuest.add(Manifest.permission.ACCESS_FINE_LOCATION) } if (!isReadGranted) { permissionResuest.add(Manifest.permission.READ_EXTERNAL_STORAGE) } if (!isAudioGranted) { permissionResuest.add(Manifest.permission.RECORD_AUDIO) } if (permissionResuest.isNotEmpty()) { mPermissionLauncher.launch(permissionResuest.toTypedArray()) } } }