11package com.simplemobiletools.filemanager.pro.activities
22
3+ import android.annotation.SuppressLint
34import android.app.Activity
45import android.app.SearchManager
56import android.content.ClipData
@@ -8,13 +9,18 @@ import android.content.Intent
89import android.graphics.drawable.ColorDrawable
910import android.graphics.drawable.Drawable
1011import android.media.RingtoneManager
12+ import android.net.Uri
1113import android.os.Bundle
14+ import android.os.Environment
1215import android.os.Handler
16+ import android.provider.Settings
1317import android.view.Menu
1418import android.view.MenuItem
1519import androidx.appcompat.widget.SearchView
1620import androidx.core.view.MenuItemCompat
1721import androidx.viewpager.widget.ViewPager
22+ import com.simplemobiletools.commons.dialogs.ConfirmationAdvancedDialog
23+ import com.simplemobiletools.commons.dialogs.ConfirmationDialog
1824import com.simplemobiletools.commons.dialogs.RadioGroupDialog
1925import com.simplemobiletools.commons.extensions.*
2026import com.simplemobiletools.commons.helpers.*
@@ -46,6 +52,7 @@ import java.util.*
4652
4753class MainActivity : SimpleActivity () {
4854 private val BACK_PRESS_TIMEOUT = 5000
55+ private val MANAGE_STORAGE_RC = 201
4956 private val PICKED_PATH = " picked_path"
5057 private var isSearchOpen = false
5158 private var wasBackJustPressed = false
@@ -282,8 +289,8 @@ class MainActivity : SimpleActivity() {
282289 }
283290
284291 private fun tryInitFileManager () {
285- val hadPermission = hasPermission( PERMISSION_WRITE_STORAGE )
286- handlePermission( PERMISSION_WRITE_STORAGE ) {
292+ val hadPermission = hasStoragePermission( )
293+ handleStoragePermission {
287294 checkOTGPath()
288295 if (it) {
289296 if (main_view_pager.adapter == null ) {
@@ -300,6 +307,56 @@ class MainActivity : SimpleActivity() {
300307 }
301308 }
302309
310+ @SuppressLint(" InlinedApi" )
311+ private fun handleStoragePermission (callback : (granted: Boolean ) -> Unit ) {
312+ actionOnPermission = null
313+ if (hasStoragePermission()) {
314+ callback(true )
315+ } else {
316+ if (isRPlus()) {
317+ ConfirmationAdvancedDialog (this , " " , R .string.access_storage_prompt, R .string.ok, 0 ) { success ->
318+ if (success ) {
319+ isAskingPermissions = true
320+ actionOnPermission = callback
321+ try {
322+ val intent = Intent (Settings .ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION )
323+ intent.addCategory(" android.intent.category.DEFAULT" )
324+ intent.data = Uri .parse(" package:$packageName " )
325+ startActivityForResult(intent, MANAGE_STORAGE_RC )
326+ } catch (e: Exception ) {
327+ showErrorToast(e)
328+ val intent = Intent ()
329+ intent.action = Settings .ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION
330+ startActivityForResult(intent, MANAGE_STORAGE_RC )
331+ }
332+ } else {
333+ finish()
334+ }
335+ }
336+ } else {
337+ handlePermission(PERMISSION_WRITE_STORAGE , callback)
338+ }
339+ }
340+ }
341+
342+ @SuppressLint(" NewApi" )
343+ private fun hasStoragePermission (): Boolean {
344+ return if (isRPlus()) {
345+ Environment .isExternalStorageManager()
346+ } else {
347+ hasPermission(PERMISSION_WRITE_STORAGE )
348+ }
349+ }
350+
351+ @SuppressLint(" NewApi" )
352+ override fun onActivityResult (requestCode : Int , resultCode : Int , resultData : Intent ? ) {
353+ super .onActivityResult(requestCode, resultCode, resultData)
354+ isAskingPermissions = false
355+ if (requestCode == MANAGE_STORAGE_RC && isRPlus()) {
356+ actionOnPermission?.invoke(Environment .isExternalStorageManager())
357+ }
358+ }
359+
303360 private fun initFileManager (refreshRecents : Boolean ) {
304361 if (intent.action == Intent .ACTION_VIEW && intent.data != null ) {
305362 val data = intent.data
0 commit comments