Commit 14bdafd0 authored by Mygod's avatar Mygod

Allow plugins to use android:resources in meta-data

parent 1cd0db24
...@@ -21,13 +21,11 @@ ...@@ -21,13 +21,11 @@
package com.github.shadowsocks.plugin package com.github.shadowsocks.plugin
import android.content.pm.ResolveInfo import android.content.pm.ResolveInfo
import android.os.Bundle
class NativePlugin(resolveInfo: ResolveInfo) : ResolvedPlugin(resolveInfo) { class NativePlugin(resolveInfo: ResolveInfo) : ResolvedPlugin(resolveInfo) {
init { init {
check(resolveInfo.providerInfo != null) check(resolveInfo.providerInfo != null)
} }
override val metaData: Bundle get() = resolveInfo.providerInfo.metaData override val componentInfo get() = resolveInfo.providerInfo!!
override val packageName: String get() = resolveInfo.providerInfo.packageName
} }
...@@ -27,8 +27,10 @@ import android.content.Intent ...@@ -27,8 +27,10 @@ import android.content.Intent
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.content.pm.ProviderInfo import android.content.pm.ProviderInfo
import android.content.pm.Signature import android.content.pm.Signature
import android.content.res.Resources
import android.database.Cursor import android.database.Cursor
import android.net.Uri import android.net.Uri
import android.os.Bundle
import android.system.Os import android.system.Os
import android.util.Base64 import android.util.Base64
import android.util.Log import android.util.Log
...@@ -176,7 +178,9 @@ object PluginManager { ...@@ -176,7 +178,9 @@ object PluginManager {
} }
private fun initNativeFaster(provider: ProviderInfo): String? { 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 { File(provider.applicationInfo.nativeLibraryDir).resolve(relativePath).apply {
check(canExecute()) check(canExecute())
}.absolutePath }.absolutePath
...@@ -219,4 +223,11 @@ object PluginManager { ...@@ -219,4 +223,11 @@ object PluginManager {
if (!initialized) entryNotFound() if (!initialized) entryNotFound()
return File(pluginDir, options.id).absolutePath 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 @@ ...@@ -20,21 +20,25 @@
package com.github.shadowsocks.plugin package com.github.shadowsocks.plugin
import android.content.pm.ComponentInfo
import android.content.pm.ResolveInfo import android.content.pm.ResolveInfo
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.os.Bundle
import com.github.shadowsocks.Core import com.github.shadowsocks.Core
import com.github.shadowsocks.Core.app import com.github.shadowsocks.Core.app
import com.github.shadowsocks.plugin.PluginManager.loadString
import com.github.shadowsocks.utils.signaturesCompat import com.github.shadowsocks.utils.signaturesCompat
abstract class ResolvedPlugin(protected val resolveInfo: ResolveInfo) : Plugin() { 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 label: CharSequence by lazy { resolveInfo.loadLabel(app.packageManager) }
override val icon: Drawable by lazy { resolveInfo.loadIcon(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 defaultConfig by lazy {
override val packageName: String get() = resolveInfo.resolvePackageName componentInfo.metaData.loadString(PluginContract.METADATA_KEY_DEFAULT_CONFIG) { resources }
}
override val packageName: String get() = componentInfo.packageName
override val trusted by lazy { override val trusted by lazy {
Core.getPackageInfo(packageName).signaturesCompat.any(PluginManager.trustedSignatures::contains) 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