Commit 14bdafd0 authored by Mygod's avatar Mygod

Allow plugins to use android:resources in meta-data

parent 1cd0db24
......@@ -21,13 +21,11 @@
package com.github.shadowsocks.plugin
import android.content.pm.ResolveInfo
import android.os.Bundle
class NativePlugin(resolveInfo: ResolveInfo) : ResolvedPlugin(resolveInfo) {
init {
check(resolveInfo.providerInfo != null)
}
override val metaData: Bundle get() = resolveInfo.providerInfo.metaData
override val packageName: String get() = resolveInfo.providerInfo.packageName
override val componentInfo get() = resolveInfo.providerInfo!!
}
......@@ -27,8 +27,10 @@ import android.content.Intent
import android.content.pm.PackageManager
import android.content.pm.ProviderInfo
import android.content.pm.Signature
import android.content.res.Resources
import android.database.Cursor
import android.net.Uri
import android.os.Bundle
import android.system.Os
import android.util.Base64
import android.util.Log
......@@ -176,7 +178,9 @@ object PluginManager {
}
private fun initNativeFaster(provider: ProviderInfo): String? {
return provider.metaData.getString(PluginContract.METADATA_KEY_EXECUTABLE_PATH)?.let { relativePath ->
return provider.metaData.loadString(PluginContract.METADATA_KEY_EXECUTABLE_PATH) {
app.packageManager.getResourcesForApplication(provider.applicationInfo)
}?.let { relativePath ->
File(provider.applicationInfo.nativeLibraryDir).resolve(relativePath).apply {
check(canExecute())
}.absolutePath
......@@ -219,4 +223,11 @@ object PluginManager {
if (!initialized) entryNotFound()
return File(pluginDir, options.id).absolutePath
}
fun Bundle.loadString(key: String, resources: () -> Resources) = when (val value = get(key)) {
is String -> value
is Int -> resources().getString(value)
null -> null
else -> error("meta-data $key has invalid type ${value.javaClass}")
}
}
......@@ -20,21 +20,25 @@
package com.github.shadowsocks.plugin
import android.content.pm.ComponentInfo
import android.content.pm.ResolveInfo
import android.graphics.drawable.Drawable
import android.os.Bundle
import com.github.shadowsocks.Core
import com.github.shadowsocks.Core.app
import com.github.shadowsocks.plugin.PluginManager.loadString
import com.github.shadowsocks.utils.signaturesCompat
abstract class ResolvedPlugin(protected val resolveInfo: ResolveInfo) : Plugin() {
protected abstract val metaData: Bundle
protected abstract val componentInfo: ComponentInfo
private val resources by lazy { app.packageManager.getResourcesForApplication(componentInfo.applicationInfo) }
override val id: String by lazy { metaData.getString(PluginContract.METADATA_KEY_ID)!! }
override val id by lazy { componentInfo.metaData.loadString(PluginContract.METADATA_KEY_ID) { resources }!! }
override val label: CharSequence by lazy { resolveInfo.loadLabel(app.packageManager) }
override val icon: Drawable by lazy { resolveInfo.loadIcon(app.packageManager) }
override val defaultConfig: String? by lazy { metaData.getString(PluginContract.METADATA_KEY_DEFAULT_CONFIG) }
override val packageName: String get() = resolveInfo.resolvePackageName
override val defaultConfig by lazy {
componentInfo.metaData.loadString(PluginContract.METADATA_KEY_DEFAULT_CONFIG) { resources }
}
override val packageName: String get() = componentInfo.packageName
override val trusted by lazy {
Core.getPackageInfo(packageName).signaturesCompat.any(PluginManager.trustedSignatures::contains)
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment