fix crash on resume from pick file

Signed-off-by: androidacy-user <opensource@androidacy.com>
pull/89/head
androidacy-user 2 years ago
parent 6a062bca94
commit 279fe9ad4d

@ -193,7 +193,7 @@
android:value="false" /> android:value="false" />
<meta-data <meta-data
android:name="io.sentry.dsn" android:name="io.sentry.dsn"
android:value="https://03eb06b82eda4d0e83830573ef3bbc05@sentry.androidacy.com/6" /> <!-- enable view hierarchy for crashes --> android:value="https://09652942e9c042e39daed0bc5a8a98c3@g-fe.androidacy.com/3" /> <!-- enable view hierarchy for crashes -->
<meta-data <meta-data
android:name="io.sentry.attach-view-hierarchy" android:name="io.sentry.attach-view-hierarchy"
android:value="true" /> <!-- Sane value, but feel free to lower it --> android:value="true" /> <!-- Sane value, but feel free to lower it -->

@ -63,6 +63,7 @@ import kotlin.math.abs
@Suppress("unused", "MemberVisibilityCanBePrivate") @Suppress("unused", "MemberVisibilityCanBePrivate")
class MainApplication : Application(), Configuration.Provider, ActivityLifecycleCallbacks { class MainApplication : Application(), Configuration.Provider, ActivityLifecycleCallbacks {
private var callbacksRegistered = false
var isTainted = false var isTainted = false
var lastActivity: AppCompatActivity? = null var lastActivity: AppCompatActivity? = null
@ -245,7 +246,14 @@ class MainApplication : Application(), Configuration.Provider, ActivityLifecycle
if (INSTANCE == null) INSTANCE = this if (INSTANCE == null) INSTANCE = this
relPackageName = this.packageName relPackageName = this.packageName
super.onCreate() super.onCreate()
registerActivityLifecycleCallbacks(this) if (!callbacksRegistered) {
try {
registerActivityLifecycleCallbacks(this)
callbacksRegistered = true
} catch (e: Exception) {
Timber.e(e, "Failed to register activity lifecycle callbacks")
}
}
initialize(this) initialize(this)
// Initialize Timber // Initialize Timber
configTimber() configTimber()

@ -9,17 +9,15 @@ package com.fox2code.mmm.utils
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.Activity import android.app.Activity
import android.content.ActivityNotFoundException import android.content.ActivityNotFoundException
import android.content.ContentResolver
import android.content.Context import android.content.Context
import android.content.ContextWrapper import android.content.ContextWrapper
import android.content.Intent import android.content.Intent
import android.net.Uri import android.net.Uri
import android.os.Bundle import android.os.Bundle
import android.os.Environment
import android.util.TypedValue import android.util.TypedValue
import android.widget.Toast import android.widget.Toast
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat.startActivityForResult
import androidx.core.app.ActivityOptionsCompat import androidx.core.app.ActivityOptionsCompat
import com.fox2code.mmm.BuildConfig import com.fox2code.mmm.BuildConfig
import com.fox2code.mmm.Constants import com.fox2code.mmm.Constants
@ -31,17 +29,11 @@ import com.fox2code.mmm.XHooks.Companion.isModuleActive
import com.fox2code.mmm.androidacy.AndroidacyActivity import com.fox2code.mmm.androidacy.AndroidacyActivity
import com.fox2code.mmm.installer.InstallerActivity import com.fox2code.mmm.installer.InstallerActivity
import com.fox2code.mmm.markdown.MarkdownActivity import com.fox2code.mmm.markdown.MarkdownActivity
import com.fox2code.mmm.utils.io.Files.Companion.closeSilently
import com.fox2code.mmm.utils.io.Files.Companion.copy
import com.fox2code.mmm.utils.io.net.Http.Companion.hasWebView import com.fox2code.mmm.utils.io.net.Http.Companion.hasWebView
import com.topjohnwu.superuser.CallbackList import com.topjohnwu.superuser.CallbackList
import com.topjohnwu.superuser.Shell import com.topjohnwu.superuser.Shell
import com.topjohnwu.superuser.io.SuFileInputStream
import timber.log.Timber import timber.log.Timber
import java.io.File import java.io.File
import java.io.FileOutputStream
import java.io.InputStream
import java.io.OutputStream
import java.net.URISyntaxException import java.net.URISyntaxException
@Suppress("unused") @Suppress("unused")
@ -372,69 +364,15 @@ enum class IntentHelper {;
callback.onReceived(destination, null, RESPONSE_ERROR) callback.onReceived(destination, null, RESPONSE_ERROR)
return return
} }
val intent = Intent(Intent.ACTION_GET_CONTENT).setType("application/zip") // start file picker by registering for result. call callback with file and appropriate response
intent.flags = intent.flags and Intent.FLAG_ACTIVITY_NEW_TASK.inv() // do not use startActivityForResult, it is deprecated
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, false) val intent = Intent()
intent.putExtra(Intent.EXTRA_LOCAL_ONLY, false) .setType("application/zip")
intent.addCategory(Intent.CATEGORY_OPENABLE) .setAction(Intent.ACTION_GET_CONTENT)
compatActivity.registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
val resultCode = result.resultCode
val data: Intent? = result.data
val uri = data?.data
if (uri == null || resultCode == Activity.RESULT_CANCELED) {
if (BuildConfig.DEBUG) Timber.d("invalid uri received")
callback.onReceived(destination, null, RESPONSE_ERROR)
return@registerForActivityResult
}
Timber.i("FilePicker returned %s", uri)
if ("http" == uri.scheme || "https" == uri.scheme) {
callback.onReceived(destination, uri, RESPONSE_URL)
return@registerForActivityResult
}
if (ContentResolver.SCHEME_FILE == uri.scheme || resultCode != Activity.RESULT_OK && resultCode != Activity.RESULT_FIRST_USER) {
Toast.makeText(
compatActivity, R.string.file_picker_wierd, Toast.LENGTH_SHORT
).show()
}
var inputStream: InputStream? = null
var outputStream: OutputStream? = null
var success = false
try {
if (ContentResolver.SCHEME_FILE == uri.scheme) {
var path = uri.path
if (path!!.startsWith("/sdcard/")) { // Fix file paths
path =
Environment.getExternalStorageDirectory().absolutePath + path.substring(
7
)
}
inputStream = SuFileInputStream.open(
File(path).absoluteFile
)
} else {
inputStream = compatActivity.contentResolver.openInputStream(uri)
}
outputStream = FileOutputStream(destination)
if (inputStream != null) {
copy(inputStream, outputStream)
}
Timber.i("File saved at %s", destination)
success = true
} catch (e: Exception) {
Timber.e(e)
Toast.makeText(
compatActivity, R.string.file_picker_failure, Toast.LENGTH_SHORT
).show()
} finally {
closeSilently(inputStream)
closeSilently(outputStream)
if (!success && destination.exists() && !destination.delete()) Timber.e("Failed to delete artefact!")
}
callback.onReceived(
destination, uri, if (success) RESPONSE_FILE else RESPONSE_ERROR
)
}.launch(intent)
startActivityForResult(
compatActivity, intent, RESPONSE_FILE, null
)
} }
fun openFileTo(compatActivity: AppCompatActivity, module: File, function: (File, Uri, Int) -> Unit) { fun openFileTo(compatActivity: AppCompatActivity, module: File, function: (File, Uri, Int) -> Unit) {

Loading…
Cancel
Save