diff --git a/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/chat/ChatActivity.kt b/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/chat/ChatActivity.kt index 78a832e..ced159f 100644 --- a/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/chat/ChatActivity.kt +++ b/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/chat/ChatActivity.kt @@ -3,6 +3,7 @@ package com.remax.visualnovel.ui.chat import android.graphics.Point import androidx.activity.viewModels +import androidx.core.view.marginTop import androidx.lifecycle.Observer import androidx.lifecycle.lifecycleScope import com.alibaba.android.arouter.facade.annotation.Route @@ -16,12 +17,14 @@ import com.remax.visualnovel.utils.Routers import com.remax.visualnovel.utils.StatusBarUtils import com.pengxr.modular.eventbus.generated.events.EventDefineOfUserEvents import com.remax.visualnovel.R +import com.remax.visualnovel.databinding.ActivityActorChat2Binding import com.remax.visualnovel.databinding.ActivityActorChatBinding import com.remax.visualnovel.entity.request.ChatSetting import com.remax.visualnovel.event.model.OnLoginEvent import com.remax.visualnovel.extension.countDownCoroutines import com.remax.visualnovel.extension.launchAndLoadingCollect import com.remax.visualnovel.extension.launchWithRequest +import com.remax.visualnovel.extension.setMargin import com.remax.visualnovel.extension.toast import com.remax.visualnovel.manager.nim.NimManager import com.remax.visualnovel.ui.chat.setting.model.ChatModelDialog @@ -35,7 +38,7 @@ import kotlin.getValue @AndroidEntryPoint @Route(path = Routers.CHAT) -class ChatActivity : BaseBindingActivity() { +class ChatActivity : BaseBindingActivity() { private val chatViewModel by viewModels() private val mRecordAssist = RecordAssist() @@ -45,10 +48,12 @@ class ChatActivity : BaseBindingActivity() { override fun initView() { ARouter.getInstance().inject(this) - //setToolbar(R.string.setting) StatusBarUtils.setStatusBarAndNavBarIsLight(this, false) StatusBarUtils.setTransparent(this) + binding.root.setMargin(topMargin = StatusBarUtils.statusBarHeight) + binding.toolbar.addRightIcon(R.mipmap.chat_title_setting) + with(binding) { initInputPanelEvents() diff --git a/VisualNovel/app/src/main/java/com/remax/visualnovel/widget/toolbar/BaseToolbar.kt b/VisualNovel/app/src/main/java/com/remax/visualnovel/widget/toolbar/BaseToolbar.kt new file mode 100644 index 0000000..671aa00 --- /dev/null +++ b/VisualNovel/app/src/main/java/com/remax/visualnovel/widget/toolbar/BaseToolbar.kt @@ -0,0 +1,172 @@ +package com.remax.visualnovel.widget.toolbar + + +import android.content.Context +import android.graphics.drawable.Drawable +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.annotation.DrawableRes +import com.remax.visualnovel.R +import com.remax.visualnovel.widget.uitoken.view.UITokenImageView +import com.remax.visualnovel.widget.uitoken.view.UITokenLinearLayout +import com.remax.visualnovel.widget.uitoken.view.UITokenTextView + +class BaseToolbar @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : LinearLayout(context, attrs, defStyleAttr) { + + private val ivBack: UITokenImageView + private val llCenter: UITokenLinearLayout + private val ivTitle: UITokenTextView + private val llRight: UITokenLinearLayout + + + private var onChildClickListener: ((View) -> Unit)? = null + + init { + LayoutInflater.from(context).inflate(R.layout.base_toolbar_layout, this, true) + ivBack = findViewById(R.id.iv_left) + llCenter = findViewById(R.id.ll_center) + ivTitle = findViewById(R.id.iv_title) + llRight = findViewById(R.id.ll_right) + + + setOnChildClickListener { view -> + when (view.id) { + R.id.iv_left -> { + // 默认返回按钮处理 + performBackAction() + } + // TODO - 其他子view + } + } + } + + /** + * 设置标题文本 + */ + fun setTitle(text: String) { + ivTitle.text = text + } + + /** + * 设置标题文本 + */ + fun setTitle(resId: Int) { + ivTitle.setText(resId) + } + + /** + * 向中心区域添加自定义视图 + */ + fun addCenterView(view: View) { + llCenter.removeAllViews() + llCenter.addView(view) + setupClickListener(view) + } + + /** + * 向右侧区域添加图标 + */ + fun addRightIcon(@DrawableRes resId: Int, tag: String? = null): ImageView { + val imageView = ImageView(context).apply { + setImageResource(resId) + scaleType = ImageView.ScaleType.CENTER_INSIDE + layoutParams = LinearLayout.LayoutParams( + LayoutParams.WRAP_CONTENT, + LayoutParams.WRAP_CONTENT + ).apply { + setMargins(16, 0, 16, 0) + } + this.tag = tag + } + llRight.addView(imageView) + setupClickListener(imageView) + return imageView + } + + /** + * 向右侧区域添加自定义视图 + */ + fun addRightView(view: View, tag: String? = null) { + view.tag = tag + llRight.addView(view) + setupClickListener(view) + } + + /** + * 清除右侧所有视图 + */ + fun clearRightViews() { + llRight.removeAllViews() + } + + /** + * 设置子视图点击监听器 + */ + fun setOnChildClickListener(listener: (View) -> Unit) { + this.onChildClickListener = listener + setupClickListeners() + } + + /** + * 设置返回按钮可见性 + */ + fun setBackButtonVisible(visible: Boolean) { + ivBack.visibility = if (visible) View.VISIBLE else View.GONE + } + + /** + * 设置返回按钮图标 + */ + fun setBackButtonIcon(@DrawableRes resId: Int) { + ivBack.setImageResource(resId) + } + + /** + * 设置返回按钮图标 + */ + fun setBackButtonIcon(drawable: Drawable) { + ivBack.setImageDrawable(drawable) + } + + /** + * 获取右侧指定tag的视图 + */ + fun findRightViewByTag(tag: String): View? { + for (i in 0 until llRight.childCount) { + val child = llRight.getChildAt(i) + if (child.tag == tag) { + return child + } + } + return null + } + + private fun setupClickListeners() { + setupClickListener(ivBack) + setupClickListener(llCenter) + setupClickListener(ivTitle) + + // 为右侧所有子视图设置监听 + for (i in 0 until llRight.childCount) { + setupClickListener(llRight.getChildAt(i)) + } + } + + private fun setupClickListener(view: View) { + view.setOnClickListener { v -> + onChildClickListener?.invoke(v) + } + } + + private fun performBackAction() { + (context as? android.app.Activity)?.onBackPressed() + } +} \ No newline at end of file diff --git a/VisualNovel/app/src/main/res/layout/activity_actor_chat2.xml b/VisualNovel/app/src/main/res/layout/activity_actor_chat2.xml new file mode 100644 index 0000000..ffecc34 --- /dev/null +++ b/VisualNovel/app/src/main/res/layout/activity_actor_chat2.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualNovel/app/src/main/res/layout/base_toolbar_layout.xml b/VisualNovel/app/src/main/res/layout/base_toolbar_layout.xml new file mode 100644 index 0000000..4d640c9 --- /dev/null +++ b/VisualNovel/app/src/main/res/layout/base_toolbar_layout.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualNovel/app/src/main/res/layout/include_setting_item.xml b/VisualNovel/app/src/main/res/layout/include_setting_item.xml new file mode 100644 index 0000000..9aaedf8 --- /dev/null +++ b/VisualNovel/app/src/main/res/layout/include_setting_item.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualNovel/app/src/main/res/layout/layout_chat_menu_view.xml b/VisualNovel/app/src/main/res/layout/layout_chat_menu_view.xml new file mode 100644 index 0000000..3615eb3 --- /dev/null +++ b/VisualNovel/app/src/main/res/layout/layout_chat_menu_view.xml @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualNovel/app/src/main/res/mipmap-xxhdpi/chat_send_but_bg.webp b/VisualNovel/app/src/main/res/mipmap-xxhdpi/chat_send_but_bg.webp new file mode 100644 index 0000000..9548157 Binary files /dev/null and b/VisualNovel/app/src/main/res/mipmap-xxhdpi/chat_send_but_bg.webp differ diff --git a/VisualNovel/app/src/main/res/mipmap-xxhdpi/chat_title_setting.webp b/VisualNovel/app/src/main/res/mipmap-xxhdpi/chat_title_setting.webp new file mode 100644 index 0000000..f0710be Binary files /dev/null and b/VisualNovel/app/src/main/res/mipmap-xxhdpi/chat_title_setting.webp differ diff --git a/VisualNovel/app/src/main/res/mipmap-xxhdpi/setting_ai_model.webp b/VisualNovel/app/src/main/res/mipmap-xxhdpi/setting_ai_model.webp new file mode 100644 index 0000000..6a831c7 Binary files /dev/null and b/VisualNovel/app/src/main/res/mipmap-xxhdpi/setting_ai_model.webp differ diff --git a/VisualNovel/app/src/main/res/mipmap-xxhdpi/setting_arrow_down.webp b/VisualNovel/app/src/main/res/mipmap-xxhdpi/setting_arrow_down.webp new file mode 100644 index 0000000..6e75f08 Binary files /dev/null and b/VisualNovel/app/src/main/res/mipmap-xxhdpi/setting_arrow_down.webp differ diff --git a/VisualNovel/app/src/main/res/mipmap-xxhdpi/setting_arrow_right.webp b/VisualNovel/app/src/main/res/mipmap-xxhdpi/setting_arrow_right.webp new file mode 100644 index 0000000..5ce173f Binary files /dev/null and b/VisualNovel/app/src/main/res/mipmap-xxhdpi/setting_arrow_right.webp differ diff --git a/VisualNovel/app/src/main/res/mipmap-xxhdpi/setting_delete.webp b/VisualNovel/app/src/main/res/mipmap-xxhdpi/setting_delete.webp new file mode 100644 index 0000000..5d04713 Binary files /dev/null and b/VisualNovel/app/src/main/res/mipmap-xxhdpi/setting_delete.webp differ diff --git a/VisualNovel/app/src/main/res/values/colors.xml b/VisualNovel/app/src/main/res/values/colors.xml index 22a56f7..9c1c1b2 100644 --- a/VisualNovel/app/src/main/res/values/colors.xml +++ b/VisualNovel/app/src/main/res/values/colors.xml @@ -188,6 +188,10 @@ #FFFF00 #FF8800 #ff565563 + #ff333333 + #ff666666 + #fff6f6f6 + diff --git a/VisualNovel/app/src/main/res/values/strings.xml b/VisualNovel/app/src/main/res/values/strings.xml index c789ab3..7031a90 100644 --- a/VisualNovel/app/src/main/res/values/strings.xml +++ b/VisualNovel/app/src/main/res/values/strings.xml @@ -462,11 +462,19 @@ Contact Us: support@VisualNovel.ai All + + from Hold to Talk Type a message Swipe Up to Cancel Release to Send Release to Cancel + Switch Model + Sound + Appearance + Background + History Archives + DELETE \ No newline at end of file