From bfcdf1b5536dd55415f721a10e0e0c4e948ff5ee Mon Sep 17 00:00:00 2001 From: HuanChengFly <609486518@qq.com> Date: Sun, 15 Aug 2021 19:22:28 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=8F=92=E4=BB=B6=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E7=95=8C=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 28 ++++++--- app/src/main/assets/plugins.json | 1 + .../tieba/post/BaseApplication.kt | 4 +- .../post/activities/PluginManageActivity.kt | 44 +++++++++++++ .../tieba/post/activities/UserActivity.kt | 1 - .../post/adapters/PluginManageAdapter.kt | 45 +++++++++++++ .../tieba/post/plugins/IPlugin.kt | 6 +- .../tieba/post/plugins/PluginCommentLookup.kt | 5 +- .../tieba/post/plugins/PluginManager.kt | 13 ++-- .../post/plugins/models/PluginManifest.kt | 1 + .../main/res/drawable/ic_round_extension.xml | 10 +++ .../res/layout/activity_plugin_manage.xml | 22 +++++++ app/src/main/res/layout/item_plugin_list.xml | 63 +++++++++++++++++++ app/src/main/res/values/strings.xml | 2 + app/src/main/res/xml/preferences.xml | 10 +++ 15 files changed, 233 insertions(+), 22 deletions(-) create mode 100644 app/src/main/java/com/huanchengfly/tieba/post/activities/PluginManageActivity.kt create mode 100644 app/src/main/java/com/huanchengfly/tieba/post/adapters/PluginManageAdapter.kt create mode 100644 app/src/main/res/drawable/ic_round_extension.xml create mode 100644 app/src/main/res/layout/activity_plugin_manage.xml create mode 100644 app/src/main/res/layout/item_plugin_list.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index bd35f5f4..04417f56 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -39,17 +39,27 @@ android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:largeHeap="true" - android:usesCleartextTraffic="true" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme" + android:usesCleartextTraffic="true" tools:ignore="UnusedAttribute"> - + + + + + android:windowSoftInputMode="adjustResize" + android:theme="@style/AppTheme.PhotoView" /> @@ -199,8 +209,8 @@ android:windowSoftInputMode="adjustResize" /> + android:label="@string/title_theme_settings" + android:windowSoftInputMode="adjustResize" /> diff --git a/app/src/main/assets/plugins.json b/app/src/main/assets/plugins.json index 41b7c356..14448cf7 100644 --- a/app/src/main/assets/plugins.json +++ b/app/src/main/assets/plugins.json @@ -4,6 +4,7 @@ "id": "CommentLookup", "name": "发言查询", "desc": "使用第三方工具箱查询用户过往发言", + "author": "huanchengfly", "version": "1.0", "main_class": "com.huanchengfly.tieba.post.plugins.PluginCommentLookup" } 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 70ae19f9..4bd9a60c 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/BaseApplication.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/BaseApplication.kt @@ -173,7 +173,7 @@ class BaseApplication : Application(), IApp { override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {} override fun onActivityDestroyed(activity: Activity) {} }) - CrashUtil.CrashHandler.getInstance().init(this) + if (BuildConfig.DEBUG) CrashUtil.CrashHandler.getInstance().init(this) PluginManager.init(this) } @@ -472,6 +472,6 @@ class BaseApplication : Application(), IApp { } override fun launchUrl(url: String) { - launchUrl(this, url) + launchUrl(mActivityList.lastOrNull() ?: this, url) } } \ No newline at end of file diff --git a/app/src/main/java/com/huanchengfly/tieba/post/activities/PluginManageActivity.kt b/app/src/main/java/com/huanchengfly/tieba/post/activities/PluginManageActivity.kt new file mode 100644 index 00000000..9eb47576 --- /dev/null +++ b/app/src/main/java/com/huanchengfly/tieba/post/activities/PluginManageActivity.kt @@ -0,0 +1,44 @@ +package com.huanchengfly.tieba.post.activities + +import android.os.Bundle +import androidx.appcompat.widget.Toolbar +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import butterknife.BindView +import com.google.android.material.appbar.CollapsingToolbarLayout +import com.huanchengfly.tieba.post.R +import com.huanchengfly.tieba.post.adapters.PluginManageAdapter +import com.huanchengfly.tieba.post.components.dividers.SpacesItemDecoration +import com.huanchengfly.tieba.post.dpToPx +import com.huanchengfly.tieba.post.plugins.PluginManager +import com.huanchengfly.tieba.post.utils.ThemeUtil + +class PluginManageActivity : BaseActivity() { + @BindView(R.id.toolbar) + lateinit var toolbar: Toolbar + + @BindView(R.id.collapsing_toolbar) + lateinit var collapsingToolbar: CollapsingToolbarLayout + + @BindView(R.id.recycler_view) + lateinit var recyclerView: RecyclerView + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + ThemeUtil.setTranslucentThemeBackground(findViewById(R.id.background)) + setSupportActionBar(toolbar) + supportActionBar?.setDisplayHomeAsUpEnabled(true) + supportActionBar?.title = title + collapsingToolbar.title = title + PluginManager.reloadPluginManifests() + recyclerView.apply { + adapter = PluginManageAdapter(this@PluginManageActivity) + layoutManager = LinearLayoutManager(this@PluginManageActivity) + addItemDecoration(SpacesItemDecoration(0, 0, 0, 8.dpToPx())) + } + } + + override fun getLayoutId(): Int { + return R.layout.activity_plugin_manage + } +} \ No newline at end of file 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 43f6dfdf..e785dc30 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 @@ -219,7 +219,6 @@ class UserActivity : BaseActivity() { } } return if (PluginManager.performPluginMenuClick( - this, PluginManager.MENU_USER_ACTIVITY, item.itemId, profileBean diff --git a/app/src/main/java/com/huanchengfly/tieba/post/adapters/PluginManageAdapter.kt b/app/src/main/java/com/huanchengfly/tieba/post/adapters/PluginManageAdapter.kt new file mode 100644 index 00000000..c2642f6a --- /dev/null +++ b/app/src/main/java/com/huanchengfly/tieba/post/adapters/PluginManageAdapter.kt @@ -0,0 +1,45 @@ +package com.huanchengfly.tieba.post.adapters + +import android.content.Context +import android.content.SharedPreferences +import androidx.appcompat.widget.SwitchCompat +import androidx.core.content.edit +import com.huanchengfly.tieba.post.R +import com.huanchengfly.tieba.post.adapters.base.BaseSingleTypeAdapter +import com.huanchengfly.tieba.post.components.MyViewHolder +import com.huanchengfly.tieba.post.plugins.PluginManager +import com.huanchengfly.tieba.post.plugins.models.PluginManifest +import com.huanchengfly.tieba.post.utils.SharedPreferencesUtil + +class PluginManageAdapter(context: Context) : + BaseSingleTypeAdapter(context, PluginManager.pluginManifests) { + val preferences: SharedPreferences + get() = SharedPreferencesUtil.get(SharedPreferencesUtil.SP_PLUGINS) + + override fun getItemLayoutId(): Int { + return R.layout.item_plugin_list + } + + override fun convert(viewHolder: MyViewHolder, item: PluginManifest, position: Int) { + viewHolder.setText(R.id.plugin_name, item.name) + viewHolder.setText( + R.id.plugin_info, + context.getString(R.string.template_plugin_info, item.version, item.author) + ) + viewHolder.setText(R.id.plugin_desc, item.desc) + viewHolder.getView(R.id.plugin_status).apply { + isChecked = preferences.getBoolean("${item.id}_enabled", false) + setOnCheckedChangeListener { _, isChecked -> + preferences.edit(commit = true) { + putBoolean("${item.id}_enabled", isChecked) + } + PluginManager.reloadPlugins() + } + } + } + + fun refresh() { + PluginManager.reloadPluginManifests() + setData(PluginManager.pluginManifests) + } +} \ No newline at end of file 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 50ca831a..5fd02184 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: (Context, Data) -> Unit + crossinline callback: (Data) -> Unit ) { registerMenuItem(id, title, object : ClickCallback { - override fun onClick(context: Context, data: Data) { - callback.invoke(context, data) + override fun onClick(data: Data) { + callback.invoke(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 dc5b807d..f74af5ab 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,7 +4,6 @@ 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() { @@ -12,8 +11,8 @@ class PluginCommentLookup(app: IApp, manifest: PluginManifest) : IPlugin(app, ma registerMenuItem( "lookup_comment", context.getString(R.string.plugin_comment_lookup_menu) - ) { context, data -> - launchUrl(context, "https://www.82cat.com/tieba/reply/${data.user?.name}/1") + ) { data -> + app.launchUrl("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 4ba938c0..2efedb3e 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 @@ -30,6 +30,11 @@ object PluginManager { get() = SharedPreferencesUtil.get(SP_PLUGINS) init { + reloadPluginMenu() + } + + private fun reloadPluginMenu() { + registeredPluginMenuItems.clear() listOf( MENU_USER_ACTIVITY, MENU_NONE @@ -56,7 +61,6 @@ object PluginManager { } fun performPluginMenuClick( - context: Context, menuId: String, itemId: Int, data: Data @@ -67,7 +71,7 @@ object PluginManager { return false } return try { - (item as PluginMenuItem).callback!!.onClick(context, data) + (item as PluginMenuItem).callback!!.onClick(data) true } catch (e: Exception) { false @@ -132,10 +136,11 @@ object PluginManager { destroyPlugin(it) } pluginInstances.clear() + reloadPluginMenu() reloadPluginManifests() pluginManifests.forEach { try { - if (!it.pluginCreated && preferences.getBoolean("${it.id}_enabled", true)) { + if (!it.pluginCreated && preferences.getBoolean("${it.id}_enabled", false)) { val pluginInstance = createPlugin(it) if (pluginInstance != null) { pluginInstances.add(pluginInstance) @@ -163,7 +168,7 @@ class PluginMenuItem( val callback: ClickCallback? = null ) { interface ClickCallback { - fun onClick(context: Context, data: Data) + fun onClick(data: Data) } override fun equals(other: Any?): Boolean { diff --git a/app/src/main/java/com/huanchengfly/tieba/post/plugins/models/PluginManifest.kt b/app/src/main/java/com/huanchengfly/tieba/post/plugins/models/PluginManifest.kt index f5fa41c6..5c8d9c71 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/plugins/models/PluginManifest.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/plugins/models/PluginManifest.kt @@ -7,6 +7,7 @@ data class PluginManifest( val name: String, val desc: String, val version: String, + val author: String, @SerializedName("main_class") val mainClass: String ) diff --git a/app/src/main/res/drawable/ic_round_extension.xml b/app/src/main/res/drawable/ic_round_extension.xml new file mode 100644 index 00000000..a4a20d17 --- /dev/null +++ b/app/src/main/res/drawable/ic_round_extension.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/activity_plugin_manage.xml b/app/src/main/res/layout/activity_plugin_manage.xml new file mode 100644 index 00000000..7ddabdd6 --- /dev/null +++ b/app/src/main/res/layout/activity_plugin_manage.xml @@ -0,0 +1,22 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_plugin_list.xml b/app/src/main/res/layout/item_plugin_list.xml new file mode 100644 index 00000000..c8c9ee47 --- /dev/null +++ b/app/src/main/res/layout/item_plugin_list.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5131f3e0..6edf43b2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -466,4 +466,6 @@ 透明主题 自定义 查询发言 + 附加功能管理 + v%1$s · 作者 %2$s diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index eff9e73b..2fd88bd1 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -120,6 +120,16 @@ android:key="forumFabFunction" android:title="@string/settings_forum_fab_function" /> + + + +