From f1c23387c0367a5ce053b0367335ad263d8c140d Mon Sep 17 00:00:00 2001 From: Mupceet Date: Wed, 12 Feb 2020 23:19:59 +0800 Subject: [PATCH] feat(about-page): refactor the style of about page --- app/build.gradle | 4 + .../io/legado/app/ui/about/AboutActivity.kt | 266 ++++++++++++++++-- .../io/legado/app/ui/about/AboutFragment.kt | 51 ---- .../java/io/legado/app/ui/about/ActionItem.kt | 134 +++++++++ .../app/ui/about/ActionItemViewBinder.kt | 111 ++++++++ .../io/legado/app/ui/about/ActionListener.kt | 5 + .../java/io/legado/app/ui/about/Category.kt | 5 + .../legado/app/ui/about/CategoryViewBinder.kt | 41 +++ .../res/layout/about_page_action_item.xml | 49 ++++ .../res/layout/about_page_item_category.xml | 10 + .../main/res/layout/activity_about_page.xml | 68 +++++ app/src/main/res/menu/about.xml | 9 - app/src/main/res/values/dimens.xml | 7 + app/src/main/res/values/strings.xml | 12 +- app/src/main/res/values/styles.xml | 72 +++++ app/src/main/res/xml/about.xml | 51 ---- 16 files changed, 763 insertions(+), 132 deletions(-) delete mode 100644 app/src/main/java/io/legado/app/ui/about/AboutFragment.kt create mode 100644 app/src/main/java/io/legado/app/ui/about/ActionItem.kt create mode 100644 app/src/main/java/io/legado/app/ui/about/ActionItemViewBinder.kt create mode 100644 app/src/main/java/io/legado/app/ui/about/ActionListener.kt create mode 100644 app/src/main/java/io/legado/app/ui/about/Category.kt create mode 100644 app/src/main/java/io/legado/app/ui/about/CategoryViewBinder.kt create mode 100644 app/src/main/res/layout/about_page_action_item.xml create mode 100644 app/src/main/res/layout/about_page_item_category.xml create mode 100644 app/src/main/res/layout/activity_about_page.xml delete mode 100644 app/src/main/res/menu/about.xml delete mode 100644 app/src/main/res/xml/about.xml diff --git a/app/build.gradle b/app/build.gradle index 8c5adfcaa..2820eb342 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -178,6 +178,10 @@ dependencies { // 转换繁体 implementation 'com.github.houbb:opencc4j:1.4.0' + //About + implementation 'com.drakeet.multitype:multitype:4.0.0' + implementation "com.mikepenz:iconics-core:4.0.2" + implementation 'com.mikepenz:community-material-typeface:3.7.95.4-kotlin@aar' } apply plugin: 'com.google.gms.google-services' \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/about/AboutActivity.kt b/app/src/main/java/io/legado/app/ui/about/AboutActivity.kt index f5636c134..7778d9519 100644 --- a/app/src/main/java/io/legado/app/ui/about/AboutActivity.kt +++ b/app/src/main/java/io/legado/app/ui/about/AboutActivity.kt @@ -3,38 +3,266 @@ package io.legado.app.ui.about import android.content.Intent import android.net.Uri import android.os.Bundle -import android.view.Menu -import android.view.MenuItem +import com.drakeet.multitype.MultiTypeAdapter +import com.mikepenz.iconics.IconicsDrawable +import com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial +import com.mikepenz.iconics.utils.colorInt +import com.mikepenz.iconics.utils.sizeDp +import io.legado.app.App import io.legado.app.R import io.legado.app.base.BaseActivity +import io.legado.app.lib.theme.ATH +import io.legado.app.lib.theme.ThemeStore +import io.legado.app.lib.theme.primaryColor +import io.legado.app.lib.theme.primaryTextColor +import io.legado.app.utils.shareText +import kotlinx.android.synthetic.main.activity_about_page.* +import org.jetbrains.anko.backgroundColor +import org.jetbrains.anko.textColor import org.jetbrains.anko.toast +import java.util.* -class AboutActivity : BaseActivity(R.layout.activity_about) { +class AboutActivity : BaseActivity(R.layout.activity_about_page, fullScreen = false) { + private val items: MutableList = ArrayList() override fun onActivityCreated(savedInstanceState: Bundle?) { - val fTag = "aboutFragment" - var aboutFragment = supportFragmentManager.findFragmentByTag(fTag) - if (aboutFragment == null) aboutFragment = AboutFragment() - supportFragmentManager.beginTransaction() - .replace(R.id.fl_fragment, aboutFragment, fTag) - .commit() + icon.setImageResource(R.drawable.ic_launcher_foreground) + slogan.setText(R.string.slogan) + val versionString = getString(R.string.version) + " " + App.INSTANCE.versionName + version.text = versionString + + setSupportActionBar(toolbar) + val actionBar = supportActionBar + if (actionBar != null) { + actionBar.setDisplayHomeAsUpEnabled(true) + actionBar.setDisplayShowHomeEnabled(true) + } + + collapsingToolbar.setContentScrimColor(primaryColor) + headerContentLayout.backgroundColor = primaryColor + collapsingToolbar.setCollapsedTitleTextColor(primaryTextColor) + slogan.textColor = primaryTextColor + version.textColor = primaryTextColor + version.setOnClickListener { + openIntent( + Intent.ACTION_VIEW, + getString(R.string.latest_release_url) + ) + } } - override fun onCompatCreateOptionsMenu(menu: Menu): Boolean { - menuInflater.inflate(R.menu.about, menu) - return super.onCompatCreateOptionsMenu(menu) + override fun onPostCreate(savedInstanceState: Bundle?) { + super.onPostCreate(savedInstanceState) + val adapter = MultiTypeAdapter() + adapter.register(ActionItem::class, ActionItemViewBinder(this)) + adapter.register(Category::class, CategoryViewBinder()) + onItemsCreated(items) + + adapter.items = items + adapter.setHasStableIds(true) + recyclerView.adapter = adapter + ATH.applyEdgeEffectColor(recyclerView) } - override fun onCompatOptionsItemSelected(item: MenuItem): Boolean { - when (item.itemId) { - R.id.menu_scoring -> openIntent("market://details?id=$packageName") - } - return super.onCompatOptionsItemSelected(item) + private fun onItemsCreated(items: MutableList) { + buildAboutCategory(items) + buildContactUsCategory(items) + buildDeveloperCategory(items) + buildOthersCategory(items) + } + + private fun buildAboutCategory(items: MutableList) { + val iconColor = ThemeStore.textColorPrimary(this) + items.add(Category(getString(R.string.about))) + items.add( + ActionItem.Builder() + .icon(IconicsDrawable(this, CommunityMaterial.Icon2.cmd_post) + .apply { + colorInt(iconColor) + sizeDp(18) + }) + .text(R.string.update_log) + .setOnClickAction(object : ActionListener { + override fun action() { + UpdateLog().show(supportFragmentManager, "update_log") + } + }) + .build() + ) + items.add( + ActionItem.Builder() + .icon(IconicsDrawable(this, CommunityMaterial.Icon2.cmd_thumb_up) + .apply { + colorInt(iconColor) + sizeDp(18) + }) + .text(R.string.scoring) + .setOnClickAction(object : ActionListener { + override fun action() { + openIntent(Intent.ACTION_VIEW, "market://details?id=$packageName") + } + }) + .build() + ) + items.add( + ActionItem.Builder() + .icon(IconicsDrawable(this, CommunityMaterial.Icon.cmd_bug) + .apply { + colorInt(iconColor) + sizeDp(18) + }) + .text(R.string.send_mail) + .subText(R.string.send_feedback_hint) + .setOnClickAction(object : ActionListener { + override fun action() { + openIntent(Intent.ACTION_SENDTO, "mailto:kunfei.ge@gmail.com") + } + }) + .build() + ) + items.add( + ActionItem.Builder() + .icon(IconicsDrawable(this, CommunityMaterial.Icon2.cmd_share_variant) + .apply { + colorInt(iconColor) + sizeDp(18) + }) + .text(R.string.share_app) + .setOnClickAction(object : ActionListener { + override fun action() { + shareText( + "App Share", + getString(R.string.app_share_description) + ) + } + }) + .build() + ) + } + + private fun buildContactUsCategory(items: MutableList) { + val iconColor = ThemeStore.textColorPrimary(this) + items.add(Category(getString(R.string.contact_us))) + items.add( + ActionItem.Builder() + .icon(IconicsDrawable(this, CommunityMaterial.Icon2.cmd_wechat) + .apply { + colorInt(iconColor) + sizeDp(18) + }) + .text(R.string.wechat_public_account) + .subText(R.string.wechat_public_account_name) + .setOnClickAction(object : ActionListener { + override fun action() { + // TODO 提供关注微信公众号的方法 + } + }) + .build() + ) + items.add( + ActionItem.Builder() + .icon(IconicsDrawable(this, CommunityMaterial.Icon2.cmd_qqchat) + .apply { + colorInt(iconColor) + sizeDp(18) + }) + .text(R.string.join_qq_group) + .setOnClickAction(object : ActionListener { + override fun action() { + // TODO 提供QQ加群方式 + } + }) + .build() + ) + items.add( + ActionItem.Builder() + .icon(IconicsDrawable(this, CommunityMaterial.Icon.cmd_github_circle) + .apply { + colorInt(iconColor) + sizeDp(18) + }) + .text(R.string.git_hub) + .subText(R.string.this_github_url) + .setOnClickAction(object : ActionListener { + override fun action() { + openIntent(Intent.ACTION_VIEW, getString(R.string.this_github_url)) + } + }) + .build() + ) + items.add( + ActionItem.Builder() + .icon(IconicsDrawable(this, CommunityMaterial.Icon2.cmd_web_box) + .apply { + colorInt(iconColor) + sizeDp(18) + }) + .text(R.string.home_page) + .subText(R.string.home_page_url) + .setOnClickAction(object : ActionListener { + override fun action() { + openIntent(Intent.ACTION_VIEW, getString(R.string.home_page_url)) + } + }) + .build() + ) + } + + private fun buildDeveloperCategory(items: MutableList) { + val iconColor = ThemeStore.textColorPrimary(this) + items.add(Category(getString(R.string.developers))) + items.add( + ActionItem.Builder() + .icon(IconicsDrawable(this, CommunityMaterial.Icon.cmd_developer_board) + .apply { + colorInt(iconColor) + sizeDp(18) + }) + .text(R.string.developer_description) + .subText(R.string.developer_detail) + .setOnClickAction(object : ActionListener { + override fun action() { + openIntent(Intent.ACTION_VIEW, getString(R.string.contributors_url)) + } + }) + .build() + ) + } + + private fun buildOthersCategory(items: MutableList) { + val iconColor = ThemeStore.textColorPrimary(this) + items.add(Category("其他")) + items.add( + ActionItem.Builder() + .icon(IconicsDrawable(this, CommunityMaterial.Icon2.cmd_license) + .apply { + colorInt(iconColor) + sizeDp(18) + }) + .text("开源许可") + .setOnClickAction(object : ActionListener { + override fun action() { + // TODO 打开开源许可页面 + } + }) + .build() + ) + items.add( + ActionItem.Builder() + .showIcon(true) + .text(R.string.disclaimer) + .setOnClickAction(object : ActionListener { + override fun action() { + // TODO 打开免责声明页面 + } + }) + .build() + ) } - private fun openIntent(address: String) { + private fun openIntent(intentName: String, address: String) { try { - val intent = Intent(Intent.ACTION_VIEW) + val intent = Intent(intentName) intent.data = Uri.parse(address) startActivity(intent) } catch (e: Exception) { diff --git a/app/src/main/java/io/legado/app/ui/about/AboutFragment.kt b/app/src/main/java/io/legado/app/ui/about/AboutFragment.kt deleted file mode 100644 index e48ef9354..000000000 --- a/app/src/main/java/io/legado/app/ui/about/AboutFragment.kt +++ /dev/null @@ -1,51 +0,0 @@ -package io.legado.app.ui.about - -import android.content.Intent -import android.net.Uri -import android.os.Bundle -import android.view.View -import androidx.preference.Preference -import androidx.preference.PreferenceFragmentCompat -import io.legado.app.App -import io.legado.app.R -import io.legado.app.utils.shareText -import io.legado.app.utils.toast - -class AboutFragment : PreferenceFragmentCompat() { - override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { - addPreferencesFromResource(R.xml.about) - findPreference("check_update")?.summary = getString(R.string.version) + " " + App.INSTANCE.versionName - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - listView.overScrollMode = View.OVER_SCROLL_NEVER - } - - override fun onPreferenceTreeClick(preference: Preference?): Boolean { - when (preference?.key) { - "contributors" -> openIntent(Intent.ACTION_VIEW, getString(R.string.contributors_url)) - "update_log" -> UpdateLog().show(childFragmentManager, "update_log") - "check_update" -> openIntent(Intent.ACTION_VIEW, getString(R.string.latest_release_url)) - "mail" -> openIntent(Intent.ACTION_SENDTO, "mailto:kunfei.ge@gmail.com") - "git" -> openIntent(Intent.ACTION_VIEW, getString(R.string.this_github_url)) - "home_page" -> openIntent(Intent.ACTION_VIEW, getString(R.string.home_page_url)) - "share_app" -> activity?.shareText( - "App Share", - getString(R.string.app_share_description) - ) - } - return super.onPreferenceTreeClick(preference) - } - - private fun openIntent(intentName: String, address: String) { - try { - val intent = Intent(intentName) - intent.data = Uri.parse(address) - startActivity(intent) - } catch (e: Exception) { - toast(R.string.can_not_open) - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/about/ActionItem.kt b/app/src/main/java/io/legado/app/ui/about/ActionItem.kt new file mode 100644 index 000000000..80d15ce4a --- /dev/null +++ b/app/src/main/java/io/legado/app/ui/about/ActionItem.kt @@ -0,0 +1,134 @@ +package io.legado.app.ui.about + +import android.graphics.drawable.Drawable +import android.os.Build +import android.text.Html + +import androidx.annotation.DrawableRes +import androidx.annotation.StringRes + +class ActionItem(builder: Builder) { + var onClickAction: ActionListener? = null + internal set + var onLongClickAction: ActionListener? = null + internal set + var text: CharSequence? = null + @StringRes + var textRes = 0 + var subText: CharSequence? = null + @StringRes + var subTextRes = 0 + var icon: Drawable? = null + @DrawableRes + var iconRes = 0 + private var showIcon = true + + init { + this.text = builder.text + this.textRes = builder.textRes + + this.subText = builder.subText + this.subTextRes = builder.subTextRes + + this.icon = builder.icon + this.iconRes = builder.iconRes + this.showIcon = builder.showIcon + + this.onClickAction = builder.onClickAction + this.onLongClickAction = builder.onLongClickAction + } + + fun shouldShowIcon(): Boolean { + return showIcon + } + + class Builder { + internal var onClickAction: ActionListener? = null + internal var onLongClickAction: ActionListener? = null + internal var text: CharSequence? = null + @StringRes + internal var textRes = 0 + internal var subText: CharSequence? = null + @StringRes + internal var subTextRes = 0 + internal var icon: Drawable? = null + @DrawableRes + internal var iconRes = 0 + internal var showIcon = true + + fun text(text: CharSequence): Builder { + this.text = text + this.textRes = 0 + return this + } + + fun text(@StringRes text: Int): Builder { + this.textRes = text + this.text = null + return this + } + + fun text(textHtml: String): Builder { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + this.text = Html.fromHtml(textHtml, Html.FROM_HTML_MODE_LEGACY) + } else { + this.text = Html.fromHtml(textHtml) + } + this.textRes = 0 + return this + } + + fun subText(subText: CharSequence): Builder { + this.subText = subText + this.subTextRes = 0 + return this + } + + fun subText(@StringRes subTextRes: Int): Builder { + this.subText = null + this.subTextRes = subTextRes + return this + } + + fun subTextHtml(subTextHtml: String): Builder { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + this.subText = Html.fromHtml(subTextHtml, Html.FROM_HTML_MODE_LEGACY) + } else { + this.subText = Html.fromHtml(subTextHtml) + } + this.subTextRes = 0 + return this + } + + fun icon(icon: Drawable): Builder { + this.icon = icon + this.iconRes = 0 + return this + } + + fun icon(@DrawableRes iconRes: Int): Builder { + this.icon = null + this.iconRes = iconRes + return this + } + + fun showIcon(showIcon: Boolean): Builder { + this.showIcon = showIcon + return this + } + + fun setOnClickAction(onClickAction: ActionListener): Builder { + this.onClickAction = onClickAction + return this + } + + fun setOnLongClickAction(onLongClickAction: ActionListener): Builder { + this.onLongClickAction = onLongClickAction + return this + } + + fun build(): ActionItem { + return ActionItem(this) + } + } +} diff --git a/app/src/main/java/io/legado/app/ui/about/ActionItemViewBinder.kt b/app/src/main/java/io/legado/app/ui/about/ActionItemViewBinder.kt new file mode 100644 index 000000000..c702c4a69 --- /dev/null +++ b/app/src/main/java/io/legado/app/ui/about/ActionItemViewBinder.kt @@ -0,0 +1,111 @@ +package io.legado.app.ui.about + +import android.content.Context +import android.util.TypedValue +import android.view.LayoutInflater +import android.view.View +import android.view.View.GONE +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.drakeet.multitype.ItemViewBinder +import io.legado.app.R + +class ActionItemViewBinder(private val context: Context) : + ItemViewBinder() { + + override fun onBindViewHolder(holder: ViewHolder, item: ActionItem) { + val text = item.text + val textRes = item.textRes + + holder.text.visibility = View.VISIBLE + when { + text != null -> { + holder.text.text = text + holder.text.setLineSpacing(0f, holder.text.lineSpacingMultiplier) + } + textRes != 0 -> { + holder.text.setText(textRes) + holder.text.setLineSpacing(0f, holder.text.lineSpacingMultiplier) + } + else -> holder.text.visibility = GONE + } + + val subText = item.subText + val subTextRes = item.subTextRes + + holder.subText.visibility = View.VISIBLE + when { + subText != null -> holder.subText.text = subText + subTextRes != 0 -> holder.subText.setText(subTextRes) + else -> holder.subText.visibility = GONE + } + + if (item.shouldShowIcon()) { + holder.icon.visibility = View.VISIBLE + val drawable = item.icon + val drawableRes = item.iconRes + if (drawable != null) { + holder.icon.setImageDrawable(drawable) + } else if (drawableRes != 0) { + holder.icon.setImageResource(drawableRes) + } + } else { + holder.icon.visibility = GONE + } + + if (item.onClickAction != null || item.onLongClickAction != null) { + val outValue = TypedValue() + context.theme.resolveAttribute( + R.attr.selectableItemBackground, + outValue, + true + ) + holder.view.setBackgroundResource(outValue.resourceId) + } else { + holder.view.setBackgroundResource(0) + } + holder.setOnClickAction(item.onClickAction) + holder.setOnLongClickAction(item.onLongClickAction) + } + + override fun onCreateViewHolder(inflater: LayoutInflater, parent: ViewGroup): ViewHolder { + return ViewHolder( + inflater.inflate(R.layout.about_page_action_item, parent, false) + ) + } + + class ViewHolder(val view: View) : RecyclerView.ViewHolder(view), View.OnClickListener, + View.OnLongClickListener { + val icon: ImageView = view.findViewById(R.id.mal_item_image) + val text: TextView = view.findViewById(R.id.mal_item_text) + val subText: TextView = view.findViewById(R.id.mal_action_item_subtext) + private var onClickAction: ActionListener? = null + private var onLongClickAction: ActionListener? = null + + fun setOnClickAction(onClickAction: ActionListener?) { + this.onClickAction = onClickAction + view.setOnClickListener(if (onClickAction != null) this else null) + } + + fun setOnLongClickAction(onLongClickAction: ActionListener?) { + this.onLongClickAction = onLongClickAction + view.setOnLongClickListener(if (onLongClickAction != null) this else null) + } + + override fun onClick(v: View) { + if (onClickAction != null) { + onClickAction!!.action() + } + } + + override fun onLongClick(v: View): Boolean { + if (onLongClickAction != null) { + onLongClickAction!!.action() + return true + } + return false + } + } +} diff --git a/app/src/main/java/io/legado/app/ui/about/ActionListener.kt b/app/src/main/java/io/legado/app/ui/about/ActionListener.kt new file mode 100644 index 000000000..ea1bfc519 --- /dev/null +++ b/app/src/main/java/io/legado/app/ui/about/ActionListener.kt @@ -0,0 +1,5 @@ +package io.legado.app.ui.about + +interface ActionListener { + fun action() +} diff --git a/app/src/main/java/io/legado/app/ui/about/Category.kt b/app/src/main/java/io/legado/app/ui/about/Category.kt new file mode 100644 index 000000000..dedb7b1ed --- /dev/null +++ b/app/src/main/java/io/legado/app/ui/about/Category.kt @@ -0,0 +1,5 @@ +package io.legado.app.ui.about + +import androidx.annotation.StringRes + +class Category(val title: String? = null, @StringRes val titleRes: Int = 0) diff --git a/app/src/main/java/io/legado/app/ui/about/CategoryViewBinder.kt b/app/src/main/java/io/legado/app/ui/about/CategoryViewBinder.kt new file mode 100644 index 000000000..bdad1f27d --- /dev/null +++ b/app/src/main/java/io/legado/app/ui/about/CategoryViewBinder.kt @@ -0,0 +1,41 @@ +package io.legado.app.ui.about + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.drakeet.multitype.ItemViewBinder +import io.legado.app.R +import io.legado.app.lib.theme.ColorUtils +import io.legado.app.lib.theme.accentColor +import io.legado.app.lib.theme.backgroundColor +import org.jetbrains.anko.backgroundColor +import org.jetbrains.anko.textColor + +class CategoryViewBinder : ItemViewBinder() { + + override fun onCreateViewHolder(inflater: LayoutInflater, parent: ViewGroup): ViewHolder { + return ViewHolder(inflater.inflate(R.layout.about_page_item_category, parent, false)) + } + + override fun onBindViewHolder(holder: ViewHolder, item: Category) { + val title = item.title + val titleRes = item.titleRes + when { + title != null -> holder.category.text = title + titleRes != 0 -> holder.category.setText(titleRes) + } + holder.category.text = item.title + } + + class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + + var category: TextView = itemView.findViewById(R.id.category) + + init { + category.textColor = itemView.context.accentColor + itemView.backgroundColor = ColorUtils.darkenColor(itemView.context.backgroundColor) + } + } +} diff --git a/app/src/main/res/layout/about_page_action_item.xml b/app/src/main/res/layout/about_page_action_item.xml new file mode 100644 index 000000000..02f535c6a --- /dev/null +++ b/app/src/main/res/layout/about_page_action_item.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/about_page_item_category.xml b/app/src/main/res/layout/about_page_item_category.xml new file mode 100644 index 000000000..3dffba160 --- /dev/null +++ b/app/src/main/res/layout/about_page_item_category.xml @@ -0,0 +1,10 @@ + + + + diff --git a/app/src/main/res/layout/activity_about_page.xml b/app/src/main/res/layout/activity_about_page.xml new file mode 100644 index 000000000..f90cf5edc --- /dev/null +++ b/app/src/main/res/layout/activity_about_page.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/menu/about.xml b/app/src/main/res/menu/about.xml deleted file mode 100644 index 7dd8f1e86..000000000 --- a/app/src/main/res/menu/about.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 9f8946337..a04ec88c1 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -35,4 +35,11 @@ 8dp 8dp 8dp + + 212dp + 16dp + 8dp + 4dp + 24dp + 32dp \ 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 b77cb7e75..809c91a63 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -86,10 +86,10 @@ 下载选择的章节到本地 换源 - \u3000\u3000这是一款开源的阅读软件,你可以fork我们的代码自己编译APK。欢迎提交代码帮助改善应用。\n\u3000\u3000公众号[开源阅读软件]! + 这是一款开源的阅读软件,你可以 fork 我们的代码自己编译 APK。欢迎提交代码帮助改善应用。\n\n\公众号「开源阅读软件」! - 阅读3.0下载地址:\nhttps://play.google.com/store/apps/details?id=io.legado.app + 阅读 3.0 下载地址:\nhttps://play.google.com/store/apps/details?id=io.legado.app Version %s 自动刷新 @@ -606,4 +606,12 @@ 文字操作显示搜索 记录日志 中文简繁体转换 + 享受美好时光 + 遇到问题?在此反馈 + 联系我们 + 公众号 + [ 开源阅读软件 ] + 开发者 + 开发人员主要为 gedoor,Invinciblelee 等 + 详情请在 GitHub 中查看 diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index d5c9e7104..3a8d26dcd 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -73,6 +73,78 @@ @drawable/bg_popup_menu + + + + + + + + + + + + + + + + +