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>
pull/89/head
androidacy-user 2 years ago
parent 279fe9ad4d
commit c4ea88c927

@ -34,14 +34,12 @@ enum class AndroidacyUtil {
fun isAndroidacyFileUrl(url: String?): Boolean { fun isAndroidacyFileUrl(url: String?): Boolean {
if (url == null) return false if (url == null) return false
for (prefix in arrayOf( val uri = Uri.parse(url)
"https://production-api.androidacy.com/downloads/", return if (BuildConfig.DEBUG) {
"https://production-api.androidacy.com/magisk/file/", uri.host?.endsWith("api.androidacy.com") ?: false && (uri.path?.startsWith("/downloads") ?: false || uri.path?.startsWith("/magisk/file") ?: false || uri.path?.startsWith("/magisk/ddl") ?: false)
"https://staging-api.androidacy.com/magisk/file/" } else {
)) { // Make both staging and non staging act the same 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)
if (url.startsWith(prefix)) return true
} }
return false
} }
// Avoid logging token // Avoid logging token
@ -124,6 +122,7 @@ enum class AndroidacyUtil {
/** /**
* Returns the markdown directly from the API for rendering. Premium only, and internal testing only currently. * Returns the markdown directly from the API for rendering. Premium only, and internal testing only currently.
* /#blocked-by: A#F-0815
* @param url URL to get markdown from * @param url URL to get markdown from
* @return String of markdown * @return String of markdown
* @noinspection unused * @noinspection unused

@ -67,6 +67,8 @@ class ModuleManager private constructor() : SyncManager() {
).allowMainThreadQueries().build() ).allowMainThreadQueries().build()
for (module in modules) { for (module in modules) {
if (!SuFile("/data/adb/modules/$module").isDirectory) continue // Ignore non directory files inside modules folder if (!SuFile("/data/adb/modules/$module").isDirectory) continue // Ignore non directory files inside modules folder
// don't care about lost+found (case insensitive)
if (module.equals("lost+found", ignoreCase = true)) continue
if (BuildConfig.DEBUG) Timber.d("Found module %s", module) if (BuildConfig.DEBUG) Timber.d("Found module %s", module)
var moduleInfo = moduleInfos[module] var moduleInfo = moduleInfos[module]
// next, merge the module info with a record from ModuleListCache room db if it exists // next, merge the module info with a record from ModuleListCache room db if it exists

@ -9,15 +9,17 @@ 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
@ -29,11 +31,17 @@ 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")
@ -364,15 +372,61 @@ enum class IntentHelper {;
callback.onReceived(destination, null, RESPONSE_ERROR) callback.onReceived(destination, null, RESPONSE_ERROR)
return return
} }
// start file picker by registering for result. call callback with file and appropriate response val getContent = compatActivity.registerForActivityResult(
// do not use startActivityForResult, it is deprecated ActivityResultContracts.GetContent()
val intent = Intent() ) { uri: Uri? ->
.setType("application/zip") if (uri == null) {
.setAction(Intent.ACTION_GET_CONTENT) Timber.d("invalid uri received")
callback.onReceived(destination, null, RESPONSE_ERROR)
startActivityForResult( return@registerForActivityResult
compatActivity, intent, RESPONSE_FILE, null }
) 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) {
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)
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 artifact!")
}
callback.onReceived(
destination, uri, if (success) RESPONSE_FILE else RESPONSE_ERROR
)
}
getContent.launch("application/zip")
} }
fun openFileTo(compatActivity: AppCompatActivity, module: File, function: (File, Uri, Int) -> Unit) { fun openFileTo(compatActivity: AppCompatActivity, module: File, function: (File, Uri, Int) -> Unit) {
@ -396,4 +450,4 @@ enum class IntentHelper {;
}) })
} }
} }
} }
Loading…
Cancel
Save