@@ -9,15 +9,17 @@ package com.fox2code.mmm.utils
99import android.annotation.SuppressLint
1010import android.app.Activity
1111import android.content.ActivityNotFoundException
12+ import android.content.ContentResolver
1213import android.content.Context
1314import android.content.ContextWrapper
1415import android.content.Intent
1516import android.net.Uri
1617import android.os.Bundle
18+ import android.os.Environment
1719import android.util.TypedValue
1820import android.widget.Toast
21+ import androidx.activity.result.contract.ActivityResultContracts
1922import androidx.appcompat.app.AppCompatActivity
20- import androidx.core.app.ActivityCompat.startActivityForResult
2123import androidx.core.app.ActivityOptionsCompat
2224import com.fox2code.mmm.BuildConfig
2325import com.fox2code.mmm.Constants
@@ -29,11 +31,17 @@ import com.fox2code.mmm.XHooks.Companion.isModuleActive
2931import com.fox2code.mmm.androidacy.AndroidacyActivity
3032import com.fox2code.mmm.installer.InstallerActivity
3133import com.fox2code.mmm.markdown.MarkdownActivity
34+ import com.fox2code.mmm.utils.io.Files.Companion.closeSilently
35+ import com.fox2code.mmm.utils.io.Files.Companion.copy
3236import com.fox2code.mmm.utils.io.net.Http.Companion.hasWebView
3337import com.topjohnwu.superuser.CallbackList
3438import com.topjohnwu.superuser.Shell
39+ import com.topjohnwu.superuser.io.SuFileInputStream
3540import timber.log.Timber
3641import java.io.File
42+ import java.io.FileOutputStream
43+ import java.io.InputStream
44+ import java.io.OutputStream
3745import java.net.URISyntaxException
3846
3947@Suppress(" unused" )
@@ -364,15 +372,61 @@ enum class IntentHelper {;
364372 callback.onReceived(destination, null , RESPONSE_ERROR )
365373 return
366374 }
367- // start file picker by registering for result. call callback with file and appropriate response
368- // do not use startActivityForResult, it is deprecated
369- val intent = Intent ()
370- .setType(" application/zip" )
371- .setAction(Intent .ACTION_GET_CONTENT )
372-
373- startActivityForResult(
374- compatActivity, intent, RESPONSE_FILE , null
375- )
375+ val getContent = compatActivity.registerForActivityResult(
376+ ActivityResultContracts .GetContent ()
377+ ) { uri: Uri ? ->
378+ if (uri == null ) {
379+ Timber .d(" invalid uri received" )
380+ callback.onReceived(destination, null , RESPONSE_ERROR )
381+ return @registerForActivityResult
382+ }
383+ Timber .i(" FilePicker returned %s" , uri)
384+ if (" http" == uri.scheme || " https" == uri.scheme) {
385+ callback.onReceived(destination, uri, RESPONSE_URL )
386+ return @registerForActivityResult
387+ }
388+ if (ContentResolver .SCHEME_FILE == uri.scheme) {
389+ Toast .makeText(
390+ compatActivity, R .string.file_picker_wierd, Toast .LENGTH_SHORT
391+ ).show()
392+ }
393+ var inputStream: InputStream ? = null
394+ var outputStream: OutputStream ? = null
395+ var success = false
396+ try {
397+ if (ContentResolver .SCHEME_FILE == uri.scheme) {
398+ var path = uri.path
399+ if (path!! .startsWith(" /sdcard/" )) { // Fix file paths
400+ path =
401+ Environment .getExternalStorageDirectory().absolutePath + path.substring(
402+ 7
403+ )
404+ }
405+ inputStream = SuFileInputStream .open(
406+ File (path).absoluteFile
407+ )
408+ } else {
409+ inputStream = compatActivity.contentResolver.openInputStream(uri)
410+ }
411+ outputStream = FileOutputStream (destination)
412+ copy(inputStream!! , outputStream)
413+ Timber .i(" File saved at %s" , destination)
414+ success = true
415+ } catch (e: Exception ) {
416+ Timber .e(e)
417+ Toast .makeText(
418+ compatActivity, R .string.file_picker_failure, Toast .LENGTH_SHORT
419+ ).show()
420+ } finally {
421+ closeSilently(inputStream)
422+ closeSilently(outputStream)
423+ if (! success && destination.exists() && ! destination.delete()) Timber .e(" Failed to delete artifact!" )
424+ }
425+ callback.onReceived(
426+ destination, uri, if (success) RESPONSE_FILE else RESPONSE_ERROR
427+ )
428+ }
429+ getContent.launch(" application/zip" )
376430 }
377431
378432 fun openFileTo (compatActivity : AppCompatActivity , module : File , function : (File , Uri , Int ) -> Unit ) {
@@ -396,4 +450,4 @@ enum class IntentHelper {;
396450 })
397451 }
398452 }
399- }
453+ }
0 commit comments