模组投币

This commit is contained in:
coldmint 2022-08-31 14:34:45 +08:00
parent f639e89a53
commit 5c3d4f09c9
60 changed files with 1460 additions and 660 deletions

Binary file not shown.

View File

@ -162,21 +162,23 @@ class ChangePasswordActivity : BaseActivity<ActivityChangePasswordBinding>() {
account, account,
false false
) && checkCode(code, false) && checkPassword( ) && checkCode(code, false) && checkPassword(
passWord passWord, false
) )
} }
private fun checkCode(code: String, updateView: Boolean = true): Boolean { private fun checkCode(code: String, updateView: Boolean = true): Boolean {
return if (code.isBlank()) { return if (code.isBlank()) {
setErrorAndInput( if (updateView) {
viewBinding.verificationCodeView, setErrorAndInput(
String.format( viewBinding.verificationCodeView,
getString(R.string.please_input_value), String.format(
viewBinding.verificationCodeLayout.hint.toString() getString(R.string.please_input_value),
), viewBinding.verificationCodeLayout.hint.toString()
viewBinding.verificationCodeLayout ),
) viewBinding.verificationCodeLayout
)
}
false false
} else { } else {
if (updateView) { if (updateView) {

View File

@ -16,6 +16,7 @@ import android.text.style.ClickableSpan
import android.util.Log import android.util.Log
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import androidx.core.view.isVisible
import com.afollestad.materialdialogs.MaterialDialog import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.WhichButton import com.afollestad.materialdialogs.WhichButton
import com.afollestad.materialdialogs.actions.setActionButtonEnabled import com.afollestad.materialdialogs.actions.setActionButtonEnabled
@ -46,7 +47,7 @@ class LoginActivity : BaseActivity<ActivityLoginBinding>() {
.transparentNavigationBar().navigationBarDarkIcon(true) .transparentNavigationBar().navigationBarDarkIcon(true)
} }
Log.d("应用识别码", AppSettings.getValue(AppSettings.Setting.AppID, "")) Log.d("应用识别码", AppSettings.getValue(AppSettings.Setting.AppID, ""))
viewBinding.changeServerView.isVisible = BuildConfig.DEBUG
viewBinding.changePasswordView.setOnClickListener { viewBinding.changePasswordView.setOnClickListener {
val intent = Intent(this, ChangePasswordActivity::class.java) val intent = Intent(this, ChangePasswordActivity::class.java)
startActivity(intent) startActivity(intent)
@ -216,14 +217,14 @@ class LoginActivity : BaseActivity<ActivityLoginBinding>() {
) )
} }
"请更改登录设备" -> { "请更改登录设备" -> {
viewBinding.button.isActivated = false viewBinding.button.isEnabled = false
verification( verification(
account, account,
passWord, passWord,
appId, appId,
object : ApiCallBack<ApiResponse> { object : ApiCallBack<ApiResponse> {
override fun onResponse(t: ApiResponse) { override fun onResponse(t: ApiResponse) {
viewBinding.button.isActivated = true viewBinding.button.isEnabled = true
if (t.code == ServerConfiguration.Success_Code) { if (t.code == ServerConfiguration.Success_Code) {
MaterialDialog(this@LoginActivity).show { MaterialDialog(this@LoginActivity).show {
title(R.string.verification).message( title(R.string.verification).message(
@ -290,13 +291,8 @@ class LoginActivity : BaseActivity<ActivityLoginBinding>() {
} }
override fun onFailure(e: Exception) { override fun onFailure(e: Exception) {
viewBinding.button.isActivated = true viewBinding.button.isEnabled = true
isLogin = false isLogin = false
viewBinding.button.setBackgroundColor(
GlobalMethod.getColorPrimary(
this@LoginActivity
)
)
viewBinding.button.setText(R.string.login) viewBinding.button.setText(R.string.login)
showInternetError(viewBinding.button, e) showInternetError(viewBinding.button, e)
} }
@ -316,7 +312,6 @@ class LoginActivity : BaseActivity<ActivityLoginBinding>() {
override fun onFailure(e: Exception) { override fun onFailure(e: Exception) {
isLogin = false isLogin = false
viewBinding.button.setBackgroundColor(GlobalMethod.getColorPrimary(this@LoginActivity))
viewBinding.button.setText(R.string.login) viewBinding.button.setText(R.string.login)
showInternetError(viewBinding.button, e) showInternetError(viewBinding.button, e)
} }

View File

@ -34,6 +34,7 @@ import com.coldmint.rust.core.web.AppUpdate
import com.coldmint.rust.core.web.ServerConfiguration import com.coldmint.rust.core.web.ServerConfiguration
import com.coldmint.rust.pro.databinding.ActivityMainBinding import com.coldmint.rust.pro.databinding.ActivityMainBinding
import com.coldmint.rust.pro.databinding.HeadLayoutBinding import com.coldmint.rust.pro.databinding.HeadLayoutBinding
import com.coldmint.rust.pro.fragments.UserGroupFragment
import com.coldmint.rust.pro.viewmodel.StartViewModel import com.coldmint.rust.pro.viewmodel.StartViewModel
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayout
@ -266,6 +267,13 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
val codeTable = menu.findItem(R.id.code_table) val codeTable = menu.findItem(R.id.code_table)
val mod = menu.findItem(R.id.mod_item) val mod = menu.findItem(R.id.mod_item)
val community = menu.findItem(R.id.community_item) val community = menu.findItem(R.id.community_item)
val group = menu.findItem(R.id.user_group)
group.setOnMenuItemClickListener {
viewBinding.drawerlayout.closeDrawer((GravityCompat.START))
val userGroupFragment = UserGroupFragment()
userGroupFragment.show(supportFragmentManager, "userGroup")
false
}
// val help = menu.findItem(R.id.help) // val help = menu.findItem(R.id.help)
//管理可见性 //管理可见性
dataBase.isVisible = isActive dataBase.isVisible = isActive

View File

@ -51,9 +51,8 @@ class PackActivity : BaseActivity<ActivityPackBinding>() {
private var needReturn: Boolean = false private var needReturn: Boolean = false
override fun whenCreateActivity(savedInstanceState: Bundle?, canUseView: Boolean) { override fun whenCreateActivity(savedInstanceState: Bundle?, canUseView: Boolean) {
if (canUseView) if (canUseView) {
{ title = getText(R.string.packmod)
viewBinding.toolbar.title = getText(R.string.packmod)
setReturnButton() setReturnButton()
initData() initData()
initAction() initAction()
@ -146,12 +145,6 @@ class PackActivity : BaseActivity<ActivityPackBinding>() {
if (type == getString(R.string.packmod)) { if (type == getString(R.string.packmod)) {
sourceFileNum = 0 sourceFileNum = 0
viewBinding.packCard.isVisible = true viewBinding.packCard.isVisible = true
viewBinding.packButton.setBackgroundColor(
GlobalMethod.getThemeColor(
this@PackActivity,
R.attr.colorPrimaryVariant
)
)
viewBinding.packButton.setText(R.string.packing) viewBinding.packButton.setText(R.string.packing)
viewBinding.packingTitle.setText(R.string.packmod) viewBinding.packingTitle.setText(R.string.packmod)
if (saveConfigurationData()) { if (saveConfigurationData()) {
@ -171,8 +164,8 @@ class PackActivity : BaseActivity<ActivityPackBinding>() {
* @param result 是否解压成功 * @param result 是否解压成功
*/ */
private fun resetButton(result: Boolean) { private fun resetButton(result: Boolean) {
viewBinding.packButton.setBackgroundColor(GlobalMethod.getColorPrimary(this@PackActivity))
if (result) { if (result) {
viewBinding.packButton.setIconResource(R.drawable.ic_outline_share_24)
viewBinding.packButton.setText(R.string.share_mod) viewBinding.packButton.setText(R.string.share_mod)
if (needRecyclingFile && viewBinding.deleteSourceFile.isChecked) { if (needRecyclingFile && viewBinding.deleteSourceFile.isChecked) {
val tip = String.format(getString(R.string.recovery_prompt), modName) val tip = String.format(getString(R.string.recovery_prompt), modName)

View File

@ -29,7 +29,6 @@ class RustApplication : Application() {
DynamicColors.isDynamicColorAvailable() DynamicColors.isDynamicColorAvailable()
) )
}.build() }.build()
CompletionItemConverter.init(this)
DynamicColors.applyToActivitiesIfAvailable(this, options) DynamicColors.applyToActivitiesIfAvailable(this, options)
//程序崩溃 //程序崩溃
CaocConfig.Builder.create() CaocConfig.Builder.create()

View File

@ -40,6 +40,7 @@ import com.coldmint.rust.core.web.ServerConfiguration
import com.coldmint.rust.core.web.User import com.coldmint.rust.core.web.User
import com.coldmint.rust.core.web.WebMod import com.coldmint.rust.core.web.WebMod
import com.coldmint.rust.pro.adapters.CommentAdapter import com.coldmint.rust.pro.adapters.CommentAdapter
import com.coldmint.rust.pro.adapters.ModPageDetailsAdapter
import com.coldmint.rust.pro.databinding.ActivityWebModInfoBinding import com.coldmint.rust.pro.databinding.ActivityWebModInfoBinding
import com.coldmint.rust.pro.tool.AppSettings import com.coldmint.rust.pro.tool.AppSettings
import com.coldmint.rust.pro.base.BaseActivity import com.coldmint.rust.pro.base.BaseActivity
@ -47,7 +48,9 @@ import com.coldmint.rust.pro.databinding.LoadFileLayoutBinding
import com.coldmint.rust.pro.dialog.CommentDialog import com.coldmint.rust.pro.dialog.CommentDialog
import com.coldmint.rust.pro.tool.GlobalMethod import com.coldmint.rust.pro.tool.GlobalMethod
import com.coldmint.rust.pro.tool.TextStyleMaker import com.coldmint.rust.pro.tool.TextStyleMaker
import com.google.android.material.appbar.AppBarLayout
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import com.google.android.material.tabs.TabLayoutMediator
import com.youth.banner.adapter.BannerImageAdapter import com.youth.banner.adapter.BannerImageAdapter
import com.youth.banner.holder.BannerImageHolder import com.youth.banner.holder.BannerImageHolder
import com.youth.banner.indicator.CircleIndicator import com.youth.banner.indicator.CircleIndicator
@ -73,10 +76,7 @@ class WebModInfoActivity : BaseActivity<ActivityWebModInfoBinding>() {
val token by lazy { val token by lazy {
AppSettings.getValue(AppSettings.Setting.Token, "") AppSettings.getValue(AppSettings.Setting.Token, "")
} }
var developer: String? = null lateinit var adapter :ModPageDetailsAdapter
//此模组是否对外开放
private var isOpen = false
private fun initView() { private fun initView() {
setReturnButton() setReturnButton()
@ -98,152 +98,179 @@ class WebModInfoActivity : BaseActivity<ActivityWebModInfoBinding>() {
viewBinding.button.isEnabled = false viewBinding.button.isEnabled = false
viewBinding.button.text = getString(R.string.installated) viewBinding.button.text = getString(R.string.installated)
} }
viewBinding.modCommentRecyclerView.layoutManager = adapter = ModPageDetailsAdapter(this, modId)
LinearLayoutManager(this@WebModInfoActivity) viewBinding.viewPager2.adapter = adapter
viewBinding.modCommentRecyclerView.addItemDecoration( TabLayoutMediator(viewBinding.tabLayout, viewBinding.viewPager2) { tab, i ->
DividerItemDecoration(this@WebModInfoActivity, DividerItemDecoration.VERTICAL) tab.text = when (i) {
) 0 -> {
tip = getString(R.string.file_download_progress) getString(R.string.details)
}
}
private fun initData() {
if (token.isBlank()) {
viewBinding.progressBar.isVisible = false
viewBinding.tipView.isVisible = true
viewBinding.tipView.setText(R.string.please_login_first)
return
}
loadModCommentList(modId)
WebMod.instance.getInfo(token, modId, object : ApiCallBack<WebModInfoData> {
override fun onResponse(t: WebModInfoData) {
if (t.code == ServerConfiguration.Success_Code) {
developer = t.data.developer
isOpen = t.data.hidden == 0
viewBinding.loadLayout.isVisible = false
viewBinding.relativeLayout.isVisible = true
val icon = t.data.icon
if (icon != null && icon.isNotBlank()) {
Glide.with(this@WebModInfoActivity)
.load(ServerConfiguration.getRealLink(icon))
.apply(GlobalMethod.getRequestOptions())
.into(viewBinding.iconView)
} }
title = t.data.name 1 -> {
val screenshotListData = t.data.screenshots getString(R.string.insert_coins)
if (screenshotListData != null && screenshotListData.isNotBlank()) {
val list = ArrayList<String>()
val lineParser = LineParser()
lineParser.symbol = ","
lineParser.text = screenshotListData
lineParser.analyse { lineNum, lineData, isEnd ->
list.add(lineData)
true
}
val adapter = object : BannerImageAdapter<String>(list) {
override fun onBindView(
holder: BannerImageHolder?,
data: String?,
position: Int,
size: Int
) {
if (data != null && holder != null) {
Glide.with(this@WebModInfoActivity)
.load(ServerConfiguration.getRealLink(data))
.apply(GlobalMethod.getRequestOptions())
.into(holder.imageView)
}
}
}
viewBinding.banner.setAdapter(adapter)
viewBinding.banner.addBannerLifecycleObserver(this@WebModInfoActivity)
viewBinding.banner.indicator = CircleIndicator(this@WebModInfoActivity)
viewBinding.banner.setIndicatorSelectedColorRes(R.color.blue_500)
viewBinding.banner.isAutoLoop(false)
} else {
viewBinding.banner.isVisible = false
} }
val tags = t.data.tags 2 -> {
val lineParser = LineParser(tags) getString(R.string.discussion)
val tagList = ArrayList<String>()
lineParser.symbol = ","
lineParser.analyse { lineNum, lineData, isEnd ->
val tag = lineData.subSequence(1, lineData.length - 1).toString()
tagList.add(tag)
true
} }
if (tagList.size > 0) { else -> {
viewBinding.belongStackLabelView.labels = tagList getString(R.string.title)
viewBinding.belongStackLabelView.setOnLabelClickListener { index, v, s ->
val bundle = Bundle()
bundle.putString("tag", s)
bundle.putString(
"title",
String.format(getString(R.string.tag_title), s)
)
bundle.putString("action", "tag")
val thisIntent =
Intent(this@WebModInfoActivity, TagActivity::class.java)
thisIntent.putExtra("data", bundle)
startActivity(thisIntent)
}
} else {
viewBinding.belongStackLabelView.isVisible = false
} }
viewBinding.titleView.text = t.data.name
TextStyleMaker.instance.load(
viewBinding.modInfoView,
t.data.describe
) { type, data ->
TextStyleMaker.instance.clickEvent(this@WebModInfoActivity, type, data)
}
viewBinding.numView.text =
String.format(
getString(R.string.unit_and_downloadnum),
t.data.unitNumber,
t.data.downloadNumber,
t.data.versionName
)
viewBinding.updateTimeView.text =
String.format(getString(R.string.recent_update), t.data.updateTime)
viewBinding.button.isVisible = true
if (t.data.hidden == 0) {
viewBinding.auditLayout.isVisible = false
}
loadDeveloperInfo(t.data.developer)
viewBinding.button.setOnClickListener {
val type = viewBinding.button.text
val installation = getString(R.string.installation)
when (type) {
installation -> {
downloadAction(t)
}
}
}
} else {
viewBinding.tipView.isVisible = true
viewBinding.tipView.text = t.message
viewBinding.progressBar.isVisible = false
} }
} }.attach()
// viewBinding.button.setOnClickListener {
override fun onFailure(e: Exception) { // val type = viewBinding.button.text
viewBinding.progressBar.isVisible = false // val installation = getString(R.string.installation)
viewBinding.tipView.isVisible = true // when (type) {
viewBinding.tipView.setText(R.string.network_error) // installation -> {
} // downloadAction(t)
// }
}) // }
//
// }
// viewBinding.modCommentRecyclerView.layoutManager =
// LinearLayoutManager(this@WebModInfoActivity)
// viewBinding.modCommentRecyclerView.addItemDecoration(
// DividerItemDecoration(this@WebModInfoActivity, DividerItemDecoration.VERTICAL)
// )
tip = getString(R.string.file_download_progress)
}
} }
// private fun initData() {
//
// if (token.isBlank()) {
// viewBinding.progressBar.isVisible = false
// viewBinding.tipView.isVisible = true
// viewBinding.tipView.setText(R.string.please_login_first)
// return
// }
//
// loadModCommentList(modId)
//
//
// WebMod.instance.getInfo(token, modId, object : ApiCallBack<WebModInfoData> {
// override fun onResponse(t: WebModInfoData) {
// if (t.code == ServerConfiguration.Success_Code) {
// developer = t.data.developer
// isOpen = t.data.hidden == 0
// viewBinding.loadLayout.isVisible = false
// viewBinding.relativeLayout.isVisible = true
// val icon = t.data.icon
// if (icon != null && icon.isNotBlank()) {
// Glide.with(this@WebModInfoActivity)
// .load(ServerConfiguration.getRealLink(icon))
// .apply(GlobalMethod.getRequestOptions())
// .into(viewBinding.iconView)
// }
// title = t.data.name
// val screenshotListData = t.data.screenshots
// if (screenshotListData != null && screenshotListData.isNotBlank()) {
// val list = ArrayList<String>()
// val lineParser = LineParser()
// lineParser.symbol = ","
// lineParser.text = screenshotListData
// lineParser.analyse { lineNum, lineData, isEnd ->
// list.add(lineData)
// true
// }
// val adapter = object : BannerImageAdapter<String>(list) {
// override fun onBindView(
// holder: BannerImageHolder?,
// data: String?,
// position: Int,
// size: Int
// ) {
// if (data != null && holder != null) {
// Glide.with(this@WebModInfoActivity)
// .load(ServerConfiguration.getRealLink(data))
// .apply(GlobalMethod.getRequestOptions())
// .into(holder.imageView)
// }
// }
// }
// viewBinding.banner.setAdapter(adapter)
// viewBinding.banner.addBannerLifecycleObserver(this@WebModInfoActivity)
// viewBinding.banner.indicator = CircleIndicator(this@WebModInfoActivity)
// viewBinding.banner.setIndicatorSelectedColorRes(R.color.blue_500)
// viewBinding.banner.isAutoLoop(false)
// } else {
// viewBinding.banner.isVisible = false
// }
// val tags = t.data.tags
// val lineParser = LineParser(tags)
// val tagList = ArrayList<String>()
// lineParser.symbol = ","
// lineParser.analyse { lineNum, lineData, isEnd ->
// val tag = lineData.subSequence(1, lineData.length - 1).toString()
// tagList.add(tag)
// true
// }
// if (tagList.size > 0) {
// viewBinding.belongStackLabelView.labels = tagList
// viewBinding.belongStackLabelView.setOnLabelClickListener { index, v, s ->
// val bundle = Bundle()
// bundle.putString("tag", s)
// bundle.putString(
// "title",
// String.format(getString(R.string.tag_title), s)
// )
// bundle.putString("action", "tag")
// val thisIntent =
// Intent(this@WebModInfoActivity, TagActivity::class.java)
// thisIntent.putExtra("data", bundle)
// startActivity(thisIntent)
// }
// } else {
// viewBinding.belongStackLabelView.isVisible = false
// }
// viewBinding.titleView.text = t.data.name
// TextStyleMaker.instance.load(
// viewBinding.modInfoView,
// t.data.describe
// ) { type, data ->
// TextStyleMaker.instance.clickEvent(this@WebModInfoActivity, type, data)
// }
// viewBinding.numView.text =
// String.format(
// getString(R.string.unit_and_downloadnum),
// t.data.unitNumber,
// t.data.downloadNumber,
// t.data.versionName
// )
// viewBinding.updateTimeView.text =
// String.format(getString(R.string.recent_update), t.data.updateTime)
// viewBinding.button.isVisible = true
// if (t.data.hidden == 0) {
// viewBinding.auditLayout.isVisible = false
// }
// loadDeveloperInfo(t.data.developer)
//
// viewBinding.button.setOnClickListener {
// val type = viewBinding.button.text
// val installation = getString(R.string.installation)
// when (type) {
// installation -> {
// downloadAction(t)
// }
// }
//
// }
// } else {
// viewBinding.tipView.isVisible = true
// viewBinding.tipView.text = t.message
// viewBinding.progressBar.isVisible = false
// }
// }
//
// override fun onFailure(e: Exception) {
// viewBinding.progressBar.isVisible = false
// viewBinding.tipView.isVisible = true
// viewBinding.tipView.setText(R.string.network_error)
// }
//
// })
//
// }
/** /**
* 下载事件 * 下载事件
* @param t WebModInfoData * @param t WebModInfoData
@ -291,12 +318,12 @@ class WebModInfoActivity : BaseActivity<ActivityWebModInfoBinding>() {
override fun onOptionsItemSelected(item: MenuItem): Boolean { override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) { when (item.itemId) {
R.id.report_item -> { R.id.report_item -> {
if (isOpen) { if (adapter.isOpen()) {
val thisIntent = Intent(this, ReportActivity::class.java) val thisIntent = Intent(this, ReportActivity::class.java)
val bundle = Bundle() val bundle = Bundle()
bundle.putString("target", modId) bundle.putString("target", modId)
bundle.putString("type", "mod") bundle.putString("type", "mod")
bundle.putString("name", viewBinding.titleView.text.toString()) bundle.putString("name", title.toString())
thisIntent.putExtra("data", bundle) thisIntent.putExtra("data", bundle)
startActivity(thisIntent) startActivity(thisIntent)
} else { } else {
@ -315,10 +342,10 @@ class WebModInfoActivity : BaseActivity<ActivityWebModInfoBinding>() {
return super.onOptionsItemSelected(item) return super.onOptionsItemSelected(item)
} }
override fun onResume() { // override fun onResume() {
super.onResume() // super.onResume()
loadModCommentList(modId) // loadModCommentList(modId)
} // }
/** /**
@ -378,79 +405,79 @@ class WebModInfoActivity : BaseActivity<ActivityWebModInfoBinding>() {
} }
} }
/** // /**
* 加载评论列表 // * 加载评论列表
* @param modId String // * @param modId String
*/ // */
fun loadModCommentList(modId: String) { // fun loadModCommentList(modId: String) {
viewBinding.commentLinearProgressIndicator.isVisible = true // viewBinding.commentLinearProgressIndicator.isVisible = true
WebMod.instance.getCommentsList(modId, object : ApiCallBack<WebModCommentData> { // WebMod.instance.getCommentsList(modId, object : ApiCallBack<WebModCommentData> {
override fun onResponse(t: WebModCommentData) { // override fun onResponse(t: WebModCommentData) {
viewBinding.commentLinearProgressIndicator.isVisible = false // viewBinding.commentLinearProgressIndicator.isVisible = false
val data = t.data // val data = t.data
if (data == null) { // if (data == null) {
viewBinding.modCommentRecyclerView.isVisible = false // viewBinding.modCommentRecyclerView.isVisible = false
} else { // } else {
val adapter = CommentAdapter(this@WebModInfoActivity, data) // val adapter = CommentAdapter(this@WebModInfoActivity, data)
viewBinding.discussion.text = // viewBinding.discussion.text =
String.format(getString(R.string.discussion_num), data.size) // String.format(getString(R.string.discussion_num), data.size)
adapter.setItemEvent { i, itemCommentBinding, viewHolder, data -> // adapter.setItemEvent { i, itemCommentBinding, viewHolder, data ->
itemCommentBinding.iconView.setOnClickListener { // itemCommentBinding.iconView.setOnClickListener {
gotoUserPage(data.account) // gotoUserPage(data.account)
} // }
} // }
viewBinding.modCommentRecyclerView.isVisible = true // viewBinding.modCommentRecyclerView.isVisible = true
viewBinding.modCommentRecyclerView.adapter = adapter // viewBinding.modCommentRecyclerView.adapter = adapter
}
}
override fun onFailure(e: Exception) {
viewBinding.commentLinearProgressIndicator.isVisible = false
viewBinding.modCommentRecyclerView.isVisible = false
}
})
}
fun loadDeveloperInfo(userId: String) {
User.getSpaceInfo(userId, object : ApiCallBack<SpaceInfoData> {
override fun onResponse(t: SpaceInfoData) {
if (t.code == ServerConfiguration.Success_Code) {
val icon = t.data.headIcon
if (icon != null) {
Glide.with(this@WebModInfoActivity)
.load(ServerConfiguration.getRealLink(icon))
.apply(GlobalMethod.getRequestOptions(true))
.into(viewBinding.headIconView)
}
viewBinding.userNameView.text = t.data.userName
val info = String.format(
getString(R.string.fans_information),
ServerConfiguration.numberToString(t.data.fans),
ServerConfiguration.numberToString(t.data.follower),
ServerConfiguration.numberToString(t.data.praise)
)
viewBinding.userInfoView.text = info
viewBinding.cardView.postDelayed({
viewBinding.cardView.isVisible = true
viewBinding.openUserSpace.setOnClickListener {
gotoUserPage(t.data.account)
}
}, 300)
}
// else {
// viewBinding.cardView.isVisible = false
// } // }
// }
} //
// override fun onFailure(e: Exception) {
override fun onFailure(e: Exception) { // viewBinding.commentLinearProgressIndicator.isVisible = false
// viewBinding.cardView.isVisible = false // viewBinding.modCommentRecyclerView.isVisible = false
} // }
//
}) // })
} // }
//
// fun loadDeveloperInfo(userId: String) {
// User.getSpaceInfo(userId, object : ApiCallBack<SpaceInfoData> {
// override fun onResponse(t: SpaceInfoData) {
// if (t.code == ServerConfiguration.Success_Code) {
// val icon = t.data.headIcon
// if (icon != null) {
// Glide.with(this@WebModInfoActivity)
// .load(ServerConfiguration.getRealLink(icon))
// .apply(GlobalMethod.getRequestOptions(true))
// .into(viewBinding.headIconView)
// }
// viewBinding.userNameView.text = t.data.userName
// val info = String.format(
// getString(R.string.fans_information),
// ServerConfiguration.numberToString(t.data.fans),
// ServerConfiguration.numberToString(t.data.follower),
// ServerConfiguration.numberToString(t.data.praise)
// )
// viewBinding.userInfoView.text = info
//
// viewBinding.cardView.postDelayed({
// viewBinding.cardView.isVisible = true
// viewBinding.openUserSpace.setOnClickListener {
// gotoUserPage(t.data.account)
// }
// }, 300)
// }
//// else {
//// viewBinding.cardView.isVisible = false
//// }
//
// }
//
// override fun onFailure(e: Exception) {
//// viewBinding.cardView.isVisible = false
// }
//
// })
// }
/** /**
@ -468,46 +495,46 @@ class WebModInfoActivity : BaseActivity<ActivityWebModInfoBinding>() {
) )
} }
private fun initAction() { // private fun initAction() {
viewBinding.sendDiscussion.setOnClickListener { // viewBinding.sendDiscussion.setOnClickListener {
val account = AppSettings.getValue(AppSettings.Setting.Account, "") // val account = AppSettings.getValue(AppSettings.Setting.Account, "")
if (account.isBlank()) { // if (account.isBlank()) {
showError(getString(R.string.please_login_first)) // showError(getString(R.string.please_login_first))
return@setOnClickListener // return@setOnClickListener
} // }
//
//
CommentDialog(this).setCancelable(false) // CommentDialog(this).setCancelable(false)
.setSubmitFun { button, textInputLayout, s, alertDialog -> // .setSubmitFun { button, textInputLayout, s, alertDialog ->
button.isEnabled = false // button.isEnabled = false
WebMod.instance.sendComment( // WebMod.instance.sendComment(
AppSettings.getValue(AppSettings.Setting.Token, ""), // AppSettings.getValue(AppSettings.Setting.Token, ""),
modId, // modId,
s, // s,
object : ApiCallBack<ApiResponse> { // object : ApiCallBack<ApiResponse> {
override fun onResponse(t: ApiResponse) { // override fun onResponse(t: ApiResponse) {
if (t.code == ServerConfiguration.Success_Code) { // if (t.code == ServerConfiguration.Success_Code) {
alertDialog.dismiss() // alertDialog.dismiss()
loadModCommentList(modId) // loadModCommentList(modId)
Snackbar.make( // Snackbar.make(
viewBinding.button, // viewBinding.button,
R.string.release_ok, // R.string.release_ok,
Snackbar.LENGTH_SHORT // Snackbar.LENGTH_SHORT
).show() // ).show()
} else { // } else {
textInputLayout.error = t.message // textInputLayout.error = t.message
} // }
} // }
//
override fun onFailure(e: Exception) { // override fun onFailure(e: Exception) {
textInputLayout.error = e.toString() // textInputLayout.error = e.toString()
} // }
//
}) // })
}.show() // }.show()
} // }
//
} // }
override fun getViewBindingObject(layoutInflater: LayoutInflater): ActivityWebModInfoBinding { override fun getViewBindingObject(layoutInflater: LayoutInflater): ActivityWebModInfoBinding {
return ActivityWebModInfoBinding.inflate(layoutInflater) return ActivityWebModInfoBinding.inflate(layoutInflater)
@ -516,8 +543,8 @@ class WebModInfoActivity : BaseActivity<ActivityWebModInfoBinding>() {
override fun whenCreateActivity(savedInstanceState: Bundle?, canUseView: Boolean) { override fun whenCreateActivity(savedInstanceState: Bundle?, canUseView: Boolean) {
if (canUseView) { if (canUseView) {
initView() initView()
initData() // initData()
initAction() // initAction()
} }
} }
} }

View File

@ -42,7 +42,11 @@ class CommentAdapter(context: Context, dataList: MutableList<WebModCommentData.D
.into(viewBinding.iconView) .into(viewBinding.iconView)
} }
viewBinding.nameView.text = data.userName viewBinding.nameView.text = data.userName
viewBinding.timeView.text = data.time viewBinding.timeView.text = if (data.location == null) {
data.time
} else {
data.time + " " + data.location
}
TextStyleMaker.instance.load(viewBinding.contentView, data.content) { type, data -> TextStyleMaker.instance.load(viewBinding.contentView, data.content) { type, data ->
TextStyleMaker.instance.clickEvent(context, type, data) TextStyleMaker.instance.clickEvent(context, type, data)
} }

View File

@ -29,7 +29,7 @@ import org.w3c.dom.Text
* @author Cold Mint * @author Cold Mint
* @date 2021/12/28 18:29 * @date 2021/12/28 18:29
*/ */
class DynamicAdapter( context: Context, dataList: MutableList<DynamicItemDataBean.Data>) : class DynamicAdapter(context: Context, dataList: MutableList<DynamicItemDataBean.Data>) :
BaseAdapter<ItemDynamicBinding, DynamicItemDataBean.Data>(context, dataList) { BaseAdapter<ItemDynamicBinding, DynamicItemDataBean.Data>(context, dataList) {
@ -53,7 +53,11 @@ class DynamicAdapter( context: Context, dataList: MutableList<DynamicItemDataBea
.apply(GlobalMethod.getRequestOptions(true)) .apply(GlobalMethod.getRequestOptions(true))
.into(viewBinding.headIconView) .into(viewBinding.headIconView)
} }
viewBinding.timeView.text = data.time viewBinding.timeView.text = if (data.location == null) {
data.time
} else {
data.time + " " + data.location
}
viewBinding.nameView.text = data.userName viewBinding.nameView.text = data.userName
TextStyleMaker.instance.load(viewBinding.textview, data.content) { type, data -> TextStyleMaker.instance.load(viewBinding.textview, data.content) { type, data ->
TextStyleMaker.instance.clickEvent(context, type, data) TextStyleMaker.instance.clickEvent(context, type, data)
@ -69,8 +73,7 @@ class DynamicAdapter( context: Context, dataList: MutableList<DynamicItemDataBea
GlobalMethod.copyText(context, data.content, view) GlobalMethod.copyText(context, data.content, view)
} }
context.getString(R.string.delete_title) -> { context.getString(R.string.delete_title) -> {
val account = AppSettings. val account = AppSettings.getValue(AppSettings.Setting.Account, "")
getValue(AppSettings.Setting.Account, "")
val appId = val appId =
AppSettings AppSettings
.getValue(AppSettings.Setting.AppID, "") .getValue(AppSettings.Setting.AppID, "")

View File

@ -0,0 +1,59 @@
package com.coldmint.rust.pro.adapters
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import androidx.viewpager2.adapter.FragmentStateAdapter
import com.coldmint.rust.core.tool.DebugHelper
import com.coldmint.rust.pro.fragments.InsertCoinsFragment
import com.coldmint.rust.pro.fragments.ModCommentsFragment
import com.coldmint.rust.pro.fragments.NullFragment
import com.coldmint.rust.pro.fragments.WebModDetailsFragment
/**
* 模组详情页面适配器
* @constructor
*/
class ModPageDetailsAdapter(fragmentActivity: FragmentActivity, val modId: String) :
FragmentStateAdapter(fragmentActivity) {
private lateinit var webModDetailsFragment: WebModDetailsFragment
private lateinit var modCommentsFragment: ModCommentsFragment
override fun getItemCount(): Int {
return 3
}
/**
* 获取此模组是否对外开放
* @return Boolean
*/
fun isOpen(): Boolean {
return if (this::webModDetailsFragment.isInitialized) {
webModDetailsFragment.isOpen()
} else {
DebugHelper.printLog("获取模组公开状态", "详情碎片未初始化返回false", isError = true)
false
}
}
override fun createFragment(position: Int): Fragment {
return when (position) {
0 -> {
if (!this::webModDetailsFragment.isInitialized) {
webModDetailsFragment = WebModDetailsFragment(modId)
}
webModDetailsFragment
}
1 -> {
InsertCoinsFragment(modId)
}
2 -> {
if (!this::modCommentsFragment.isInitialized) {
modCommentsFragment = ModCommentsFragment(modId)
}
modCommentsFragment
}
else -> {
NullFragment()
}
}
}
}

View File

@ -0,0 +1,35 @@
package com.coldmint.rust.pro.adapters
import android.content.Context
import android.view.LayoutInflater
import android.view.ViewGroup
import com.bumptech.glide.Glide
import com.coldmint.rust.pro.base.BaseAdapter
import com.coldmint.rust.pro.databean.UserGroupData
import com.coldmint.rust.pro.databinding.ItemTemplateBinding
import com.coldmint.rust.pro.databinding.ItemUserBinding
import com.coldmint.rust.pro.databinding.ItemUserGroupBinding
/**
* 用户群适配器
*/
class UserGroupAdapter(context: Context, dataList: MutableList<UserGroupData>) :
BaseAdapter<ItemUserGroupBinding, UserGroupData>(context, dataList) {
override fun getViewBindingObject(
layoutInflater: LayoutInflater,
parent: ViewGroup,
viewType: Int
): ItemUserGroupBinding {
return ItemUserGroupBinding.inflate(layoutInflater, parent, false)
}
override fun onBingView(
data: UserGroupData,
viewBinding: ItemUserGroupBinding,
viewHolder: ViewHolder<ItemUserGroupBinding>,
position: Int
) {
viewBinding.imageView.setImageResource(data.iconRes)
viewBinding.titleView.setText(data.titleRes)
}
}

View File

@ -0,0 +1,3 @@
package com.coldmint.rust.pro.databean
data class UserGroupData(val iconRes: Int, val titleRes: Int)

View File

@ -15,7 +15,7 @@ import com.coldmint.rust.pro.databinding.*
import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayout
import com.google.android.material.tabs.TabLayoutMediator import com.google.android.material.tabs.TabLayoutMediator
class CommunityFragment : BaseFragment<CommunityFragmentBinding>() { class CommunityFragment : BaseFragment<FragmentCommunityBinding>() {
// 当请求时,此适配器返回一个 // 当请求时,此适配器返回一个
// representing an object in the collection. // representing an object in the collection.
private val communityAdapter: CommunityAdapter by lazy { private val communityAdapter: CommunityAdapter by lazy {
@ -51,8 +51,8 @@ class CommunityFragment : BaseFragment<CommunityFragmentBinding>() {
} }
override fun getViewBindingObject(layoutInflater: LayoutInflater): CommunityFragmentBinding { override fun getViewBindingObject(layoutInflater: LayoutInflater): FragmentCommunityBinding {
return CommunityFragmentBinding.inflate(layoutInflater) return FragmentCommunityBinding.inflate(layoutInflater)
} }
override fun whenViewCreated(inflater: LayoutInflater, savedInstanceState: Bundle?) { override fun whenViewCreated(inflater: LayoutInflater, savedInstanceState: Bundle?) {

View File

@ -24,14 +24,14 @@ import com.coldmint.rust.pro.R
import com.coldmint.rust.pro.tool.AppSettings import com.coldmint.rust.pro.tool.AppSettings
import com.coldmint.rust.pro.adapters.DataSetAdapter import com.coldmint.rust.pro.adapters.DataSetAdapter
import com.coldmint.rust.pro.base.BaseFragment import com.coldmint.rust.pro.base.BaseFragment
import com.coldmint.rust.pro.databinding.DatabaseFragmentBinding import com.coldmint.rust.pro.databinding.FragmentDatabaseBinding
import com.coldmint.rust.pro.databinding.DialogDatasetBinding import com.coldmint.rust.pro.databinding.DialogDatasetBinding
import com.google.gson.Gson import com.google.gson.Gson
import java.io.File import java.io.File
import java.util.concurrent.Executors import java.util.concurrent.Executors
import kotlin.collections.ArrayList import kotlin.collections.ArrayList
class DatabaseFragment : BaseFragment<DatabaseFragmentBinding>() { class DatabaseFragment : BaseFragment<FragmentDatabaseBinding>() {
override fun whenViewCreated(inflater: LayoutInflater, savedInstanceState: Bundle?) { override fun whenViewCreated(inflater: LayoutInflater, savedInstanceState: Bundle?) {
@ -165,7 +165,7 @@ class DatabaseFragment : BaseFragment<DatabaseFragmentBinding>() {
} }
override fun getViewBindingObject(layoutInflater: LayoutInflater): DatabaseFragmentBinding { override fun getViewBindingObject(layoutInflater: LayoutInflater): FragmentDatabaseBinding {
return DatabaseFragmentBinding.inflate(layoutInflater) return FragmentDatabaseBinding.inflate(layoutInflater)
} }
} }

View File

@ -0,0 +1,24 @@
package com.coldmint.rust.pro.fragments
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import com.coldmint.rust.pro.base.BaseFragment
import com.coldmint.rust.pro.databinding.FragmentInsertCoinsBinding
/**
* 投币碎片
*/
class InsertCoinsFragment(val modId: String) : BaseFragment<FragmentInsertCoinsBinding>() {
override fun whenViewCreated(inflater: LayoutInflater, savedInstanceState: Bundle?) {
}
override fun getViewBindingObject(layoutInflater: LayoutInflater): FragmentInsertCoinsBinding {
return FragmentInsertCoinsBinding.inflate(layoutInflater)
}
}

View File

@ -11,7 +11,7 @@ import com.coldmint.rust.pro.tool.AppSettings
import com.coldmint.rust.core.LocalTemplatePackage import com.coldmint.rust.core.LocalTemplatePackage
import com.coldmint.rust.pro.adapters.TemplateListAdapter import com.coldmint.rust.pro.adapters.TemplateListAdapter
import com.coldmint.rust.pro.base.BaseFragment import com.coldmint.rust.pro.base.BaseFragment
import com.coldmint.rust.pro.databinding.TemplateFragemntBinding import com.coldmint.rust.pro.databinding.FragmentLocalTemplateBinding
import java.io.File import java.io.File
import java.util.* import java.util.*
import kotlin.collections.ArrayList import kotlin.collections.ArrayList
@ -20,7 +20,7 @@ import kotlin.collections.ArrayList
* 本地模板碎片 * 本地模板碎片
* @property first Boolean * @property first Boolean
*/ */
class LocalTemplateFragment : BaseFragment<TemplateFragemntBinding>() { class LocalTemplateFragment : BaseFragment<FragmentLocalTemplateBinding>() {
private var first = true private var first = true
override fun onResume() { override fun onResume() {
@ -65,8 +65,8 @@ class LocalTemplateFragment : BaseFragment<TemplateFragemntBinding>() {
} }
} }
override fun getViewBindingObject(layoutInflater: LayoutInflater): TemplateFragemntBinding { override fun getViewBindingObject(layoutInflater: LayoutInflater): FragmentLocalTemplateBinding {
return TemplateFragemntBinding.inflate(layoutInflater) return FragmentLocalTemplateBinding.inflate(layoutInflater)
} }
override fun whenViewCreated(inflater: LayoutInflater, savedInstanceState: Bundle?) { override fun whenViewCreated(inflater: LayoutInflater, savedInstanceState: Bundle?) {

View File

@ -0,0 +1,135 @@
package com.coldmint.rust.pro.fragments
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.core.view.isVisible
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import com.coldmint.rust.core.ModClass
import com.coldmint.rust.core.dataBean.ApiResponse
import com.coldmint.rust.core.dataBean.mod.WebModCommentData
import com.coldmint.rust.core.interfaces.ApiCallBack
import com.coldmint.rust.core.tool.DebugHelper
import com.coldmint.rust.core.web.ServerConfiguration
import com.coldmint.rust.core.web.WebMod
import com.coldmint.rust.pro.R
import com.coldmint.rust.pro.adapters.CommentAdapter
import com.coldmint.rust.pro.base.BaseFragment
import com.coldmint.rust.pro.databinding.FragmentModCommentsBinding
import com.coldmint.rust.pro.dialog.CommentDialog
import com.coldmint.rust.pro.tool.AppSettings
import com.google.android.material.snackbar.Snackbar
/**
* 模组评论适配器
*/
class ModCommentsFragment(val modId: String) : BaseFragment<FragmentModCommentsBinding>() {
override fun whenViewCreated(inflater: LayoutInflater, savedInstanceState: Bundle?) {
viewBinding.recyclerView.layoutManager = LinearLayoutManager(requireContext())
viewBinding.recyclerView.addItemDecoration(
DividerItemDecoration(
requireContext(),
DividerItemDecoration.VERTICAL
)
)
viewBinding.swipeRefreshLayout.setOnRefreshListener {
loadCommentList(modId, false)
viewBinding.swipeRefreshLayout.isRefreshing = false
}
viewBinding.sendDiscussion.setOnClickListener {
val account = AppSettings.getValue(AppSettings.Setting.Account, "")
if (account.isBlank()) {
Toast.makeText(requireContext(), R.string.please_login_first, Toast.LENGTH_SHORT)
.show()
return@setOnClickListener
}
CommentDialog(requireContext()).setCancelable(false)
.setSubmitFun { button, textInputLayout, s, alertDialog ->
button.isEnabled = false
WebMod.instance.sendComment(
AppSettings.getValue(AppSettings.Setting.Token, ""),
modId,
s,
object : ApiCallBack<ApiResponse> {
override fun onResponse(t: ApiResponse) {
if (t.code == ServerConfiguration.Success_Code) {
alertDialog.dismiss()
loadCommentList(modId)
Snackbar.make(
viewBinding.sendDiscussion,
R.string.release_ok,
Snackbar.LENGTH_SHORT
).show()
} else {
textInputLayout.error = t.message
}
}
override fun onFailure(e: Exception) {
textInputLayout.error = e.toString()
}
})
}.show()
}
}
override fun onResume() {
super.onResume()
loadCommentList(modId)
}
/**
* 加载评论列表
* @param modId String
*/
fun loadCommentList(modId: String, useLinearProgressIndicator: Boolean = true) {
val key = "加载评论列表"
if (useLinearProgressIndicator) {
viewBinding.linearProgressIndicator.isVisible = true
}
WebMod.instance.getCommentsList(modId, object : ApiCallBack<WebModCommentData> {
override fun onResponse(t: WebModCommentData) {
val list = t.data
if (list.isNullOrEmpty()) {
DebugHelper.printLog(key, "为空", isError = true)
if (useLinearProgressIndicator) {
viewBinding.linearProgressIndicator.isVisible = false
}
viewBinding.recyclerView.isVisible = false
viewBinding.noContentLayout.isVisible = true
} else {
DebugHelper.printLog(key, "${list.size}条数据")
if (useLinearProgressIndicator) {
viewBinding.linearProgressIndicator.isVisible = false
}
viewBinding.recyclerView.isVisible = true
viewBinding.noContentLayout.isVisible = false
viewBinding.recyclerView.adapter = CommentAdapter(requireContext(), list)
}
}
override fun onFailure(e: Exception) {
DebugHelper.printLog(key, "加载失败", isError = true)
if (useLinearProgressIndicator) {
viewBinding.linearProgressIndicator.isVisible = false
}
viewBinding.recyclerView.isVisible = false
viewBinding.noContentLayout.isVisible = true
}
})
}
override fun getViewBindingObject(layoutInflater: LayoutInflater): FragmentModCommentsBinding {
return FragmentModCommentsBinding.inflate(layoutInflater)
}
}

View File

@ -2,23 +2,21 @@ package com.coldmint.rust.pro.fragments
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.res.ColorStateList import android.content.res.ColorStateList
import android.os.Build import android.os.*
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.view.LayoutInflater import android.view.LayoutInflater
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import com.coldmint.rust.core.ModClass import com.coldmint.rust.core.ModClass
import com.coldmint.rust.core.dataBean.ModConfigurationData import com.coldmint.rust.core.dataBean.ModConfigurationData
import com.coldmint.rust.core.tool.DebugHelper
import com.coldmint.rust.core.tool.FileOperator import com.coldmint.rust.core.tool.FileOperator
import com.coldmint.rust.pro.R import com.coldmint.rust.pro.R
import com.coldmint.rust.pro.adapters.ModActionAdapter import com.coldmint.rust.pro.adapters.ModActionAdapter
import com.coldmint.rust.pro.adapters.ModAdapter import com.coldmint.rust.pro.adapters.ModAdapter
import com.coldmint.rust.pro.base.BaseFragment import com.coldmint.rust.pro.base.BaseFragment
import com.coldmint.rust.pro.databinding.ModDialogBinding import com.coldmint.rust.pro.databinding.ModDialogBinding
import com.coldmint.rust.pro.databinding.ModFragmentBinding import com.coldmint.rust.pro.databinding.FragmentModBinding
import com.coldmint.rust.pro.databinding.ModListItemBinding import com.coldmint.rust.pro.databinding.ModListItemBinding
import com.coldmint.rust.pro.tool.AppSettings import com.coldmint.rust.pro.tool.AppSettings
import com.coldmint.rust.pro.tool.GlobalMethod import com.coldmint.rust.pro.tool.GlobalMethod
@ -27,11 +25,12 @@ import com.google.android.material.bottomsheet.BottomSheetDialog
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
import kotlinx.coroutines.isActive
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import me.zhanghai.android.fastscroll.FastScrollerBuilder import me.zhanghai.android.fastscroll.FastScrollerBuilder
import java.io.File import java.io.File
class ModFragment : BaseFragment<ModFragmentBinding>() { class ModFragment : BaseFragment<FragmentModBinding>() {
val viewModel: ModViewModel by lazy { val viewModel: ModViewModel by lazy {
ModViewModel() ModViewModel()
} }
@ -193,27 +192,31 @@ class ModFragment : BaseFragment<ModFragmentBinding>() {
viewBinding.progressBar.isVisible = false viewBinding.progressBar.isVisible = false
viewBinding.modErrorIcon.isVisible = false viewBinding.modErrorIcon.isVisible = false
viewBinding.modError.isVisible = false viewBinding.modError.isVisible = false
modAdapter = ModAdapter(requireContext(), dataList) if (isAdded) {
FastScrollerBuilder(viewBinding.modList).useMd2Style() modAdapter = ModAdapter(requireContext(), dataList)
.setPopupTextProvider(modAdapter).build() FastScrollerBuilder(viewBinding.modList).useMd2Style()
modAdapter.setItemEvent { i, modListItemBinding, viewHolder, modClass -> .setPopupTextProvider(modAdapter).build()
modAdapter.setItemEvent { i, modListItemBinding, viewHolder, modClass ->
modListItemBinding.root.setOnClickListener { modListItemBinding.root.setOnClickListener {
onClickItemWork(modListItemBinding, modClass) onClickItemWork(modListItemBinding, modClass)
} }
modListItemBinding.root.setOnLongClickListener { modListItemBinding.root.setOnLongClickListener {
modAdapter.showDeleteItemDialog( modAdapter.showDeleteItemDialog(
modClass.modName, modClass.modName,
viewHolder.adapterPosition, viewHolder.adapterPosition,
onClickPositiveButton = { d, b -> onClickPositiveButton = { d, b ->
delFile(handler, modClass, viewHolder.adapterPosition) delFile(handler, modClass, viewHolder.adapterPosition)
false false
}) })
false false
}
} }
viewBinding.modList.adapter = modAdapter
} else {
DebugHelper.printLog("加载模组列表", "没有附加到活动", isError = true)
} }
viewBinding.modList.adapter = modAdapter
} }
} }
} }
@ -328,8 +331,8 @@ class ModFragment : BaseFragment<ModFragmentBinding>() {
// viewBinding.progressBar.isVisible = false // viewBinding.progressBar.isVisible = false
// } // }
override fun getViewBindingObject(layoutInflater: LayoutInflater): ModFragmentBinding { override fun getViewBindingObject(layoutInflater: LayoutInflater): FragmentModBinding {
return ModFragmentBinding.inflate(layoutInflater) return FragmentModBinding.inflate(layoutInflater)
} }
override fun whenViewCreated(inflater: LayoutInflater, savedInstanceState: Bundle?) { override fun whenViewCreated(inflater: LayoutInflater, savedInstanceState: Bundle?) {

View File

@ -20,7 +20,7 @@ import com.coldmint.rust.pro.R
import com.coldmint.rust.pro.WebModInfoActivity import com.coldmint.rust.pro.WebModInfoActivity
import com.coldmint.rust.pro.adapters.WebModAdapter import com.coldmint.rust.pro.adapters.WebModAdapter
import com.coldmint.rust.pro.base.BaseFragment import com.coldmint.rust.pro.base.BaseFragment
import com.coldmint.rust.pro.databinding.RecommendedFragmentBinding import com.coldmint.rust.pro.databinding.FragmentRecommendedBinding
import com.coldmint.rust.pro.tool.AppSettings import com.coldmint.rust.pro.tool.AppSettings
import com.coldmint.rust.pro.tool.GlobalMethod import com.coldmint.rust.pro.tool.GlobalMethod
import com.coldmint.rust.pro.tool.TextStyleMaker import com.coldmint.rust.pro.tool.TextStyleMaker
@ -29,8 +29,9 @@ import com.youth.banner.adapter.BannerImageAdapter
import com.youth.banner.holder.BannerImageHolder import com.youth.banner.holder.BannerImageHolder
import com.youth.banner.indicator.CircleIndicator import com.youth.banner.indicator.CircleIndicator
import com.youth.banner.transformer.AlphaPageTransformer import com.youth.banner.transformer.AlphaPageTransformer
import com.youth.banner.transformer.DepthPageTransformer
class RecommendedFragment : BaseFragment<RecommendedFragmentBinding>() { class RecommendedFragment : BaseFragment<FragmentRecommendedBinding>() {
/** /**
* 加载最近更新 * 加载最近更新
@ -177,8 +178,8 @@ class RecommendedFragment : BaseFragment<RecommendedFragmentBinding>() {
} }
} }
}) })
viewBinding.banner.setBannerGalleryEffect(16, 16, 8) // viewBinding.banner.setBannerGalleryEffect(16, 16, 8)
viewBinding.banner.addPageTransformer(AlphaPageTransformer()) // viewBinding.banner.addPageTransformer(DepthPageTransformer())
if (activity != null) { if (activity != null) {
viewBinding.banner.addBannerLifecycleObserver(activity) viewBinding.banner.addBannerLifecycleObserver(activity)
viewBinding.banner.indicator = CircleIndicator(activity) viewBinding.banner.indicator = CircleIndicator(activity)
@ -221,8 +222,8 @@ class RecommendedFragment : BaseFragment<RecommendedFragmentBinding>() {
loadBannerData() loadBannerData()
} }
override fun getViewBindingObject(layoutInflater: LayoutInflater): RecommendedFragmentBinding { override fun getViewBindingObject(layoutInflater: LayoutInflater): FragmentRecommendedBinding {
return RecommendedFragmentBinding.inflate(layoutInflater) return FragmentRecommendedBinding.inflate(layoutInflater)
} }
override fun whenViewCreated(inflater: LayoutInflater, savedInstanceState: Bundle?) { override fun whenViewCreated(inflater: LayoutInflater, savedInstanceState: Bundle?) {

View File

@ -0,0 +1,56 @@
package com.coldmint.rust.pro.fragments
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.LinearLayoutManager
import com.coldmint.rust.core.tool.AppOperator
import com.coldmint.rust.pro.R
import com.coldmint.rust.pro.adapters.UserGroupAdapter
import com.coldmint.rust.pro.databean.UserGroupData
import com.coldmint.rust.pro.databinding.FragmentUserGroupBinding
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
/**
* 用户群碎片
* @property viewBinding FragmentUserGroupBinding
*/
class UserGroupFragment : BottomSheetDialogFragment() {
private lateinit var viewBinding: FragmentUserGroupBinding
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
viewBinding = FragmentUserGroupBinding.inflate(inflater, container, false)
return viewBinding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
viewBinding.recyclerView.layoutManager = LinearLayoutManager(requireContext())
val dataList = ArrayList<UserGroupData>()
dataList.add(UserGroupData(R.drawable.ic_qq, R.string.qq_group))
dataList.add(UserGroupData(R.drawable.ic_discord, R.string.discord_group))
val adapter = UserGroupAdapter(requireContext(), dataList)
viewBinding.recyclerView.adapter = adapter
adapter.setItemEvent { i, itemUserGroupBinding, viewHolder, userGroupData ->
itemUserGroupBinding.root.setOnClickListener {
if (userGroupData.titleRes == R.string.qq_group) {
AppOperator.useBrowserAccessWebPage(
requireContext(),
"https://qun.qq.com/qqweb/qunpro/share?_wv=3&_wwv=128&appChannel=share&inviteCode=1W7Dpb0&businessType=9&from=246610&biz=ka"
)
} else if (userGroupData.titleRes == R.string.discord_group) {
AppOperator.useBrowserAccessWebPage(
requireContext(),
"https://discord.gg/DTQDmVdVK3"
)
}
}
}
}
}

View File

@ -124,7 +124,12 @@ class UserInfoFragment : BaseFragment<FragmentUserInfoBinding>() {
.apply(GlobalMethod.getRequestOptions(true)) .apply(GlobalMethod.getRequestOptions(true))
.into(viewBinding.headIconView) .into(viewBinding.headIconView)
} }
viewBinding.emailView.text = t.data.email viewBinding.coinView.text = String.format(
getString(
R.string.coin_number,
t.data.coinNumber
)
)
loadRecyclerView(t.data.permission) loadRecyclerView(t.data.permission)
} else { } else {
// Toast.makeText(requireContext(), t.toString(), Toast.LENGTH_SHORT).show() // Toast.makeText(requireContext(), t.toString(), Toast.LENGTH_SHORT).show()

View File

@ -11,7 +11,6 @@ import com.coldmint.rust.pro.R
import com.coldmint.rust.pro.adapters.WarehouseAdapter import com.coldmint.rust.pro.adapters.WarehouseAdapter
import com.coldmint.rust.pro.base.BaseAdapter import com.coldmint.rust.pro.base.BaseAdapter
import com.coldmint.rust.pro.base.BaseFragment import com.coldmint.rust.pro.base.BaseFragment
import com.coldmint.rust.pro.databinding.CommunityFragmentBinding
import com.coldmint.rust.pro.databinding.FragmentWarehouseBinding import com.coldmint.rust.pro.databinding.FragmentWarehouseBinding
import com.google.android.material.tabs.TabLayoutMediator import com.google.android.material.tabs.TabLayoutMediator

View File

@ -0,0 +1,232 @@
package com.coldmint.rust.pro.fragments
import android.content.Intent
import android.os.Bundle
import android.view.LayoutInflater
import androidx.core.view.isVisible
import com.bumptech.glide.Glide
import com.coldmint.rust.core.dataBean.mod.WebModInfoData
import com.coldmint.rust.core.dataBean.user.SpaceInfoData
import com.coldmint.rust.core.interfaces.ApiCallBack
import com.coldmint.rust.core.tool.LineParser
import com.coldmint.rust.core.web.ServerConfiguration
import com.coldmint.rust.core.web.User
import com.coldmint.rust.core.web.WebMod
import com.coldmint.rust.pro.R
import com.coldmint.rust.pro.TagActivity
import com.coldmint.rust.pro.UserHomePageActivity
import com.coldmint.rust.pro.base.BaseFragment
import com.coldmint.rust.pro.databinding.FragmentWebModDetailsBinding
import com.coldmint.rust.pro.tool.AppSettings
import com.coldmint.rust.pro.tool.GlobalMethod
import com.coldmint.rust.pro.tool.TextStyleMaker
import com.google.android.material.chip.Chip
import com.youth.banner.adapter.BannerImageAdapter
import com.youth.banner.holder.BannerImageHolder
import com.youth.banner.indicator.CircleIndicator
/**
* 模组详情碎片
*/
class WebModDetailsFragment(val modId: String) : BaseFragment<FragmentWebModDetailsBinding>() {
var developer: String? = null
//此模组是否对外开放
private var isOpen = false
/**
* 获取此模组是否对外开放
* @return Boolean
*/
fun isOpen(): Boolean {
return isOpen
}
override fun whenViewCreated(inflater: LayoutInflater, savedInstanceState: Bundle?) {
loadInfo()
}
override fun getViewBindingObject(layoutInflater: LayoutInflater): FragmentWebModDetailsBinding {
return FragmentWebModDetailsBinding.inflate(layoutInflater)
}
fun loadDeveloperInfo(userId: String) {
User.getSpaceInfo(userId, object : ApiCallBack<SpaceInfoData> {
override fun onResponse(t: SpaceInfoData) {
if (t.code == ServerConfiguration.Success_Code) {
val icon = t.data.headIcon
if (icon != null) {
Glide.with(requireContext())
.load(ServerConfiguration.getRealLink(icon))
.apply(GlobalMethod.getRequestOptions(true))
.into(viewBinding.headIconView)
}
viewBinding.userNameView.text = t.data.userName
val info = String.format(
getString(R.string.fans_information),
ServerConfiguration.numberToString(t.data.fans),
ServerConfiguration.numberToString(t.data.follower),
ServerConfiguration.numberToString(t.data.praise)
)
viewBinding.userInfoView.text = info
viewBinding.cardView.postDelayed({
viewBinding.cardView.isVisible = true
viewBinding.openUserSpace.setOnClickListener {
gotoUserPage(t.data.account)
}
}, 300)
} else {
viewBinding.cardView.isVisible = false
}
}
override fun onFailure(e: Exception) {
viewBinding.cardView.isVisible = false
}
})
}
/**
* 打开用户主页
* @param userId String
*/
fun gotoUserPage(userId: String) {
val intent = Intent(
requireContext(),
UserHomePageActivity::class.java
)
intent.putExtra("userId", userId)
startActivity(
intent
)
}
/**
* 加载页面信息
*/
fun loadInfo() {
val token = AppSettings.getValue(AppSettings.Setting.Token, "")
WebMod.instance.getInfo(token, modId, object : ApiCallBack<WebModInfoData> {
override fun onResponse(t: WebModInfoData) {
if (t.code == ServerConfiguration.Success_Code) {
developer = t.data.developer
isOpen = t.data.hidden == 0
viewBinding.loadLayout.isVisible = false
viewBinding.contentLayout.isVisible = true
val icon = t.data.icon
if (icon != null && icon.isNotBlank()) {
Glide.with(requireContext())
.load(ServerConfiguration.getRealLink(icon))
.apply(GlobalMethod.getRequestOptions())
.into(viewBinding.iconView)
}
val screenshotListData = t.data.screenshots
if (screenshotListData != null && screenshotListData.isNotBlank()) {
val list = ArrayList<String>()
val lineParser = LineParser()
lineParser.symbol = ","
lineParser.text = screenshotListData
lineParser.analyse { lineNum, lineData, isEnd ->
list.add(lineData)
true
}
val adapter = object : BannerImageAdapter<String>(list) {
override fun onBindView(
holder: BannerImageHolder?,
data: String?,
position: Int,
size: Int
) {
if (data != null && holder != null) {
Glide.with(requireContext())
.load(ServerConfiguration.getRealLink(data))
.apply(GlobalMethod.getRequestOptions())
.into(holder.imageView)
}
}
}
viewBinding.banner.setAdapter(adapter)
viewBinding.banner.addBannerLifecycleObserver(requireActivity())
viewBinding.banner.indicator = CircleIndicator(requireActivity())
viewBinding.banner.setIndicatorSelectedColorRes(R.color.blue_500)
viewBinding.banner.isAutoLoop(false)
} else {
viewBinding.banner.isVisible = false
}
val tags = t.data.tags
val lineParser = LineParser(tags)
val tagList = ArrayList<String>()
lineParser.symbol = ","
lineParser.analyse { lineNum, lineData, isEnd ->
val tag = lineData.subSequence(1, lineData.length - 1).toString()
tagList.add(tag)
true
}
if (tagList.size > 0) {
tagList.forEach {
val chip = Chip(requireContext())
chip.text = it
val s = it
chip.setOnClickListener {
val bundle = Bundle()
bundle.putString("tag", s)
bundle.putString(
"title",
String.format(getString(R.string.tag_title), s)
)
bundle.putString("action", "tag")
val thisIntent =
Intent(requireContext(), TagActivity::class.java)
thisIntent.putExtra("data", bundle)
startActivity(thisIntent)
}
viewBinding.chipGroup.addView(chip)
}
} else {
viewBinding.chipGroup.isVisible = false
}
viewBinding.titleView.text = t.data.name
TextStyleMaker.instance.load(
viewBinding.modInfoView,
t.data.describe
) { type, data ->
TextStyleMaker.instance.clickEvent(requireContext(), type, data)
}
viewBinding.numView.text =
String.format(
getString(R.string.unit_and_downloadnum),
t.data.unitNumber,
t.data.downloadNumber,
t.data.versionName
)
viewBinding.updateTimeView.text =
String.format(getString(R.string.recent_update), t.data.updateTime)
if (t.data.hidden == 0) {
viewBinding.hideTextView.isVisible = false
}
loadDeveloperInfo(t.data.developer)
} else {
viewBinding.contentLayout.isVisible = false
viewBinding.loadLayout.isVisible = true
viewBinding.tipView.isVisible = true
viewBinding.tipView.text = t.message
viewBinding.progressBar.isVisible = false
}
}
override fun onFailure(e: Exception) {
viewBinding.contentLayout.isVisible = false
viewBinding.loadLayout.isVisible = true
viewBinding.progressBar.isVisible = false
viewBinding.tipView.isVisible = true
viewBinding.tipView.setText(R.string.network_error)
}
})
}
}

View File

@ -35,6 +35,7 @@ import com.coldmint.rust.pro.*
import com.coldmint.rust.pro.base.BaseAndroidViewModel import com.coldmint.rust.pro.base.BaseAndroidViewModel
import com.coldmint.rust.pro.tool.AppSettings import com.coldmint.rust.pro.tool.AppSettings
import com.coldmint.rust.pro.tool.BookmarkManager import com.coldmint.rust.pro.tool.BookmarkManager
import com.coldmint.rust.pro.tool.CompletionItemConverter
import com.coldmint.rust.pro.tool.GlobalMethod import com.coldmint.rust.pro.tool.GlobalMethod
import com.google.android.material.color.DynamicColors import com.google.android.material.color.DynamicColors
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
@ -118,6 +119,8 @@ class StartViewModel(application: Application) : BaseAndroidViewModel(applicatio
initBookmark() initBookmark()
//验证用户信息 //验证用户信息
verifyingUserInfo() verifyingUserInfo()
CompletionItemConverter.init(getApplication())
} }

View File

@ -0,0 +1,17 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:width="200dp"
android:height="200dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:fillColor="?attr/colorPrimary"
android:pathData="M0,512a512,512 0,1 0,1024 0A512,512 0,1 0,0 512z" />
<path
android:fillColor="#FFFFFF"
android:pathData="M190.9,234.3h642.2v477.3H190.9z" />
<path
android:fillColor="?attr/colorPrimary"
android:pathData="M698.2,932.3L157.3,862.8c-58.4,-7.5 -55.4,-191.2 -50.3,-249.9l26,-297.2c5.1,-58.7 74.4,-120.2 132.7,-128.4l466.4,-65.1c58.3,-8.1 177.2,212.6 176.1,271.5l-8.7,445.1M512,300.4c-114.3,0 -194.6,49.1 -194.6,49.1 43.9,-39.3 120.7,-61.9 120.7,-61.9l-7.3,-7.3c-72.1,1.3 -137.4,51.2 -137.4,51.2 -73.4,153.2 -68.7,285.4 -68.7,285.4 59.7,77.2 148.5,71.7 148.5,71.7l30.3,-38.4c-53.3,-11.5 -87,-58.9 -87,-58.9S396.8,646 512,646c115.2,0 195.4,-54.6 195.4,-54.6s-33.7,47.4 -87,58.9l30.3,38.4s88.7,5.5 148.5,-71.7c0,0 4.7,-132.3 -68.7,-285.4 0,0 -65.3,-49.9 -137.4,-51.2l-7.3,7.3s76.8,22.6 120.7,61.9c0,0 -80.2,-49.1 -194.6,-49.1M423.7,462.1c27.7,0 50.3,24.3 49.9,54.2 0,29.4 -22.2,54.2 -49.9,54.2 -27.3,0 -49.5,-24.7 -49.5,-54.2 0,-29.9 21.8,-54.2 49.5,-54.2m177.9,0c27.7,0 49.9,24.3 49.9,54.2 0,29.4 -22.2,54.2 -49.9,54.2 -27.3,0 -49.5,-24.7 -49.5,-54.2 0,-29.9 21.8,-54.2 49.5,-54.2z"
tools:ignore="VectorPath" />
</vector>

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="M4,19h16v2L4,21zM20,3L4,3v10c0,2.21 1.79,4 4,4h6c2.21,0 4,-1.79 4,-4v-3h2c1.11,0 2,-0.9 2,-2L22,5c0,-1.11 -0.89,-2 -2,-2zM16,13c0,1.1 -0.9,2 -2,2L8,15c-1.1,0 -2,-0.9 -2,-2L6,5h10v8zM20,8h-2L18,5h2v3z"/>
</vector>

View File

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?attr/colorControlNormal"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@android:color/white"
android:pathData="M18,16.08c-0.76,0 -1.44,0.3 -1.96,0.77L8.91,12.7c0.05,-0.23 0.09,-0.46 0.09,-0.7s-0.04,-0.47 -0.09,-0.7l7.05,-4.11c0.54,0.5 1.25,0.81 2.04,0.81 1.66,0 3,-1.34 3,-3s-1.34,-3 -3,-3 -3,1.34 -3,3c0,0.24 0.04,0.47 0.09,0.7L8.04,9.81C7.5,9.31 6.79,9 6,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3c0.79,0 1.5,-0.31 2.04,-0.81l7.12,4.16c-0.05,0.21 -0.08,0.43 -0.08,0.65 0,1.61 1.31,2.92 2.92,2.92s2.92,-1.31 2.92,-2.92c0,-1.61 -1.31,-2.92 -2.92,-2.92zM18,4c0.55,0 1,0.45 1,1s-0.45,1 -1,1 -1,-0.45 -1,-1 0.45,-1 1,-1zM6,13c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1 1,0.45 1,1 -0.45,1 -1,1zM18,20.02c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1 1,0.45 1,1 -0.45,1 -1,1z" />
</vector>

View File

@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="200dp"
android:height="200dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:fillColor="?attr/colorPrimary"
android:pathData="M0,512a512,512 0,1 0,1024 0A512,512 0,1 0,0 512z" />
<path
android:fillColor="#FFFFFF"
android:pathData="M244.9,561.3c18.6,-44.2 44.5,-76.8 63.7,-83.8 -0.3,-25.6 4.5,-41.6 12.5,-54.4 0,-1 -1.9,-11.5 5.1,-24.6 4.8,-115.2 79.7,-206.4 201,-206.4s196.2,91.2 201,206.4c7,13.1 5.1,23.7 5.1,24.6 8,12.8 12.8,28.8 12.5,54.4 19.2,7 45.1,39.7 63.7,84.2 24,56.3 27.8,110.4 8.6,120 -13.1,6.4 -33.9,-9.6 -53.4,-37.8 -7.7,31.4 -26.9,60.2 -54.1,82.9 28.8,10.6 47.4,27.8 47.4,47.4 0,32 -50.6,57.9 -112.6,57.9 -56.3,0 -102.1,-21.1 -111.4,-48h-13.4c-9.3,26.9 -55,48 -111.4,48 -62.1,0 -112.6,-25.9 -112.6,-57.9 0,-19.5 18.6,-36.8 47.4,-47.4 -27.2,-22.7 -46.4,-51.5 -54.1,-82.9 -19.5,28.2 -40.3,44.2 -53.4,37.8 -19.2,-9.6 -15.4,-63.7 8.6,-120.3z" />
</vector>

View File

@ -83,30 +83,30 @@
android:layout_below="@id/checkbox" android:layout_below="@id/checkbox"
android:layout_marginTop="8dp"> android:layout_marginTop="8dp">
<TextView <Button
android:id="@+id/changePasswordView" android:id="@+id/changePasswordView"
style="@style/Widget.Material3.Button.TextButton"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/retrieve_password" android:text="@string/retrieve_password" />
android:textColor="?colorPrimary" />
<TextView <Button
android:visibility="gone"
android:id="@+id/changeServerView" android:id="@+id/changeServerView"
style="@style/Widget.Material3.Button.TextButton"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="8dp" android:layout_marginStart="8dp"
android:layout_toEndOf="@id/changePasswordView" android:layout_toEndOf="@id/changePasswordView"
android:text="@string/changing_the_server" android:text="@string/changing_the_server"
android:textColor="?colorPrimary" /> android:visibility="gone" />
<TextView <Button
android:id="@+id/registerView" android:id="@+id/registerView"
style="@style/Widget.Material3.Button.TextButton"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentEnd="true" android:layout_alignParentEnd="true"
android:text="@string/register" android:text="@string/register" />
android:textColor="?colorPrimary" />
</RelativeLayout> </RelativeLayout>
</RelativeLayout> </RelativeLayout>

View File

@ -48,8 +48,6 @@
android:name="androidx.navigation.fragment.NavHostFragment" android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="8dp"
app:defaultNavHost="true" app:defaultNavHost="true"
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior" /> app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior" />

View File

@ -267,6 +267,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="bottom|right" android:layout_gravity="bottom|right"
android:layout_margin="16dp" android:layout_margin="16dp"
android:text="@string/packmod"
app:icon="@drawable/zip" /> app:icon="@drawable/zip" />
</androidx.coordinatorlayout.widget.CoordinatorLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@ -6,7 +6,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:fitsSystemWindows="true" android:fitsSystemWindows="true"
tools:context=".ActivateActivity"> tools:context=".WebModInfoActivity">
<com.google.android.material.appbar.AppBarLayout <com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent" android:layout_width="match_parent"
@ -18,285 +18,38 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" /> android:layout_height="?attr/actionBarSize" />
<com.google.android.material.tabs.TabLayout
android:id="@+id/tabLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent">
<com.google.android.material.tabs.TabItem
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="详情" />
<com.google.android.material.tabs.TabItem
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="投币" />
<com.google.android.material.tabs.TabItem
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="评论" />
</com.google.android.material.tabs.TabLayout>
</com.google.android.material.appbar.AppBarLayout> </com.google.android.material.appbar.AppBarLayout>
<androidx.viewpager2.widget.ViewPager2
<androidx.core.widget.NestedScrollView android:id="@+id/viewPager2"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:fillViewport="true" app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior" />
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<LinearLayout
android:id="@+id/loadLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
android:visibility="visible">
<TextView
android:id="@+id/tipView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/loading_data"
android:visibility="gone" />
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:visibility="visible" />
</LinearLayout>
<RelativeLayout
android:id="@+id/relativeLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="60dp"
android:animateLayoutChanges="true"
android:visibility="gone">
<LinearLayout
android:id="@+id/auditLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginHorizontal="16dp"
android:paddingBottom="8dp">
<TextView
style="@style/TextAppearance.Material3.BodyMedium"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/audit" />
</LinearLayout>
<com.google.android.material.card.MaterialCardView
android:id="@+id/cardView"
style="@style/Widget.Material3.CardView.Elevated"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/auditLayout"
android:layout_marginHorizontal="16dp"
android:visibility="visible">
<RelativeLayout
android:id="@+id/openUserSpace"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginHorizontal="8dp"
android:layout_marginVertical="16dp"
android:orientation="vertical">
<ImageView
android:id="@+id/headIconView"
android:layout_width="50dp"
android:layout_height="50dp"
android:src="@drawable/image" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginStart="8dp"
android:layout_toStartOf="@id/spaceView"
android:layout_toEndOf="@id/headIconView"
android:gravity="center_vertical"
android:orientation="vertical">
<TextView
android:id="@+id/userNameView"
style="@style/TextAppearance.Material3.BodyLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/name" />
<TextView
android:id="@+id/userInfoView"
style="@style/TextAppearance.Material3.BodySmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="@string/fans_information" />
</LinearLayout>
<ImageView
android:id="@+id/spaceView"
android:layout_width="15dp"
android:layout_height="15dp"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:layout_margin="8dp"
android:src="@drawable/next" />
</RelativeLayout>
</com.google.android.material.card.MaterialCardView>
<LinearLayout
android:id="@+id/cardView2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/cardView"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="16dp"
android:orientation="vertical"
android:visibility="visible">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/iconView"
android:layout_width="90dp"
android:layout_height="90dp"
android:padding="8dp"
android:src="@drawable/image" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginStart="8dp"
android:layout_toEndOf="@id/iconView"
android:gravity="center_vertical"
android:orientation="vertical">
<TextView
android:id="@+id/titleView"
style="@style/TextAppearance.Material3.TitleMedium"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:singleLine="true"
android:text="标题" />
<TextView
android:id="@+id/numView"
style="@style/TextAppearance.Material3.BodySmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="单位数" />
<TextView
android:id="@+id/updateTimeView"
style="@style/TextAppearance.Material3.BodySmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="上次更新时间" />
</LinearLayout>
</RelativeLayout>
<com.kongzue.stacklabelview.StackLabel
android:id="@+id/belongStackLabelView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp" />
<com.google.android.material.card.MaterialCardView
style="@style/Widget.Material3.CardView.Filled"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.youth.banner.Banner
android:id="@+id/banner"
android:layout_width="match_parent"
android:layout_height="180dp"
android:layout_marginTop="8dp" />
</com.google.android.material.card.MaterialCardView>
<TextView
android:id="@+id/modInfoView"
style="@style/TextAppearance.Material3.BodyMedium"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="描述" />
<com.google.android.material.divider.MaterialDivider
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
app:dividerThickness="0.8dp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/cardView2"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="16dp"
android:orientation="vertical"
android:visibility="visible">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/discussion"
style="@style/TextAppearance.Material3.HeadlineSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:text="@string/discussion" />
<Button
android:id="@+id/sendDiscussion"
style="@style/Widget.MaterialComponents.Button.TextButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:text="@string/send_discussion" />
</RelativeLayout>
<com.google.android.material.progressindicator.LinearProgressIndicator
android:id="@+id/commentLinearProgressIndicator"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:indeterminate="true" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/modCommentRecyclerView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp" />
</LinearLayout>
</RelativeLayout>
</LinearLayout>
</androidx.core.widget.NestedScrollView>
<com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton <com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
android:id="@+id/button" android:id="@+id/button"
@ -305,8 +58,7 @@
android:layout_gravity="bottom|right" android:layout_gravity="bottom|right"
android:layout_margin="16dp" android:layout_margin="16dp"
android:text="@string/installation" android:text="@string/installation"
app:icon="@drawable/cloud_download" app:icon="@drawable/cloud_download" />
android:visibility="gone" />
</androidx.coordinatorlayout.widget.CoordinatorLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@ -0,0 +1,62 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:paddingHorizontal="16dp"
android:paddingTop="8dp">
<com.google.android.material.card.MaterialCardView
style="@style/Widget.Material3.CardView.Elevated"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="24dp"
android:orientation="vertical">
<TextView
style="@style/TextAppearance.Material3.HeadlineSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/insert_coins" />
<com.google.android.material.button.MaterialButton
android:layout_width="match_parent"
android:enabled="true"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="@string/insert_coins" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="已有5人投币。" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
<TextView
style="@style/TextAppearance.Material3.HeadlineSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="投币记录" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp" />
</LinearLayout>

View File

@ -25,8 +25,10 @@
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/swipeRefreshLayout" android:id="@+id/swipeRefreshLayout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:visibility="gone" android:layout_height="match_parent"
android:layout_height="match_parent"> android:layout_marginHorizontal="16dp"
android:layout_marginTop="8dp"
android:visibility="gone">
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView

View File

@ -34,9 +34,8 @@
android:id="@+id/mapList" android:id="@+id/mapList"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_marginLeft="16dp" android:layout_marginHorizontal="16dp"
android:layout_marginTop="8dp" android:layout_marginTop="8dp"
android:layout_marginRight="16dp"
android:visibility="gone" /> android:visibility="gone" />
</LinearLayout> </LinearLayout>

View File

@ -34,6 +34,8 @@
android:id="@+id/swipeRefreshLayout" android:id="@+id/swipeRefreshLayout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:visibility="gone" android:visibility="gone"
android:layout_marginTop="8dp"
android:layout_marginHorizontal="16dp"
android:layout_height="match_parent"> android:layout_height="match_parent">

View File

@ -0,0 +1,72 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:id="@+id/swipeRefreshLayout"
android:paddingHorizontal="16dp"
android:paddingTop="8dp"
tools:context=".fragments.ModCommentsFragment">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
style="@style/TextAppearance.Material3.HeadlineSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:text="@string/discussion" />
<Button
android:id="@+id/sendDiscussion"
style="@style/Widget.Material3.Button.TextButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:text="@string/send_discussion" />
</RelativeLayout>
<com.google.android.material.progressindicator.LinearProgressIndicator
android:id="@+id/linearProgressIndicator"
android:layout_width="match_parent"
android:layout_marginTop="8dp"
android:visibility="gone"
android:layout_height="wrap_content"
android:indeterminate="true" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="8dp" />
<LinearLayout
android:id="@+id/noContentLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center">
<TextView
style="@style/TextAppearance.Material3.HeadlineSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/no_content" />
</LinearLayout>
</LinearLayout>
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>

View File

@ -7,7 +7,9 @@
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/swipeRefreshLayout" android:id="@+id/swipeRefreshLayout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="8dp">
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView" android:id="@+id/recyclerView"

View File

@ -20,18 +20,17 @@
android:visibility="gone" /> android:visibility="gone" />
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/swipeRefreshLayout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:visibility="gone" android:layout_marginHorizontal="16dp"
android:id="@+id/swipeRefreshLayout"> android:layout_marginTop="8dp"
android:visibility="gone">
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView" android:id="@+id/recyclerView"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent" />
android:layout_marginLeft="16dp"
android:layout_marginTop="8dp"
android:layout_marginRight="16dp" />
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout> </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>

View File

@ -6,8 +6,7 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:animateLayoutChanges="true" android:animateLayoutChanges="true"
android:gravity="center" android:gravity="center"
android:orientation="vertical" android:orientation="vertical">
android:paddingHorizontal="8dp">
<ProgressBar <ProgressBar
@ -28,14 +27,14 @@
android:id="@+id/nestedScrollView" android:id="@+id/nestedScrollView"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:paddingTop="8dp" android:layout_marginHorizontal="16dp"
android:layout_marginTop="8dp"
android:visibility="visible"> android:visibility="visible">
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical" android:orientation="vertical">
android:padding="8dp">
<com.google.android.material.card.MaterialCardView <com.google.android.material.card.MaterialCardView
style="@style/Widget.Material3.CardView.Filled" style="@style/Widget.Material3.CardView.Filled"
@ -45,7 +44,8 @@
<com.youth.banner.Banner <com.youth.banner.Banner
android:id="@+id/banner" android:id="@+id/banner"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="200dp" /> android:layout_height="200dp"
app:banner_indicator_selected_color="?attr/colorPrimary" />
</com.google.android.material.card.MaterialCardView> </com.google.android.material.card.MaterialCardView>

View File

@ -2,4 +2,5 @@
<androidx.recyclerview.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" <androidx.recyclerview.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/recyclerView" android:id="@+id/recyclerView"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" /> android:layout_height="match_parent"
android:layout_marginHorizontal="16dp" />

View File

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="8dp">
<com.google.android.material.bottomsheet.BottomSheetDragHandleView
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
style="@style/TextAppearance.Material3.TitleMedium"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="@string/user_group" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="24dp" />
</LinearLayout>

View File

@ -50,7 +50,7 @@
android:text="@string/name" /> android:text="@string/name" />
<TextView <TextView
android:id="@+id/emailView" android:id="@+id/coinView"
style="@style/TextAppearance.Material3.BodyMedium" style="@style/TextAppearance.Material3.BodyMedium"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"

View File

@ -0,0 +1,217 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:id="@+id/loadLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tipView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone" />
</LinearLayout>
<androidx.core.widget.NestedScrollView
android:id="@+id/contentLayout"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="60dp"
android:layout_marginHorizontal="16dp"
android:animateLayoutChanges="true"
android:orientation="vertical">
<TextView
android:id="@+id/hideTextView"
android:visibility="gone"
style="@style/TextAppearance.Material3.BodyMedium"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="@string/audit" />
<com.google.android.material.card.MaterialCardView
android:id="@+id/cardView"
style="@style/Widget.Material3.CardView.Elevated"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:visibility="gone">
<RelativeLayout
android:id="@+id/openUserSpace"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginHorizontal="8dp"
android:layout_marginVertical="16dp"
android:orientation="vertical">
<ImageView
android:id="@+id/headIconView"
android:layout_width="50dp"
android:layout_height="50dp"
android:src="@drawable/image" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginStart="8dp"
android:layout_toStartOf="@id/spaceView"
android:layout_toEndOf="@id/headIconView"
android:gravity="center_vertical"
android:orientation="vertical">
<TextView
android:id="@+id/userNameView"
style="@style/TextAppearance.Material3.BodyLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/name" />
<TextView
android:id="@+id/userInfoView"
style="@style/TextAppearance.Material3.BodySmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="@string/fans_information" />
</LinearLayout>
<ImageView
android:id="@+id/spaceView"
android:layout_width="16dp"
android:layout_height="16dp"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:layout_margin="8dp"
android:src="@drawable/next" />
</RelativeLayout>
</com.google.android.material.card.MaterialCardView>
<LinearLayout
android:id="@+id/cardView2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:orientation="vertical"
android:visibility="visible">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/iconView"
android:layout_width="90dp"
android:layout_height="90dp"
android:padding="8dp"
android:src="@drawable/image" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginStart="8dp"
android:layout_toEndOf="@id/iconView"
android:gravity="center_vertical"
android:orientation="vertical">
<TextView
android:id="@+id/titleView"
style="@style/TextAppearance.Material3.TitleMedium"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:singleLine="true"
android:text="标题" />
<TextView
android:id="@+id/numView"
style="@style/TextAppearance.Material3.BodySmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="单位数" />
<TextView
android:id="@+id/updateTimeView"
style="@style/TextAppearance.Material3.BodySmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="上次更新时间" />
</LinearLayout>
</RelativeLayout>
<com.google.android.material.chip.ChipGroup
android:id="@+id/chipGroup"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp" />
<com.google.android.material.card.MaterialCardView
style="@style/Widget.Material3.CardView.Filled"
android:layout_width="match_parent"
android:layout_marginTop="16dp"
android:layout_height="wrap_content">
<com.youth.banner.Banner
android:id="@+id/banner"
android:layout_width="match_parent"
android:layout_height="180dp"
android:layout_marginTop="8dp" />
</com.google.android.material.card.MaterialCardView>
<TextView
android:id="@+id/modInfoView"
style="@style/TextAppearance.Material3.BodyMedium"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="描述" />
</LinearLayout>
</LinearLayout>
</androidx.core.widget.NestedScrollView>
</LinearLayout>

View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingVertical="16dp">
<ImageView
android:id="@+id/imageView"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_centerVertical="true"
android:src="@drawable/image" />
<TextView
android:id="@+id/titleView"
android:layout_marginStart="16dp"
style="@style/TextAppearance.Material3.TitleMedium"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toEndOf="@id/imageView"
android:text="@string/title" />
</RelativeLayout>

View File

@ -55,10 +55,10 @@
android:title="@string/set_up" /> android:title="@string/set_up" />
<!-- <item--> <item
<!-- android:id="@+id/donation"--> android:id="@+id/user_group"
<!-- android:icon="@drawable/donation"--> android:icon="@drawable/ic_outline_free_breakfast_24"
<!-- android:title="@string/donation" />--> android:title="@string/user_group" />
<item <item

View File

@ -8,25 +8,25 @@
android:id="@+id/community_item" android:id="@+id/community_item"
android:name="com.coldmint.rust.pro.fragments.CommunityFragment" android:name="com.coldmint.rust.pro.fragments.CommunityFragment"
android:label="@string/community" android:label="@string/community"
tools:layout="@layout/community_fragment" /> tools:layout="@layout/fragment_community" />
<fragment <fragment
android:id="@+id/mod_item" android:id="@+id/mod_item"
android:name="com.coldmint.rust.pro.fragments.WarehouseFragment" android:name="com.coldmint.rust.pro.fragments.WarehouseFragment"
android:label="@string/warehouse" android:label="@string/warehouse"
tools:layout="@layout/mod_fragment" /> tools:layout="@layout/fragment_mod" />
<fragment <fragment
android:id="@+id/database_item" android:id="@+id/database_item"
android:name="com.coldmint.rust.pro.fragments.DatabaseFragment" android:name="com.coldmint.rust.pro.fragments.DatabaseFragment"
android:label="@string/menu_title3" android:label="@string/menu_title3"
tools:layout="@layout/database_fragment" /> tools:layout="@layout/fragment_database" />
<fragment <fragment
android:id="@+id/template_item" android:id="@+id/template_item"
android:name="com.coldmint.rust.pro.fragments.TemplateFragment" android:name="com.coldmint.rust.pro.fragments.TemplateFragment"
android:label="@string/template_title" android:label="@string/template_title"
tools:layout="@layout/template_fragemnt" /> tools:layout="@layout/fragment_local_template" />
</navigation> </navigation>

View File

@ -292,7 +292,9 @@
<string name="template_title">模板包</string> <string name="template_title">模板包</string>
<string name="template_list">模板列表</string> <string name="template_list">模板列表</string>
<string name="close">关闭</string> <string name="close">关闭</string>
<string name="qq_group">qq群</string> <string name="qq_group">qq频道</string>
<string name="details">详情</string>
<string name="insert_coins">投币</string>
<string name="del_completed">已删除\"%1$s\"。</string> <string name="del_completed">已删除\"%1$s\"。</string>
@ -348,7 +350,6 @@
<string name="update_num">已更新%1$s个记录。</string> <string name="update_num">已更新%1$s个记录。</string>
<string name="clean_up_code_cache_complete">代码缓存清理完成。</string> <string name="clean_up_code_cache_complete">代码缓存清理完成。</string>
<string name="clean">清空</string> <string name="clean">清空</string>
<string name="details">详情</string>
<string name="show_details">查看详情</string> <string name="show_details">查看详情</string>
<string name="goto_line">跳转到错误位置</string> <string name="goto_line">跳转到错误位置</string>
<string name="code_navigation">代码导航</string> <string name="code_navigation">代码导航</string>
@ -467,6 +468,7 @@
<string name="directory_does_not_exist">目录不存在。</string> <string name="directory_does_not_exist">目录不存在。</string>
<string name="special_thanks_to">特别鸣谢</string> <string name="special_thanks_to">特别鸣谢</string>
<string name="email">邮箱</string> <string name="email">邮箱</string>
<string name="coin_number">硬币:%1$d</string>
<string name="register_successed">注册成功</string> <string name="register_successed">注册成功</string>
<string name="registration_success_message">账号激活码已发送至您的邮箱。若没有收到,则邮箱可能被视为垃圾邮件了。请检查您的垃圾箱。</string> <string name="registration_success_message">账号激活码已发送至您的邮箱。若没有收到,则邮箱可能被视为垃圾邮件了。请检查您的垃圾箱。</string>
<string name="please_login_first">请先登录。</string> <string name="please_login_first">请先登录。</string>
@ -910,6 +912,8 @@
<string name="all">全部</string> <string name="all">全部</string>
<string name="new_password">新密码</string> <string name="new_password">新密码</string>
<string name="edit_text_color_dark">暗色主题字体颜色</string> <string name="edit_text_color_dark">暗色主题字体颜色</string>
<string name="user_group">用户群</string>
<string name="discord_group">Discord服务器</string>
<!-- <string name="search_suggestions_null">无搜索建议。</string>--> <!-- <string name="search_suggestions_null">无搜索建议。</string>-->
<!-- <string name="search_suggestions_number">共%1$d个搜索建议。</string>--> <!-- <string name="search_suggestions_number">共%1$d个搜索建议。</string>-->

View File

@ -13,6 +13,7 @@ data class DynamicItemDataBean(
val gender: Int, val gender: Int,
val headIcon: String?, val headIcon: String?,
val id: Int, val id: Int,
val location: String?,
val loginTime: String, val loginTime: String,
val permission: String, val permission: String,
val time: String, val time: String,

View File

@ -11,6 +11,7 @@ data class WebModCommentData(
val headIcon: String?, val headIcon: String?,
val id: Int, val id: Int,
val time: String, val time: String,
val userName: String val userName: String,
val location: String?
) )
} }

View File

@ -25,6 +25,8 @@ data class ActivationInfo(
val activation: Boolean, val activation: Boolean,
@SerializedName("headIcon") @SerializedName("headIcon")
val headIcon: String?, val headIcon: String?,
@SerializedName("coinNumber")
val coinNumber: Int,
@SerializedName("banTime") @SerializedName("banTime")
val banTime: String?, val banTime: String?,
@SerializedName("email") @SerializedName("email")