From c2af149d1d6dd473fa3e225b1ddd9492aeca7ee2 Mon Sep 17 00:00:00 2001 From: HuanChengFly <609486518@qq.com> Date: Sun, 15 Aug 2021 18:30:51 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=8F=92=E4=BB=B6=E8=8F=9C=E5=8D=95?= =?UTF-8?q?=E5=85=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/plugins.json | 20 +++++----- .../tieba/post/BaseApplication.kt | 19 +++++----- .../tieba/post/activities/UserActivity.kt | 17 ++++++++- .../tieba/post/plugins/IPlugin.kt | 6 +-- .../tieba/post/plugins/PluginCommentLookup.kt | 5 ++- .../tieba/post/plugins/PluginManager.kt | 38 ++++++++++++++++--- .../post/plugins/models/BuiltInPlugins.kt | 5 +++ 7 files changed, 80 insertions(+), 30 deletions(-) create mode 100644 app/src/main/java/com/huanchengfly/tieba/post/plugins/models/BuiltInPlugins.kt diff --git a/app/src/main/assets/plugins.json b/app/src/main/assets/plugins.json index cc6fc7f1..41b7c356 100644 --- a/app/src/main/assets/plugins.json +++ b/app/src/main/assets/plugins.json @@ -1,9 +1,11 @@ -[ - { - "id": "CommentLookup", - "name": "发言查询", - "desc": "使用第三方工具箱查询用户过往发言", - "version": "1.0", - "mainClass": "com.huanchengfly.tieba.post.plugins.PluginCommentLookup" - } -] \ No newline at end of file +{ + "plugins": [ + { + "id": "CommentLookup", + "name": "发言查询", + "desc": "使用第三方工具箱查询用户过往发言", + "version": "1.0", + "main_class": "com.huanchengfly.tieba.post.plugins.PluginCommentLookup" + } + ] +} \ No newline at end of file diff --git a/app/src/main/java/com/huanchengfly/tieba/post/BaseApplication.kt b/app/src/main/java/com/huanchengfly/tieba/post/BaseApplication.kt index 918bb2cd..70ae19f9 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/BaseApplication.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/BaseApplication.kt @@ -11,7 +11,6 @@ import android.graphics.Color import android.graphics.drawable.Drawable import android.net.Uri import android.os.Bundle -import android.text.TextUtils import android.view.View import android.widget.FrameLayout import android.widget.ImageView @@ -41,26 +40,25 @@ class BaseApplication : Application(), IApp { instance = this super.onCreate() ThemeUtils.init(ThemeDelegate) - PluginManager.init(this) AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) LitePal.initialize(this) FlurryAgent.Builder() .withCaptureUncaughtExceptions(true) .build(this, "ZMRX6W76WNF95ZHT857X") registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks { - private var clipBoardHash: String? = null + private var clipBoardHash: Int = 0 private fun updateClipBoardHashCode() { clipBoardHash = getClipBoardHash() } - private fun getClipBoardHash(): String? { + private fun getClipBoardHash(): Int { val cm = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager val data = cm.primaryClip if (data != null) { val item = data.getItemAt(0) - return item.toString().toMD5() + return item.hashCode() } - return null + return 0 } private val clipBoard: String @@ -117,8 +115,9 @@ class BaseApplication : Application(), IApp { } override fun onActivityResumed(activity: Activity) { - if (!TextUtils.equals(clipBoardHash, getClipBoardHash())) { - @RegExp val regex = "((http|https)://)(([a-zA-Z0-9._-]+\\.[a-zA-Z]{2,6})|([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}))(:[0-9]{1,4})*(/[a-zA-Z0-9&%_./-~-]*)?" + if (clipBoardHash != getClipBoardHash()) { + @RegExp val regex = + "((http|https)://)(([a-zA-Z0-9._-]+\\.[a-zA-Z]{2,6})|([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}))(:[0-9]{1,4})*(/[a-zA-Z0-9&%_./-~-]*)?" val pattern = Pattern.compile(regex) val matcher = pattern.matcher(clipBoard) if (matcher.find()) { @@ -127,7 +126,8 @@ class BaseApplication : Application(), IApp { if (isTiebaDomain(uri.host)) { val previewView = Util.inflate(activity, R.layout.preview_url) if (isForumUrl(uri)) { - updatePreviewView(activity, previewView, PreviewInfo() + updatePreviewView( + activity, previewView, PreviewInfo() .setIconRes(R.drawable.ic_round_forum) .setTitle(activity.getString(R.string.title_forum, getForumName(uri))) .setSubtitle(activity.getString(R.string.text_loading)) @@ -174,6 +174,7 @@ class BaseApplication : Application(), IApp { override fun onActivityDestroyed(activity: Activity) {} }) CrashUtil.CrashHandler.getInstance().init(this) + PluginManager.init(this) } /** diff --git a/app/src/main/java/com/huanchengfly/tieba/post/activities/UserActivity.kt b/app/src/main/java/com/huanchengfly/tieba/post/activities/UserActivity.kt index b55eed87..43f6dfdf 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/activities/UserActivity.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/activities/UserActivity.kt @@ -30,6 +30,7 @@ import com.huanchengfly.tieba.post.fragments.UserPostFragment import com.huanchengfly.tieba.post.goToActivity import com.huanchengfly.tieba.post.models.PhotoViewBean import com.huanchengfly.tieba.post.models.database.Block +import com.huanchengfly.tieba.post.plugins.PluginManager import com.huanchengfly.tieba.post.utils.AccountUtil import com.huanchengfly.tieba.post.utils.ImageUtil import com.huanchengfly.tieba.post.utils.StatusBarUtil @@ -187,6 +188,7 @@ class UserActivity : BaseActivity() { menu.findItem(R.id.menu_block).isVisible = true menu.findItem(R.id.menu_edit_info).isVisible = false } + PluginManager.initPluginMenu(menu, PluginManager.MENU_USER_ACTIVITY) return super.onCreateOptionsMenu(menu) } @@ -205,7 +207,8 @@ class UserActivity : BaseActivity() { .saveAsync() .listen { success: Boolean -> if (success) { - Toast.makeText(this, R.string.toast_add_success, Toast.LENGTH_SHORT).show() + Toast.makeText(this, R.string.toast_add_success, Toast.LENGTH_SHORT) + .show() } } return true @@ -215,7 +218,17 @@ class UserActivity : BaseActivity() { return true } } - return super.onOptionsItemSelected(item) + return if (PluginManager.performPluginMenuClick( + this, + PluginManager.MENU_USER_ACTIVITY, + item.itemId, + profileBean + ) + ) { + true + } else { + super.onOptionsItemSelected(item) + } } @OnClick(R.id.user_center_action_btn) diff --git a/app/src/main/java/com/huanchengfly/tieba/post/plugins/IPlugin.kt b/app/src/main/java/com/huanchengfly/tieba/post/plugins/IPlugin.kt index 5fd02184..50ca831a 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/plugins/IPlugin.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/plugins/IPlugin.kt @@ -33,11 +33,11 @@ inline fun IPlugin.registerMenuItem( inline fun IPlugin.registerMenuItem( id: String, title: String, - crossinline callback: (Data) -> Unit + crossinline callback: (Context, Data) -> Unit ) { registerMenuItem(id, title, object : ClickCallback { - override fun onClick(data: Data) { - callback.invoke(data) + override fun onClick(context: Context, data: Data) { + callback.invoke(context, data) } }) } diff --git a/app/src/main/java/com/huanchengfly/tieba/post/plugins/PluginCommentLookup.kt b/app/src/main/java/com/huanchengfly/tieba/post/plugins/PluginCommentLookup.kt index 9e4d0518..dc5b807d 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/plugins/PluginCommentLookup.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/plugins/PluginCommentLookup.kt @@ -4,6 +4,7 @@ import com.huanchengfly.tieba.post.R import com.huanchengfly.tieba.post.api.models.ProfileBean import com.huanchengfly.tieba.post.plugins.interfaces.IApp import com.huanchengfly.tieba.post.plugins.models.PluginManifest +import com.huanchengfly.tieba.post.utils.launchUrl class PluginCommentLookup(app: IApp, manifest: PluginManifest) : IPlugin(app, manifest) { override fun onEnable() { @@ -11,8 +12,8 @@ class PluginCommentLookup(app: IApp, manifest: PluginManifest) : IPlugin(app, ma registerMenuItem( "lookup_comment", context.getString(R.string.plugin_comment_lookup_menu) - ) { - app.launchUrl("https://www.82cat.com/tieba/reply/${it.user?.name}/1") + ) { context, data -> + launchUrl(context, "https://www.82cat.com/tieba/reply/${data.user?.name}/1") } } } \ No newline at end of file diff --git a/app/src/main/java/com/huanchengfly/tieba/post/plugins/PluginManager.kt b/app/src/main/java/com/huanchengfly/tieba/post/plugins/PluginManager.kt index f0187cd5..4ba938c0 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/plugins/PluginManager.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/plugins/PluginManager.kt @@ -2,9 +2,11 @@ package com.huanchengfly.tieba.post.plugins import android.content.Context import android.content.SharedPreferences +import android.view.Menu import com.huanchengfly.tieba.post.api.models.ProfileBean import com.huanchengfly.tieba.post.fromJson import com.huanchengfly.tieba.post.plugins.interfaces.IApp +import com.huanchengfly.tieba.post.plugins.models.BuiltInPlugins import com.huanchengfly.tieba.post.plugins.models.PluginManifest import com.huanchengfly.tieba.post.utils.AssetUtil import com.huanchengfly.tieba.post.utils.SharedPreferencesUtil @@ -19,7 +21,7 @@ object PluginManager { val pluginManifests: MutableList = mutableListOf() val pluginInstances: MutableList = mutableListOf() - val registeredPluginMenuItems: MutableMap>> = + val registeredPluginMenuItems: MutableMap>> = mutableMapOf() val context: Context @@ -37,7 +39,7 @@ object PluginManager { } fun registerMenuItem(pluginInstance: IPlugin, menuItem: PluginMenuItem) { - registeredPluginMenuItems[menuItem.menuId]!!["${pluginInstance.manifest.id}_${menuItem.id}"] = + registeredPluginMenuItems[menuItem.menuId]!!["${pluginInstance.manifest.id}_${menuItem.id}".hashCode()] = menuItem } @@ -46,6 +48,32 @@ object PluginManager { reloadPlugins() } + fun initPluginMenu(menu: Menu, menuId: String) { + val menuItems = registeredPluginMenuItems[menuId]!! + menuItems.forEach { + menu.add(0, it.key, 0, it.value.title) + } + } + + fun performPluginMenuClick( + context: Context, + menuId: String, + itemId: Int, + data: Data + ): Boolean { + val menuItems = registeredPluginMenuItems[menuId]!! + val item = menuItems[itemId] + if (item?.callback == null) { + return false + } + return try { + (item as PluginMenuItem).callback!!.onClick(context, data) + true + } catch (e: Exception) { + false + } + } + fun enablePlugin(id: String) { pluginInstances.filter { it.manifest.id == id }.forEach { enablePlugin(it) } } @@ -94,7 +122,7 @@ object PluginManager { fun reloadPluginManifests() { pluginManifests.clear() pluginManifests.addAll( - AssetUtil.getStringFromAsset(context, "plugins.json").fromJson>() + AssetUtil.getStringFromAsset(context, "plugins.json").fromJson().plugins ) } @@ -107,7 +135,7 @@ object PluginManager { reloadPluginManifests() pluginManifests.forEach { try { - if (it.pluginCreated && preferences.getBoolean("${it.id}_enabled", true)) { + if (!it.pluginCreated && preferences.getBoolean("${it.id}_enabled", true)) { val pluginInstance = createPlugin(it) if (pluginInstance != null) { pluginInstances.add(pluginInstance) @@ -135,7 +163,7 @@ class PluginMenuItem( val callback: ClickCallback? = null ) { interface ClickCallback { - fun onClick(data: Data) + fun onClick(context: Context, data: Data) } override fun equals(other: Any?): Boolean { diff --git a/app/src/main/java/com/huanchengfly/tieba/post/plugins/models/BuiltInPlugins.kt b/app/src/main/java/com/huanchengfly/tieba/post/plugins/models/BuiltInPlugins.kt new file mode 100644 index 00000000..6c16984a --- /dev/null +++ b/app/src/main/java/com/huanchengfly/tieba/post/plugins/models/BuiltInPlugins.kt @@ -0,0 +1,5 @@ +package com.huanchengfly.tieba.post.plugins.models + +data class BuiltInPlugins( + val plugins: List +)