在主页加入铁锈核心api网页链接,修改作品管理页面,修改审核模组按钮看不见的问题,改善个人主页封面动画。

This commit is contained in:
Cold-Mint 2023-04-09 02:05:09 +08:00
parent 2222ba6fec
commit 17ad7d561c
20 changed files with 295 additions and 123 deletions

View File

@ -28,6 +28,9 @@ class BrowserActivity : BaseActivity<ActivityBrowserBinding>() {
}
setReturnButton()
viewBinding.webView.loadUrl(link)
//是否启用Js
val enableJs = intent.getBooleanExtra("javaScriptEnabled",false);
viewBinding.webView.settings.javaScriptEnabled = enableJs
viewBinding.webView.webViewClient = object : WebViewClient() {
override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
viewBinding.linearProgressIndicator.isVisible = true

View File

@ -361,6 +361,14 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
false
}
menu.findItem(R.id.rust_api).setOnMenuItemClickListener {
val thisIntent = Intent(this, BrowserActivity::class.java)
thisIntent.putExtra("link", "https://rustedwarfareapicode.top/")
thisIntent.putExtra("javaScriptEnabled", true)
startActivity(thisIntent)
false
}
menu.findItem(R.id.about).setOnMenuItemClickListener {
startActivity(Intent(this@MainActivity, AboutActivity::class.java))
false

View File

@ -2,6 +2,7 @@ package com.coldmint.rust.pro
import android.annotation.SuppressLint
import android.content.Intent
import android.content.res.ColorStateList
import android.graphics.BitmapFactory
import android.net.Uri
import android.os.Bundle
@ -88,6 +89,19 @@ class ReleaseModActivity : BaseActivity<ActivityReleaseModBinding>() {
}
}
/**
* 加载默认图像
*/
fun loadDefaultImage() {
val drawable = getDrawable(R.drawable.image)
viewBinding.iconView.setImageDrawable(
GlobalMethod.tintDrawable(
drawable,
ColorStateList.valueOf(GlobalMethod.getColorPrimary(this))
)
)
}
private fun initData() {
lineParser.symbol = ","
@ -179,13 +193,16 @@ class ReleaseModActivity : BaseActivity<ActivityReleaseModBinding>() {
viewBinding.modIdEdit.setText(
Pinyin.toPinyin(temModClass.modName, "_").lowercase(Locale.getDefault())
)
viewBinding.versionNameEdit.setText("1.0")
viewBinding.modNameEdit.setText(temModClass.modName)
val description = temModClass.readValueFromInfoSection("description", "mod")
if (description != null) {
viewBinding.modDescribeEdit.setText(description)
}
val finalLink = temModClass.readResourceFromInfo("thumbnail")?.absolutePath
if (finalLink != null) {
if (finalLink == null) {
loadDefaultImage()
} else {
loadIcon(finalLink)
}
}
@ -224,6 +241,8 @@ class ReleaseModActivity : BaseActivity<ActivityReleaseModBinding>() {
val icon = t.data.icon
if (icon != null && icon.isNotBlank()) {
loadIcon(ServerConfiguration.getRealLink(icon))
} else {
loadDefaultImage()
}
val screenshots = t.data.screenshots
@ -390,7 +409,7 @@ class ReleaseModActivity : BaseActivity<ActivityReleaseModBinding>() {
bundle.putString("tag", lineData)
bundle.putString(
"title",
String.format(getString(R.string.tag_title), s)
String.format(getString(R.string.tag_title), lineData)
)
bundle.putString("action", "tag")
val thisIntent =
@ -490,7 +509,7 @@ class ReleaseModActivity : BaseActivity<ActivityReleaseModBinding>() {
if (link != null) {
needIcon = false
}
viewBinding.iconView.setImageResource(R.drawable.image)
loadDefaultImage()
}
false
}

View File

@ -25,6 +25,7 @@ class SearchResultActivity : BaseActivity<ActivitySearchResultBinding>() {
map["mod_comments"] = R.string.search_type_mod_comments
map["mod_versions"] = R.string.search_type_mod_versions
map["purchase_plan"] = R.string.search_type_purchase_plan
map["template_package"] = R.string.search_type_template_package
map
}

View File

@ -5,6 +5,8 @@ import android.app.ActivityOptions
import android.content.Context
import android.content.Intent
import android.graphics.Color
import android.graphics.Shader
import android.graphics.drawable.BitmapDrawable
import android.graphics.drawable.Drawable
import android.os.Bundle
import android.view.Gravity
@ -13,6 +15,7 @@ import android.view.View
import android.view.inputmethod.EditorInfo
import android.widget.EditText
import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.core.view.drawToBitmap
import androidx.core.view.isVisible
import com.bumptech.glide.Glide
import com.coldmint.dialog.CoreDialog
@ -25,6 +28,7 @@ import com.coldmint.rust.pro.adapters.UserHomeStateAdapter
import com.coldmint.rust.pro.base.BaseActivity
import com.coldmint.rust.pro.databinding.ActivityUserHomePageBinding
import com.coldmint.rust.pro.dialog.CommentDialog
import com.coldmint.rust.pro.tool.AnimUtil
import com.coldmint.rust.pro.tool.AppSettings
import com.coldmint.rust.pro.tool.GlobalMethod
import com.google.android.material.appbar.AppBarLayout
@ -45,7 +49,7 @@ class UserHomePageActivity : BaseActivity<ActivityUserHomePageBinding>() {
val userHomeStateAdapter by lazy {
UserHomeStateAdapter(this, userId)
}
var needShowFab = false
//旧的备份数据
var oldSpaceInfoData: SpaceInfoData? = null
@ -120,7 +124,7 @@ class UserHomePageActivity : BaseActivity<ActivityUserHomePageBinding>() {
if (account == null) {
viewBinding.button.text = getString(R.string.please_login_first)
viewBinding.button.isEnabled = false
}else{
} else {
if (account == userId) {
viewBinding.button.text = getString(R.string.editData)
} else {
@ -131,7 +135,8 @@ class UserHomePageActivity : BaseActivity<ActivityUserHomePageBinding>() {
if (data != null && ServerConfiguration.isEvent(data)) {
when (data) {
"@event:已互粉" -> {
viewBinding.button.text = getString(R.string.each_other_follow)
viewBinding.button.text =
getString(R.string.each_other_follow)
}
"@event:已关注" -> {
viewBinding.button.text = getString(R.string.followed)
@ -237,20 +242,53 @@ class UserHomePageActivity : BaseActivity<ActivityUserHomePageBinding>() {
if (cover != null) {
Glide.with(this).load(ServerConfiguration.getRealLink(cover))
.into(viewBinding.coverView)
Glide.with(this).load(ServerConfiguration.getRealLink(cover))
.into(viewBinding.fullCoverView)
}
viewBinding.viewPager.adapter = userHomeStateAdapter
viewBinding.coverView.setOnClickListener {
if (cover != null) {
val intent = Intent(this@UserHomePageActivity, FullScreenCoverActivity::class.java)
val name = getString(R.string.transition_cover)
val options =
ActivityOptions.makeSceneTransitionAnimation(this, viewBinding.coverView, name)
intent.putExtra("iconLink", cover)
this@UserHomePageActivity.startActivity(intent, options.toBundle())
if (cover == null) {
return@setOnClickListener
}
viewBinding.coverView.visibility = View.INVISIBLE
AnimUtil.doAnim(
this,
R.anim.overall_drop,
listOf(viewBinding.appBar, viewBinding.viewPager)
) { views ->
views.forEach {
it.isVisible = false
}
needShowFab = viewBinding.fab.isShown
if (needShowFab) {
viewBinding.fab.hide()
}
viewBinding.fullCoverView.isVisible = true
}
}
viewBinding.fullCoverView.setOnClickListener {
if (cover == null) {
return@setOnClickListener
}
viewBinding.fullCoverView.isVisible = false
AnimUtil.doAnim(
this,
R.anim.overall_up,
listOf(viewBinding.appBar, viewBinding.viewPager)
) { views ->
views.forEach {
it.isVisible = true
}
if (needShowFab) {
viewBinding.fab.show()
}
viewBinding.coverView.isVisible = true
}
}
fans = spaceInfoData.data.fans

View File

@ -11,6 +11,8 @@ import androidx.core.view.isVisible
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import com.afollestad.materialdialogs.MaterialDialog
import com.coldmint.dialog.CoreDialog
import com.coldmint.dialog.databinding.DialogCoreBinding
import com.coldmint.rust.core.dataBean.ApiResponse
import com.coldmint.rust.core.dataBean.mod.WebModAllInfoData
import com.coldmint.rust.core.dataBean.mod.WebModListData
@ -70,30 +72,27 @@ class WorkManagementActivity : BaseActivity<ActivityWorkmangementBinding>() {
val adapter =
WebModAllInfoAdapter(this@WorkManagementActivity, data)
adapter.setItemEvent { i, itemWebmodAllInfoBinding, viewHolder, data ->
itemWebmodAllInfoBinding.more.setOnClickListener {
val popupMenu = GlobalMethod.createPopMenu(it)
when (data.hidden) {
0 -> {
//上架状态
popupMenu.menu.add(R.string.sold_out_mod)
popupMenu.menu.add(R.string.work_of_home_page)
popupMenu.menu.add(R.string.submit_the_update)
}
1 -> {
//等待审核
itemWebmodAllInfoBinding.modIntroductionView.setText(
R.string.not_audit
)
}
-1 -> {
//用户手动隐藏
popupMenu.menu.add(R.string.review_audit)
popupMenu.menu.add(R.string.work_of_home_page)
}
-2 -> {
//被管理员举报下架
itemWebmodAllInfoBinding.modIntroductionView.setText(
R.string.banned_mod
)
else -> {
}
}
popupMenu.menu.add(R.string.work_of_home_page)
popupMenu.menu.add(R.string.submit_the_update)
popupMenu.menu.add(R.string.update_record)
popupMenu.show()
popupMenu.setOnMenuItemClickListener {
@ -128,88 +127,88 @@ class WorkManagementActivity : BaseActivity<ActivityWorkmangementBinding>() {
startActivity(intent)
}
getString(R.string.sold_out_mod) -> {
MaterialDialog(this@WorkManagementActivity).show {
title(R.string.sold_out_mod).message(R.string.sold_out_mod_tip)
.positiveButton(R.string.dialog_ok)
.positiveButton {
WebMod.instance.soldOutMod(
data.developer,
data.id,
object :
ApiCallBack<ApiResponse> {
override fun onResponse(
t: ApiResponse
) {
if (t.code == ServerConfiguration.Success_Code) {
data.hidden = -1
} else {
Snackbar.make(
viewBinding.recyclerView,
t.message,
Snackbar.LENGTH_SHORT
).show()
}
CoreDialog(this@WorkManagementActivity).setTitle(
R.string.sold_out_mod
).setMessage(R.string.sold_out_mod_tip)
.setPositiveButton(R.string.dialog_ok) {
WebMod.instance.soldOutMod(
data.developer,
data.id,
object :
ApiCallBack<ApiResponse> {
override fun onResponse(
t: ApiResponse
) {
if (t.code == ServerConfiguration.Success_Code) {
data.hidden = -1
adapter.notifyItemChanged(i)
} else {
Snackbar.make(
viewBinding.recyclerView,
t.message,
Snackbar.LENGTH_SHORT
).show()
}
}
override fun onFailure(e: Exception) {
showInternetError(
view = viewBinding.recyclerView,
exception = e
)
}
override fun onFailure(e: Exception) {
showInternetError(
view = viewBinding.recyclerView,
exception = e
)
}
})
}
.negativeButton(R.string.dialog_cancel)
.cancelable(false)
}
})
}
.setNegativeButton(R.string.dialog_cancel) {
}
.setCancelable(false).show()
}
getString(R.string.review_audit) -> {
MaterialDialog(this@WorkManagementActivity).show {
title(R.string.review_audit).message(
text =
String.format(
getString(R.string.review_audit_mod_tip),
data.name
)
CoreDialog(this@WorkManagementActivity).setTitle(
R.string.review_audit
).setMessage(
String.format(
getString(R.string.review_audit_mod_tip),
data.name
)
.positiveButton(R.string.dialog_ok)
.positiveButton {
WebMod.instance.afreshAuditMod(
AppSettings
.getValue(
AppSettings.Setting.Token,
""
),
data.id,
object :
ApiCallBack<ApiResponse> {
override fun onResponse(
t: ApiResponse
) {
if (t.code == ServerConfiguration.Success_Code) {
data.hidden = 1
} else {
Snackbar.make(
viewBinding.recyclerView,
t.message,
Snackbar.LENGTH_SHORT
).show()
}
}
).setPositiveButton(R.string.dialog_ok) {
WebMod.instance.afreshAuditMod(
AppSettings
.getValue(
AppSettings.Setting.Token,
""
),
data.id,
object :
ApiCallBack<ApiResponse> {
override fun onResponse(
t: ApiResponse
) {
if (t.code == ServerConfiguration.Success_Code) {
data.hidden = 1
adapter.notifyItemChanged(i)
} else {
Snackbar.make(
viewBinding.recyclerView,
t.message,
Snackbar.LENGTH_SHORT
).show()
}
}
override fun onFailure(e: Exception) {
showInternetError(
view = viewBinding.recyclerView,
exception = e
)
}
override fun onFailure(e: Exception) {
showInternetError(
view = viewBinding.recyclerView,
exception = e
)
}
})
}
.negativeButton(R.string.dialog_cancel)
.cancelable(false)
}
})
}.setNegativeButton(R.string.dialog_cancel) {
}.setCancelable(false).show()
}
}
false

View File

@ -27,8 +27,8 @@ import java.lang.StringBuilder
* @date 2022/1/9 11:03
*/
class ReportAdapter(
context: Context,
dataList: MutableList<ReportItemDataBean.Data>
context: Context,
dataList: MutableList<ReportItemDataBean.Data>
) :
BaseAdapter<ItemReportBinding, ReportItemDataBean.Data>(context, dataList) {
override fun getViewBindingObject(
@ -54,7 +54,7 @@ class ReportAdapter(
viewBinding.timeView.text = data.time
viewBinding.nameView.text = data.userName
viewBinding.openView.text =
String.format(context.getString(R.string.view_the_report_object), data.target)
context.getString(R.string.view_the_report_object)
when (data.type) {
"mod" -> {
viewBinding.typeView.setText(R.string.report_mod)

View File

@ -5,6 +5,7 @@ import android.content.ServiceConnection
import android.view.LayoutInflater
import android.view.ViewGroup
import android.widget.PopupMenu
import androidx.core.view.isVisible
import com.bumptech.glide.Glide
import com.coldmint.rust.core.dataBean.ApiResponse
import com.coldmint.rust.core.dataBean.mod.WebModAllInfoData
@ -22,7 +23,7 @@ import com.coldmint.rust.pro.tool.GlobalMethod
* @date 2022/1/4 10:59
*/
class WebModAllInfoAdapter(
context: Context,
context: Context,
list: MutableList<WebModAllInfoData.Data>
) :
BaseAdapter<ItemWebmodAllInfoBinding, WebModAllInfoData.Data>(context, list) {
@ -41,10 +42,35 @@ class WebModAllInfoAdapter(
position: Int
) {
viewBinding.modNameView.text = data.name
viewBinding.modIntroductionView.text = data.describe
when (data.hidden) {
1 -> {
//等待审核
viewBinding.modIntroductionView.setText(
R.string.not_audit
)
viewBinding.more.isVisible = false
}
-2 -> {
//被管理员举报下架
viewBinding.modIntroductionView.setText(
R.string.banned_mod
)
viewBinding.more.isVisible = false
}
0 -> {
viewBinding.modIntroductionView.setText(R.string.public_mod)
viewBinding.more.isVisible = true
}
else->{
viewBinding.modIntroductionView.setText(R.string.private_mod)
viewBinding.more.isVisible = true
}
}
val icon = data.icon
if (icon != null && icon.isNotBlank()) {
Glide.with(context).load(ServerConfiguration.getRealLink(icon)).apply(GlobalMethod.getRequestOptions())
Glide.with(context).load(ServerConfiguration.getRealLink(icon))
.apply(GlobalMethod.getRequestOptions(grayscale = data.hidden == -2))
.into(viewBinding.modIcon)
}
}

View File

@ -0,0 +1,40 @@
package com.coldmint.rust.pro.tool
import android.content.Context
import android.view.View
import android.view.animation.Animation
import android.view.animation.AnimationUtils
object AnimUtil {
/**
* 播放动画资产文件
*/
fun doAnim(
context: Context,
animRes: Int,
views: List<View>,
func: (views: List<View>) -> Unit
) {
val animation = AnimationUtils.loadAnimation(context, animRes)
animation.setAnimationListener(object : Animation.AnimationListener {
override fun onAnimationStart(animation: Animation?) {
}
override fun onAnimationEnd(animation: Animation?) {
views.forEach {
it.clearAnimation()
}
func.invoke(views)
}
override fun onAnimationRepeat(animation: Animation?) {
}
})
views.forEach {
it.startAnimation(animation)
}
}
}

View File

@ -348,7 +348,6 @@ object GlobalMethod {
}
}
//打开指定app
//图像着色
fun tintDrawable(drawable: Drawable?, colors: ColorStateList?): Drawable {
val wrappedDrawable = DrawableCompat.wrap(drawable!!)

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="350">
<translate
android:fromYDelta="0%p"
android:toYDelta="100%p" />
</set>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="350">
<translate
android:fromYDelta="100%p"
android:toYDelta="0%p" />
</set>

View File

@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#000000"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M18,2L6,2c-1.1,0 -2,0.9 -2,2v16c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L20,4c0,-1.1 -0.9,-2 -2,-2zM9,4h2v5l-1,-0.75L9,9L9,4zM18,20L6,20L6,4h1v9l3,-2.25L13,13L13,4h5v16z"/>
</vector>

View File

@ -221,12 +221,21 @@
android:layout_height="wrap_content"
android:text="@string/mod_icon" />
<ImageView
android:id="@+id/iconView"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_margin="8dp"
android:src="@drawable/image" />
<com.google.android.material.card.MaterialCardView
style="@style/Widget.Material3.CardView.Filled"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp">
<ImageView
android:id="@+id/iconView"
android:layout_width="72dp"
android:layout_height="72dp"
android:scaleType="centerCrop"
android:src="@drawable/image" />
</com.google.android.material.card.MaterialCardView>
</LinearLayout>
@ -325,7 +334,7 @@
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="8dp"
android:layout_margin="16dp"
android:animateLayoutChanges="true"
android:orientation="vertical">

View File

@ -4,6 +4,12 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/fullCoverView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="matrix"
android:visibility="gone" />
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/appBar"
@ -135,7 +141,6 @@
<LinearLayout
android:id="@+id/numberLayout"
android:layout_marginTop="8dp"
android:layout_width="match_parent"
android:layout_height="46dp">
@ -266,4 +271,5 @@
android:src="@drawable/add"
android:visibility="gone" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@ -59,6 +59,10 @@
android:id="@+id/user_group"
android:icon="@drawable/ic_outline_free_breakfast_24"
android:title="@string/user_group" />
<item
android:id="@+id/rust_api"
android:icon="@drawable/outline_book_24"
android:title="@string/rust_api" />
<item

View File

@ -439,7 +439,7 @@
<string name="user_name">The user name</string>
<string name="report_mod">Report mod</string>
<string name="report_user">To report the user</string>
<string name="view_the_report_object">Check (%1$s)</string>
<string name="view_the_report_object">Check</string>
<string name="bookmark_already_exists">The book label already exists. Please change the path.</string>
<string name="feedback">feedback</string>
<string name="please_set_main_image">Please set the main image.</string>
@ -687,7 +687,6 @@
<string name="girl">female</string>
<string name="search_hint">Please enter your search content</string>
<string name="report_to_deal">To report to deal with</string>
<string name="banned_mod">Because of the report, was removed by the administrator.</string>
<string name="unable_to_report">This mod is hidden and cannot be reported.</string>
<string name="unable_to_report2">You cannot report your own mods. If you want to remove a mod, please go to \"Work Management\".</string>
<string name="admin">The administrator</string>

View File

@ -439,7 +439,7 @@
<string name="user_name">ユーザー名</string>
<string name="report_mod">通報モジュール</string>
<string name="report_user">ユーザーを通報する</string>
<string name="view_the_report_object">(%1$s)を見る</string>
<string name="view_the_report_object">を見る</string>
<string name="bookmark_already_exists">サインがありますので、パスを変更してください。</string>
<string name="feedback">意見のフィードバック</string>
<string name="please_set_main_image">本体画像を設定してください。</string>
@ -687,7 +687,6 @@
<string name="girl"></string>
<string name="search_hint">検索内容を入力してください</string>
<string name="report_to_deal">通報処理</string>
<string name="banned_mod">通報され、管理人に撤去された。</string>
<string name="unable_to_report">このモジュールは隠れていて、通報することができません。</string>
<string name="unable_to_report2">自分のモジュールを通報することはできません、もしモジュールを降ろすことを希望するならば\「作品管理\」に行ってください。</string>
<string name="admin">管理人</string>

View File

@ -438,7 +438,7 @@
<string name="user_name">Имя пользователя.</string>
<string name="report_mod">Группа доноров</string>
<string name="report_user">Сообщать о потребителе</string>
<string name="view_the_report_object">Смотрите.</string>
<string name="view_the_report_object">Смотрите</string>
<string name="bookmark_already_exists">Подписание книги уже существует.</string>
<string name="feedback">Обратная связь мнений</string>
<string name="please_set_main_image">Пожалуйста, установите основные изображения.</string>
@ -686,7 +686,6 @@
<string name="girl">женщин</string>
<string name="search_hint">Введите, пожалуйста, содержимое поиска</string>
<string name="report_to_deal">Отчет.</string>
<string name="banned_mod">Был снят с крючка администратором за жалобу.</string>
<string name="unable_to_report">Этот модуль скрыт и не может быть донесён.</string>
<string name="unable_to_report2">Не могу сообщить о своей группе моделей, и если вы хотите, чтобы она ушла с подиума, пожалуйста, пройдите в/управление работами /.</string>
<string name="admin">Администратор.</string>

View File

@ -461,7 +461,7 @@
<string name="user_name">用户名</string>
<string name="report_mod">举报模组</string>
<string name="report_user">举报用户</string>
<string name="view_the_report_object">查看(%1$s)</string>
<string name="view_the_report_object">查看</string>
<string name="bookmark_already_exists">此书签已存在,请更换路径。</string>
<string name="feedback">意见反馈</string>
<string name="please_set_main_image">请设置主体图像。</string>
@ -717,7 +717,7 @@
<string name="girl"></string>
<string name="search_hint">请输入搜索内容</string>
<string name="report_to_deal">举报处理</string>
<string name="banned_mod">因举报,被管理员下架</string>
<string name="banned_mod">因举报,被管理员下架</string>
<string name="unable_to_report">此模组是隐藏的,无法举报。</string>
<string name="unable_to_report2">不能举报自己的模组,若希望下架模组请前往\"作品管理\"。</string>
<string name="admin">管理员</string>
@ -951,4 +951,8 @@
<string name="obtain_source_code_msg">在Github上查看铁锈助手的源代码助手已开源欢迎二次开发。</string>
<string name="obtain_source_code">获取源代码</string>
<string name="setting_obtain_source_code" translatable="false">ObtainSourceCode</string>
<string name="rust_api">铁锈Api-Code</string>
<string name="search_type_template_package">模板包</string>
<string name="public_mod">公开</string>
<string name="private_mod">私有</string>
</resources>