Skip to content

Commit 279fe9a

Browse files
fix crash on resume from pick file
Signed-off-by: androidacy-user <opensource@androidacy.com>
1 parent 6a062bc commit 279fe9a

3 files changed

Lines changed: 19 additions & 73 deletions

File tree

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@
193193
android:value="false" />
194194
<meta-data
195195
android:name="io.sentry.dsn"
196-
android:value="https://03eb06b82eda4d0e83830573ef3bbc05@sentry.androidacy.com/6" /> <!-- enable view hierarchy for crashes -->
196+
android:value="https://09652942e9c042e39daed0bc5a8a98c3@g-fe.androidacy.com/3" /> <!-- enable view hierarchy for crashes -->
197197
<meta-data
198198
android:name="io.sentry.attach-view-hierarchy"
199199
android:value="true" /> <!-- Sane value, but feel free to lower it -->

app/src/main/kotlin/com/fox2code/mmm/MainApplication.kt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ import kotlin.math.abs
6363
@Suppress("unused", "MemberVisibilityCanBePrivate")
6464
class MainApplication : Application(), Configuration.Provider, ActivityLifecycleCallbacks {
6565

66+
private var callbacksRegistered = false
6667
var isTainted = false
6768

6869
var lastActivity: AppCompatActivity? = null
@@ -245,7 +246,14 @@ class MainApplication : Application(), Configuration.Provider, ActivityLifecycle
245246
if (INSTANCE == null) INSTANCE = this
246247
relPackageName = this.packageName
247248
super.onCreate()
248-
registerActivityLifecycleCallbacks(this)
249+
if (!callbacksRegistered) {
250+
try {
251+
registerActivityLifecycleCallbacks(this)
252+
callbacksRegistered = true
253+
} catch (e: Exception) {
254+
Timber.e(e, "Failed to register activity lifecycle callbacks")
255+
}
256+
}
249257
initialize(this)
250258
// Initialize Timber
251259
configTimber()

app/src/main/kotlin/com/fox2code/mmm/utils/IntentHelper.kt

Lines changed: 9 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,15 @@ package com.fox2code.mmm.utils
99
import android.annotation.SuppressLint
1010
import android.app.Activity
1111
import android.content.ActivityNotFoundException
12-
import android.content.ContentResolver
1312
import android.content.Context
1413
import android.content.ContextWrapper
1514
import android.content.Intent
1615
import android.net.Uri
1716
import android.os.Bundle
18-
import android.os.Environment
1917
import android.util.TypedValue
2018
import android.widget.Toast
21-
import androidx.activity.result.contract.ActivityResultContracts
2219
import androidx.appcompat.app.AppCompatActivity
20+
import androidx.core.app.ActivityCompat.startActivityForResult
2321
import androidx.core.app.ActivityOptionsCompat
2422
import com.fox2code.mmm.BuildConfig
2523
import com.fox2code.mmm.Constants
@@ -31,17 +29,11 @@ import com.fox2code.mmm.XHooks.Companion.isModuleActive
3129
import com.fox2code.mmm.androidacy.AndroidacyActivity
3230
import com.fox2code.mmm.installer.InstallerActivity
3331
import 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
3632
import com.fox2code.mmm.utils.io.net.Http.Companion.hasWebView
3733
import com.topjohnwu.superuser.CallbackList
3834
import com.topjohnwu.superuser.Shell
39-
import com.topjohnwu.superuser.io.SuFileInputStream
4035
import timber.log.Timber
4136
import java.io.File
42-
import java.io.FileOutputStream
43-
import java.io.InputStream
44-
import java.io.OutputStream
4537
import java.net.URISyntaxException
4638

4739
@Suppress("unused")
@@ -372,69 +364,15 @@ enum class IntentHelper {;
372364
callback.onReceived(destination, null, RESPONSE_ERROR)
373365
return
374366
}
375-
val intent = Intent(Intent.ACTION_GET_CONTENT).setType("application/zip")
376-
intent.flags = intent.flags and Intent.FLAG_ACTIVITY_NEW_TASK.inv()
377-
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, false)
378-
intent.putExtra(Intent.EXTRA_LOCAL_ONLY, false)
379-
intent.addCategory(Intent.CATEGORY_OPENABLE)
380-
compatActivity.registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
381-
val resultCode = result.resultCode
382-
val data: Intent? = result.data
383-
val uri = data?.data
384-
if (uri == null || resultCode == Activity.RESULT_CANCELED) {
385-
if (BuildConfig.DEBUG) Timber.d("invalid uri received")
386-
callback.onReceived(destination, null, RESPONSE_ERROR)
387-
return@registerForActivityResult
388-
}
389-
Timber.i("FilePicker returned %s", uri)
390-
if ("http" == uri.scheme || "https" == uri.scheme) {
391-
callback.onReceived(destination, uri, RESPONSE_URL)
392-
return@registerForActivityResult
393-
}
394-
if (ContentResolver.SCHEME_FILE == uri.scheme || resultCode != Activity.RESULT_OK && resultCode != Activity.RESULT_FIRST_USER) {
395-
Toast.makeText(
396-
compatActivity, R.string.file_picker_wierd, Toast.LENGTH_SHORT
397-
).show()
398-
}
399-
var inputStream: InputStream? = null
400-
var outputStream: OutputStream? = null
401-
var success = false
402-
try {
403-
if (ContentResolver.SCHEME_FILE == uri.scheme) {
404-
var path = uri.path
405-
if (path!!.startsWith("/sdcard/")) { // Fix file paths
406-
path =
407-
Environment.getExternalStorageDirectory().absolutePath + path.substring(
408-
7
409-
)
410-
}
411-
inputStream = SuFileInputStream.open(
412-
File(path).absoluteFile
413-
)
414-
} else {
415-
inputStream = compatActivity.contentResolver.openInputStream(uri)
416-
}
417-
outputStream = FileOutputStream(destination)
418-
if (inputStream != null) {
419-
copy(inputStream, outputStream)
420-
}
421-
Timber.i("File saved at %s", destination)
422-
success = true
423-
} catch (e: Exception) {
424-
Timber.e(e)
425-
Toast.makeText(
426-
compatActivity, R.string.file_picker_failure, Toast.LENGTH_SHORT
427-
).show()
428-
} finally {
429-
closeSilently(inputStream)
430-
closeSilently(outputStream)
431-
if (!success && destination.exists() && !destination.delete()) Timber.e("Failed to delete artefact!")
432-
}
433-
callback.onReceived(
434-
destination, uri, if (success) RESPONSE_FILE else RESPONSE_ERROR
435-
)
436-
}.launch(intent)
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)
437372

373+
startActivityForResult(
374+
compatActivity, intent, RESPONSE_FILE, null
375+
)
438376
}
439377

440378
fun openFileTo(compatActivity: AppCompatActivity, module: File, function: (File, Uri, Int) -> Unit) {

0 commit comments

Comments
 (0)