Skip to content

Commit c4ea88c

Browse files
several fixes
- unbreak local module install - ignore the lost+found dir that random users have - properly check androidacy url - maybe fix ksu for some users Signed-off-by: androidacy-user <opensource@androidacy.com>
1 parent 279fe9a commit c4ea88c

3 files changed

Lines changed: 73 additions & 18 deletions

File tree

app/src/main/kotlin/com/fox2code/mmm/androidacy/AndroidacyUtil.kt

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,12 @@ enum class AndroidacyUtil {
3434

3535
fun isAndroidacyFileUrl(url: String?): Boolean {
3636
if (url == null) return false
37-
for (prefix in arrayOf(
38-
"https://production-api.androidacy.com/downloads/",
39-
"https://production-api.androidacy.com/magisk/file/",
40-
"https://staging-api.androidacy.com/magisk/file/"
41-
)) { // Make both staging and non staging act the same
42-
if (url.startsWith(prefix)) return true
37+
val uri = Uri.parse(url)
38+
return if (BuildConfig.DEBUG) {
39+
uri.host?.endsWith("api.androidacy.com") ?: false && (uri.path?.startsWith("/downloads") ?: false || uri.path?.startsWith("/magisk/file") ?: false || uri.path?.startsWith("/magisk/ddl") ?: false)
40+
} else {
41+
uri.host?.equals("production-api.androidacy.com") ?: false && (uri.path?.startsWith("/downloads") ?: false || uri.path?.startsWith("/magisk/file") ?: false || uri.path?.startsWith("/magisk/ddl") ?: false)
4342
}
44-
return false
4543
}
4644

4745
// Avoid logging token
@@ -124,6 +122,7 @@ enum class AndroidacyUtil {
124122

125123
/**
126124
* Returns the markdown directly from the API for rendering. Premium only, and internal testing only currently.
125+
* /#blocked-by: A#F-0815
127126
* @param url URL to get markdown from
128127
* @return String of markdown
129128
* @noinspection unused

app/src/main/kotlin/com/fox2code/mmm/manager/ModuleManager.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ class ModuleManager private constructor() : SyncManager() {
6767
).allowMainThreadQueries().build()
6868
for (module in modules) {
6969
if (!SuFile("/data/adb/modules/$module").isDirectory) continue // Ignore non directory files inside modules folder
70+
// don't care about lost+found (case insensitive)
71+
if (module.equals("lost+found", ignoreCase = true)) continue
7072
if (BuildConfig.DEBUG) Timber.d("Found module %s", module)
7173
var moduleInfo = moduleInfos[module]
7274
// next, merge the module info with a record from ModuleListCache room db if it exists

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

Lines changed: 65 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,17 @@ 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
1213
import android.content.Context
1314
import android.content.ContextWrapper
1415
import android.content.Intent
1516
import android.net.Uri
1617
import android.os.Bundle
18+
import android.os.Environment
1719
import android.util.TypedValue
1820
import android.widget.Toast
21+
import androidx.activity.result.contract.ActivityResultContracts
1922
import androidx.appcompat.app.AppCompatActivity
20-
import androidx.core.app.ActivityCompat.startActivityForResult
2123
import androidx.core.app.ActivityOptionsCompat
2224
import com.fox2code.mmm.BuildConfig
2325
import com.fox2code.mmm.Constants
@@ -29,11 +31,17 @@ import com.fox2code.mmm.XHooks.Companion.isModuleActive
2931
import com.fox2code.mmm.androidacy.AndroidacyActivity
3032
import com.fox2code.mmm.installer.InstallerActivity
3133
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
3236
import com.fox2code.mmm.utils.io.net.Http.Companion.hasWebView
3337
import com.topjohnwu.superuser.CallbackList
3438
import com.topjohnwu.superuser.Shell
39+
import com.topjohnwu.superuser.io.SuFileInputStream
3540
import timber.log.Timber
3641
import java.io.File
42+
import java.io.FileOutputStream
43+
import java.io.InputStream
44+
import java.io.OutputStream
3745
import 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

Comments
 (0)