优化ai对话页面

This commit is contained in:
fengjignqi
2026-08-04 10:44:12 +08:00
parent 54dc0b5598
commit 9d432dba67
34 changed files with 1024 additions and 764 deletions

Binary file not shown.

View File

@@ -7,7 +7,10 @@ object ActionCode {
//const val BASE_URL = "https://ragged-parting-unrushed.ngrok-free.dev";
//const val BASE_URL = "https://ragged-parting-unrushed.ngrok-free.dev";
// const val BASE_URL = "https://ragged-parting-unrushed.ngrok-free.dev";
const val BASE_URL = "https://d.chongdunpet.com"
// const val BASE_URL = "http://192.168.1.187:8080"
const val CUSTOMER_URL = "wss://d.chongdunpet.com/ws/chat?role=customer&token=";

View File

@@ -1,6 +1,7 @@
package com.ck.ckcollar.app.model
class BannarModel : CkBaseModel(){
var localImageRes: Int = 0
var bannerStatus: String? = ""
var bannerUrl: String? = ""
var createBy: String? = ""
@@ -11,4 +12,4 @@ class BannarModel : CkBaseModel(){
var sortOrder: Int = 0
var updateBy: String? = ""
var updateTime: String? = ""
}
}

View File

@@ -19,6 +19,7 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.inputmethod.EditorInfo
import android.view.inputmethod.InputMethodManager
import android.widget.TextView
import androidx.core.content.FileProvider
import androidx.recyclerview.widget.LinearLayoutManager
@@ -68,6 +69,8 @@ class CustomerActivity : CKBaseActivity() {
var data = mutableListOf<CustomerMessageModel.MessageItemModel>()
var path = ""
private var isSending = false
private var isAiResponding = false
var url = ""
var lock = true
@@ -97,6 +100,24 @@ class CustomerActivity : CKBaseActivity() {
binding.recyclerView.adapter = customerMessageAdapter
binding.editMessage.setHorizontallyScrolling(false);
binding.btnSend.setOnClickListener {
if (isAiResponding) {
toast("请等待当前问题回答结束")
return@setOnClickListener
}
isSending = true
// Reset the action controls immediately. The send flow captures the
// submitted text and image path before clearing the visible draft.
binding.btnSend.visibility = View.GONE
binding.btnMore.visibility = View.VISIBLE
binding.editMessage.onEditorAction(EditorInfo.IME_ACTION_SEND)
}
updateSendControls()
// Use the traditional multiline keyboard action; sending is handled by the
// activity's own message flow rather than the IME action button.
binding.editMessage.setSingleLine(false)
binding.editMessage.imeOptions = EditorInfo.IME_ACTION_NONE
binding.editMessage.setRawInputType(android.text.InputType.TYPE_CLASS_TEXT or android.text.InputType.TYPE_TEXT_FLAG_MULTI_LINE)
binding.editMessage.setOnEditorActionListener(object : TextView.OnEditorActionListener {
override fun onEditorAction(
@@ -104,21 +125,21 @@ class CustomerActivity : CKBaseActivity() {
actionId: Int,
ketEvent: KeyEvent?
): Boolean {
if (actionId == EditorInfo.IME_ACTION_UNSPECIFIED ||
actionId == EditorInfo.IME_ACTION_SEND ||
(ketEvent != null && ketEvent.keyCode == KeyEvent.KEYCODE_ENTER)
) {
if (actionId == EditorInfo.IME_ACTION_SEND) {
if (lock) {
var text = binding.editMessage.text.toString()
var index = text.indexOf("$$$$$") >= 0
if (!index) {
path = ""
}
text = text.replace("$$$$$", "")
if (!TextUtils.isEmpty(text) || !TextUtils.isEmpty(path)) {
// Whitespace-only input is not a message. A selected image may still be sent alone.
val text = binding.editMessage.text.toString().trim()
if (text.isNotEmpty() || path.isNotEmpty()) {
lock = false
KeyboardUtils.hideKeyboard(this@CustomerActivity)
binding.editMessage.clearFocus()
handler.post {
sendMessage(UUID.randomUUID().toString(),text,false)
if (!TextUtils.isEmpty(path)) {
uploadImage(text, path)
} else {
sendMessage(UUID.randomUUID().toString(), text, false, "")
}
clearInputViews()
}
}
}
@@ -156,14 +177,9 @@ class CustomerActivity : CKBaseActivity() {
p2: Int,
p3: Int
) {
if (p0?.toString()?.trim()?.isNotEmpty() == true) isSending = false
updateSendControls()
try {
var text = binding.editMessage.text.toString()
var index = text.indexOf("$$$$$") >= 0
// if (!index) {
// path = ""
// }
val lineCount: Int? = binding.editMessage.getLineCount()
val lineHeight: Int = binding.editMessage.getLineHeight()
val maxHeight: Int = lineCount!! * lineHeight
@@ -175,12 +191,13 @@ class CustomerActivity : CKBaseActivity() {
})
binding.btnMore.setOnClickListener {
if (binding.contentBottom.visibility == View.GONE) {
KeyboardUtils.hideKeyboard(this@CustomerActivity)
val inputMethodManager =
getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
inputMethodManager.hideSoftInputFromWindow(binding.editMessage.windowToken, 0)
binding.editMessage.clearFocus()
binding.contentBottom.visibility = View.VISIBLE
} else {
binding.contentBottom.visibility = View.GONE
binding.editMessage.requestFocus()
KeyboardUtils.showKeyboard(binding.editMessage)
}
}
binding.btnSmile.setOnClickListener {
@@ -188,6 +205,9 @@ class CustomerActivity : CKBaseActivity() {
binding.editMessage.requestFocus()
KeyboardUtils.showKeyboard(binding.editMessage)
}
binding.btnDeleteImage.setOnClickListener {
clearSelectedImage()
}
//拍照
binding.conetnt1.setOnClickListener {
@@ -233,7 +253,7 @@ class CustomerActivity : CKBaseActivity() {
}
}
handleMessage()
binding.btnSmile.visibility = View.GONE;
}
override fun onPermissionsGranted(requestCode: Int, permissions: Array<String>) {
@@ -295,7 +315,7 @@ class CustomerActivity : CKBaseActivity() {
if (!TextUtils.isEmpty(sendConetnt) || !TextUtils.isEmpty(url)){
handler.post {
sendMessage2(UUID.randomUUID().toString(),sendConetnt,true)
sendMessage2(UUID.randomUUID().toString(),sendConetnt,true, url)
}
}
}
@@ -322,15 +342,17 @@ class CustomerActivity : CKBaseActivity() {
}).show()
}
fun sendMessage(uuid :String ,content: String,isResend : Boolean) {
fun sendMessage(uuid :String ,content: String,isResend : Boolean, imageUrl: String) {
if (!TextUtils.isEmpty(url)) {
isAiResponding = true
if (!TextUtils.isEmpty(imageUrl)) {
this@CustomerActivity.data.add(CustomerMessageModel.MessageItemModel().apply {
senderId = CKApp.app.userInfo?.id!!
this.content = content
this.senderAvatar = CKApp.app.userInfo?.avatar
this.senderName = CKApp.app.userInfo?.custName ?: ""
this.url = this@CustomerActivity.url
this.url = imageUrl
})
}
if (!TextUtils.isEmpty(content) && !isResend) {
@@ -350,14 +372,12 @@ class CustomerActivity : CKBaseActivity() {
TTHttpClient.postJsonStream3(this, "发送会话消息stream", TTRequestParam().apply {
add(TTRequestData("imageUrl", url))
add(TTRequestData("imageUrl", imageUrl))
add(TTRequestData("question", content))
}, object : ICallback {
override fun onSuccess(data: String) {
lock = true
// var model = Gson().fromJson<AIMessageModel>(data, AIMessageModel::class.java)
var flag = false
@@ -379,9 +399,6 @@ class CustomerActivity : CKBaseActivity() {
}
binding.editMessage.setText("")
path = ""
url = ""
customerMessageAdapter.data = this@CustomerActivity.data
customerMessageAdapter.notifyDataSetChanged()
@@ -401,13 +418,17 @@ class CustomerActivity : CKBaseActivity() {
}
override fun onFailed(code: String, msg: String) {
isAiResponding = false
lock = true
// toast(msg)
//TTLog.e(msg)
}
})
binding.editMessage.setText("")
override fun onComplete() {
isAiResponding = false
lock = true
}
})
customerMessageAdapter.data = this@CustomerActivity.data
customerMessageAdapter.notifyDataSetChanged()
@@ -418,7 +439,8 @@ class CustomerActivity : CKBaseActivity() {
fun sendMessage2(uuid :String ,content: String,isResend : Boolean) {
fun sendMessage2(uuid :String ,content: String,isResend : Boolean, imageUrl: String) {
isAiResponding = true
lock = false
if (!TextUtils.isEmpty(content) && !isResend) {
this@CustomerActivity.data.add(CustomerMessageModel.MessageItemModel().apply {
@@ -437,14 +459,12 @@ class CustomerActivity : CKBaseActivity() {
TTHttpClient.postJsonStream3(this, "发送会话消息stream", TTRequestParam().apply {
add(TTRequestData("imageUrl", url))
add(TTRequestData("imageUrl", imageUrl))
add(TTRequestData("question", content))
}, object : ICallback {
override fun onSuccess(data: String) {
lock = true
// var model = Gson().fromJson<AIMessageModel>(data, AIMessageModel::class.java)
var flag = false
@@ -466,9 +486,6 @@ class CustomerActivity : CKBaseActivity() {
}
binding.editMessage.setText("")
path = ""
url = ""
customerMessageAdapter.data = this@CustomerActivity.data
customerMessageAdapter.notifyDataSetChanged()
@@ -488,13 +505,17 @@ class CustomerActivity : CKBaseActivity() {
}
override fun onFailed(code: String, msg: String) {
isAiResponding = false
lock = true
// toast(msg)
//TTLog.e(msg)
}
})
binding.editMessage.setText("")
override fun onComplete() {
isAiResponding = false
lock = true
}
})
customerMessageAdapter.data = this@CustomerActivity.data
customerMessageAdapter.notifyDataSetChanged()
@@ -504,10 +525,10 @@ class CustomerActivity : CKBaseActivity() {
}
fun uploadImage() {
fun uploadImage(content: String, imagePath: String) {
var param = TTRequestParam()
param.files.add(File(path))
param.files.add(File(imagePath))
showProgeassDialog()
TTHttpClient.postFile(this, "上传照片s", param, object : ICallback {
@@ -515,9 +536,8 @@ class CustomerActivity : CKBaseActivity() {
hiddenProgeassDialog()
var model = Gson().fromJson<UploadModel>(data, UploadModel::class.java)
url = model.urls
handler.post {
sendMessage(UUID.randomUUID().toString(), "", false)
sendMessage(UUID.randomUUID().toString(), content, false, model.urls)
}
}
@@ -525,8 +545,11 @@ class CustomerActivity : CKBaseActivity() {
override fun onFailed(code: String, msg: String) {
hiddenProgeassDialog()
lock = true
path = ""
url = ""
if (path.isEmpty() && binding.editMessage.text.toString().isEmpty()) {
path = imagePath
showImagePreview(imagePath)
binding.editMessage.setText(content)
}
toast(msg)
}
})
@@ -561,15 +584,15 @@ class CustomerActivity : CKBaseActivity() {
if (requestCode == 55 && resultCode == RESULT_OK) {
path = PreferencesUtils.getString(this@CustomerActivity, Const.IMAGE_PATH, "")!!
sendSelectedImage()
prepareSelectedImage()
} else if (requestCode == 56 && resultCode == RESULT_OK) {
path = TTUtils.getImageUrl(this, data!!.getData());
sendSelectedImage()
prepareSelectedImage()
}
}
private fun sendSelectedImage() {
private fun prepareSelectedImage() {
if (TextUtils.isEmpty(path)) return
LubanCompressUtil.getCompressFile(
@@ -579,10 +602,17 @@ class CustomerActivity : CKBaseActivity() {
override fun success(file: File) {
if (isFinishing || isDestroyed) return
path = file.absolutePath
lock = false
lock = true
binding.contentBottom.visibility = View.GONE
binding.editMessage.setText("")
uploadImage()
showImagePreview(path)
binding.editMessage.requestFocus()
KeyboardUtils.showKeyboard(binding.editMessage)
// Rebind the IME after selecting an image so its action button is
// available even though the text field itself is empty.
binding.editMessage.postDelayed({
val imm = getSystemService(INPUT_METHOD_SERVICE) as? android.view.inputmethod.InputMethodManager
imm?.restartInput(binding.editMessage)
}, 150L)
}
override fun fail(failMsg: String) {
@@ -595,6 +625,48 @@ class CustomerActivity : CKBaseActivity() {
)
}
private fun showImagePreview(imagePath: String) {
isSending = false
binding.contentImagePreview.visibility = View.VISIBLE
updateSendControls()
binding.imagePreview.scaleType = android.widget.ImageView.ScaleType.CENTER_CROP
Glide.with(this)
.load(imagePath)
.into(binding.imagePreview)
}
private fun clearSelectedImage() {
path = ""
url = ""
binding.imagePreview.setImageDrawable(null)
binding.contentImagePreview.visibility = View.GONE
updateSendControls()
}
private fun clearInputViews() {
binding.editMessage.setText("")
path = ""
url = ""
binding.imagePreview.setImageDrawable(null)
binding.contentImagePreview.visibility = View.GONE
// Sending has already been initiated; keep the controls in their idle state
// until the user starts composing the next draft.
binding.btnSend.visibility = View.GONE
binding.btnMore.visibility = View.VISIBLE
}
private fun updateSendControls() {
val hasImage = path.isNotEmpty()
val hasText = binding.editMessage.text.toString().trim().isNotEmpty()
if (isSending) {
binding.btnSend.visibility = View.GONE
binding.btnMore.visibility = View.VISIBLE
return
}
binding.btnSend.visibility = if (hasImage || hasText) View.VISIBLE else View.GONE
binding.btnMore.visibility = if (hasImage) View.GONE else View.VISIBLE
}
override fun onDestroy() {
super.onDestroy()

View File

@@ -286,7 +286,7 @@ class MineCustomerActivity : CKBaseActivity() {
override fun onOpen(webSocket: WebSocket, response: Response) {
TTLog.e("onOpen")
runOnUiThread {
toast(getString(R.string.connect_customer_success))
// toast(getString(R.string.connect_customer_success))
}
}
})

View File

@@ -368,7 +368,7 @@ class PeopleCustomerActivity : CKBaseActivity() {
override fun onOpen(webSocket: WebSocket, response: Response) {
TTLog.e("onOpen")
runOnUiThread {
toast(getString(R.string.connect_customer_success))
// toast(getString(R.string.connect_customer_success))
}
}
})

View File

@@ -261,7 +261,7 @@ class ShopCustomerActivity : CKBaseActivity() {
override fun onOpen(webSocket: WebSocket, response: Response) {
TTLog.e("onOpen")
runOnUiThread {
toast(getString(R.string.connect_customer_success))
// toast(getString(R.string.connect_customer_success))
}
}
})

View File

@@ -8,6 +8,7 @@ import android.view.ViewGroup
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.ck.ckcollar.app.CKApp
import com.ck.ckcollar.app.R
import com.ck.ckcollar.app.databinding.FragmentHealthBinding
import com.ck.ckcollar.app.databinding.LayoutItemNoteBinding
@@ -16,6 +17,7 @@ import com.ck.ckcollar.app.model.CustomerStatusModel
import com.ck.ckcollar.app.model.HealthNoteModel
import com.ck.ckcollar.app.ui.act.customer.CustomerActivity
import com.ck.ckcollar.app.ui.act.customer.PeopleCustomerActivity
import com.ck.ckcollar.app.ui.act.login.LoginActivity
import com.ck.ckcollar.app.ui.act.note.NoteDetailsActivity
import com.ck.ckcollar.app.ui.base.CKBaseFragment
import com.ck.ckcollar.app.ui.dialog.CKAlertDialog
@@ -64,10 +66,12 @@ class HealthFragment: CKBaseFragment() {
binding.recyclerView.adapter = noteAdapter
binding.btnAIText.setOnClickListener {
if (!requireLogin()) return@setOnClickListener
toActivity(CustomerActivity::class.java, DataCollection())
}
binding.btnAIPhoto.setOnClickListener {
if (!requireLogin()) return@setOnClickListener
toActivity(CustomerActivity::class.java, DataCollection())
}
binding.contentCustomer.setOnClickListener {
@@ -75,6 +79,10 @@ class HealthFragment: CKBaseFragment() {
}
binding.refreshLayout.setEnableLoadMore(false)
binding.refreshLayout.setOnRefreshListener {
if (!CKApp.app.isUserLoggedIn) {
binding.refreshLayout.finishRefresh()
return@setOnRefreshListener
}
page = 1
getData()
getCustomerTime()
@@ -84,6 +92,12 @@ class HealthFragment: CKBaseFragment() {
}
private fun requireLogin(): Boolean {
if (CKApp.app.isUserLoggedIn) return true
toActivity(LoginActivity::class.java, DataCollection())
return false
}
override fun initData() {
@@ -93,6 +107,7 @@ class HealthFragment: CKBaseFragment() {
fun getCustomerTime(){
if (!CKApp.app.isUserLoggedIn) return
TTHttpClient.get(activity as TTBaseActivity,"客服在线状态", TTRequestParam(),object : ICallback{
override fun onSuccess(data: String) {
@@ -128,6 +143,8 @@ class HealthFragment: CKBaseFragment() {
}
fun getData(){
// if (!CKApp.app.isUserLoggedIn) return
TTHttpClient.get(activity as TTBaseActivity,"宠物知识列表", TTRequestParam().apply {
add(
TTRequestData("pageNum", page)

View File

@@ -28,6 +28,7 @@ import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.bumptech.glide.load.resource.bitmap.RoundedCorners
import com.bumptech.glide.request.RequestOptions
import com.ck.ckcollar.app.CKApp
import com.ck.ckcollar.app.R
import com.ck.ckcollar.app.databinding.FragmentHomeBinding
import com.ck.ckcollar.app.listenner.OnItemClickListenner
@@ -42,6 +43,7 @@ import com.ck.ckcollar.app.ui.act.petmanager.InputInviteCodeActivity
import com.ck.ckcollar.app.ui.act.petmanager.MapLocationActivity
import com.ck.ckcollar.app.ui.act.petmanager.PetManagerActivity
import com.ck.ckcollar.app.ui.act.petmanager.ViewPetFileActivity
import com.ck.ckcollar.app.ui.act.login.LoginActivity
import com.ck.ckcollar.app.ui.base.CKBaseFragment
import com.ck.ckcollar.app.ui.dialog.CKAlertDialog
import com.ck.ckcollar.app.ui.popview.CKCollarTypePopView
@@ -125,10 +127,12 @@ class HomeFragment : CKBaseFragment() {
homeBinding.textName?.setOnClickListener {
if (!requireLogin()) return@setOnClickListener
getPetList()
}
//扫一扫
homeBinding.btnScan?.setOnClickListener {
if (!requireLogin()) return@setOnClickListener
if (dataModel == null) {
toast(getString(R.string.choose_pet_alert))
return@setOnClickListener
@@ -151,6 +155,7 @@ class HomeFragment : CKBaseFragment() {
startScan()
}
homeBinding.btnCamera?.setOnClickListener {
if (!requireLogin()) return@setOnClickListener
try {
if (!checkCameraPermissions()){
@@ -170,9 +175,11 @@ class HomeFragment : CKBaseFragment() {
}
}
homeBinding.btnManager?.setOnClickListener {
if (!requireLogin()) return@setOnClickListener
toActivity(PetManagerActivity::class.java, DataCollection())
}
homeBinding.btnAddPet?.setOnClickListener {
if (!requireLogin()) return@setOnClickListener
toActivity(AddPetActivity::class.java, DataCollection())
}
@@ -198,6 +205,7 @@ class HomeFragment : CKBaseFragment() {
}
homeBinding.btnViewPostion?.setOnClickListener {
if (!requireLogin()) return@setOnClickListener
getData(dataModel?.id.toString())
// toActivity(MapLocationActivity::class.java, DataCollection().apply {
@@ -216,6 +224,10 @@ class HomeFragment : CKBaseFragment() {
})
}
homeBinding.refreshLayout?.setOnRefreshListener {
if (!CKApp.app.isUserLoggedIn) {
homeBinding.refreshLayout?.finishRefresh()
return@setOnRefreshListener
}
if (dataModel == null) {
getData("")
@@ -232,6 +244,12 @@ class HomeFragment : CKBaseFragment() {
}
}
private fun requireLogin(): Boolean {
if (CKApp.app.isUserLoggedIn) return true
toActivity(LoginActivity::class.java, DataCollection())
return false
}
private fun requestCameraPermission(action: CameraAction) {
pendingCameraAction = action
showCameraPermissionTopDialog()
@@ -278,6 +296,13 @@ class HomeFragment : CKBaseFragment() {
override fun initData() {
if (!CKApp.app.isUserLoggedIn) {
setBannerData(listOf(BannarModel().apply {
localImageRes = R.mipmap.index_banner1
}))
return
}
var data = PreferencesUtils.getString(activity!!, Const.PET_DATA, "")
if (!TextUtils.isEmpty(data)) {
@@ -305,7 +330,7 @@ class HomeFragment : CKBaseFragment() {
LiveDataBus.get().with("FIRST", Int::class.java)
.observe(viewLifecycleOwner, object : Observer<Int?> {
override fun onChanged(result: Int?) {
getPetList2()
if (CKApp.app.isUserLoggedIn) getPetList2()
}
})
@@ -350,22 +375,14 @@ class HomeFragment : CKBaseFragment() {
}
fun getData(id: String) {
if (!CKApp.app.isUserLoggedIn) return
TTHttpClient.get(activity as TTBaseActivity, "首页", TTRequestParam().apply {
add(TTRequestData("patId", id))
}, object : ICallback {
override fun onSuccess(data: String) {
homeModel = Gson().fromJson<HomeModel>(data, HomeModel::class.java)
bannarData = homeModel?.banners!!
imageAdapter = ImageAdapter(activity!!, bannarData, object : OnItemClickListenner {
override fun onClick(pos: Int, model: Any) {
}
})
homeBinding.banner.addBannerLifecycleObserver(this@HomeFragment)//添加生命周期观察者
.setAdapter(imageAdapter)
.setIndicator(CircleIndicator(activity));
setBannerData(homeModel?.banners.orEmpty())
}
@@ -470,7 +487,18 @@ class HomeFragment : CKBaseFragment() {
})
}
private fun setBannerData(data: List<BannarModel>) {
bannarData = data
imageAdapter = ImageAdapter(activity!!, bannarData, object : OnItemClickListenner {
override fun onClick(pos: Int, model: Any) = Unit
})
homeBinding.banner.addBannerLifecycleObserver(this@HomeFragment)
.setAdapter(imageAdapter)
.setIndicator(CircleIndicator(activity))
}
fun switchPet() {
if (!CKApp.app.isUserLoggedIn) return
LiveDataBus.get().with("BOUND" + dataModel!!.id, Int::class.java)
@@ -506,6 +534,7 @@ class HomeFragment : CKBaseFragment() {
}
fun getPetInfo(id: String) {
if (!CKApp.app.isUserLoggedIn) return
TTHttpClient.get(activity as TTBaseActivity, "宠物档案", id, object : ICallback {
override fun onSuccess(data: String) {
var model = Gson().fromJson<CollarTypeModel.TypeDataModel>(
@@ -592,6 +621,7 @@ class HomeFragment : CKBaseFragment() {
fun getPetList() {
if (!CKApp.app.isUserLoggedIn) return
showProgeassDialog(getString(R.string.search))
TTHttpClient.get(activity as TTBaseActivity, "宠物列表", TTRequestParam().apply {
add(
@@ -656,6 +686,7 @@ class HomeFragment : CKBaseFragment() {
fun getPetList2() {
if (!CKApp.app.isUserLoggedIn) return
showProgeassDialog(getString(R.string.search))
TTHttpClient.get(activity as TTBaseActivity, "宠物列表", TTRequestParam().apply {
add(
@@ -696,6 +727,7 @@ class HomeFragment : CKBaseFragment() {
}
fun uploadImage(path: String) {
if (!CKApp.app.isUserLoggedIn) return
var param = TTRequestParam()
param.files.add(File(path))
@@ -717,6 +749,7 @@ class HomeFragment : CKBaseFragment() {
}
fun aiPhoto(imageUrl: String) {
if (!CKApp.app.isUserLoggedIn) return
TTHttpClient.postJson(activity as TTBaseActivity, "AI拍照识别", TTRequestParam().apply {
add(TTRequestData("imageUrl", imageUrl))
@@ -824,8 +857,11 @@ class HomeFragment : CKBaseFragment() {
position: Int,
size: Int
) {
val imageSource: Any? = data?.localImageRes
?.takeIf { it != 0 }
?: data?.bannerUrl
Glide.with(context)
.load(data?.bannerUrl)
.load(imageSource)
.apply(RequestOptions.bitmapTransform(RoundedCorners(12)))
.placeholder(R.mipmap.image_bannar_item)
.into(holder!!.imageView)

View File

@@ -17,6 +17,7 @@ import com.ck.ckcollar.app.ui.act.deposit.DepositActivity
import com.ck.ckcollar.app.ui.act.deposit.StartDepositActivity
import com.ck.ckcollar.app.ui.act.member.MemberActivity
import com.ck.ckcollar.app.ui.act.message.MessageCenterActivity
import com.ck.ckcollar.app.ui.act.login.LoginActivity
import com.ck.ckcollar.app.ui.act.mine.FeedBackActivity
import com.ck.ckcollar.app.ui.act.mine.ReturnDeviceActivity
import com.ck.ckcollar.app.ui.act.points.PointsActivity
@@ -51,15 +52,19 @@ class MineFragment : CKBaseFragment() {
override fun initView() {
binding.contentBalance.setOnClickListener {
if (!requireLogin()) return@setOnClickListener
toActivity(BalanceActivity::class.java, DataCollection())
}
binding.conetntPoints.setOnClickListener {
if (!requireLogin()) return@setOnClickListener
toActivity(PointsActivity::class.java, DataCollection())
}
binding.imageUser.setOnClickListener {
if (!requireLogin()) return@setOnClickListener
toActivity(UserInfoActivity::class.java, DataCollection())
}
binding.btnUserInfo.setOnClickListener {
if (!requireLogin()) return@setOnClickListener
toActivity(UserInfoActivity::class.java, DataCollection())
}
@@ -71,19 +76,24 @@ class MineFragment : CKBaseFragment() {
toActivity(SettingActivity::class.java, DataCollection())
}
binding.btnOpen.setOnClickListener {
if (!requireLogin()) return@setOnClickListener
toActivity(MemberActivity::class.java, DataCollection())
}
binding.btnReturnDevice.setOnClickListener {
if (!requireLogin()) return@setOnClickListener
toActivity(ReturnDeviceActivity::class.java, DataCollection())
}
binding.btnFeedback.setOnClickListener {
if (!requireLogin()) return@setOnClickListener
toActivity(FeedBackActivity::class.java, DataCollection())
}
binding.btnCustomerService.setOnClickListener {
if (!requireLogin()) return@setOnClickListener
toActivity(PeopleCustomerActivity::class.java, DataCollection().apply { add(Data("chatType","2")) })
}
binding.textDeposit.setOnClickListener {
if (!requireLogin()) return@setOnClickListener
if ("0".equals(CKApp.app.userInfo!!.depositStatus)){
toActivity(DepositActivity::class.java, DataCollection())
}else{
@@ -92,18 +102,23 @@ class MineFragment : CKBaseFragment() {
}
binding.btnAllOrder.setOnClickListener {
if (!requireLogin()) return@setOnClickListener
toActivity(MyOrderActivity::class.java, DataCollection().apply { add(Data("pos","0")) })
}
binding.btnOrderPayment.setOnClickListener {
if (!requireLogin()) return@setOnClickListener
toActivity(MyOrderActivity::class.java, DataCollection().apply { add(Data("pos","1")) })
}
binding.btnOrderDelivery.setOnClickListener {
if (!requireLogin()) return@setOnClickListener
toActivity(MyOrderActivity::class.java, DataCollection().apply { add(Data("pos","2")) })
}
binding.btnOrderReceipt.setOnClickListener {
if (!requireLogin()) return@setOnClickListener
toActivity(MyOrderActivity::class.java, DataCollection().apply { add(Data("pos","3")) })
}
binding.btnOrderAfterSales.setOnClickListener {
if (!requireLogin()) return@setOnClickListener
toActivity(MyOrderActivity::class.java, DataCollection().apply { add(Data("pos","4")) })
}
@@ -111,10 +126,28 @@ class MineFragment : CKBaseFragment() {
}
private fun requireLogin(): Boolean {
if (CKApp.app.isUserLoggedIn) return true
toActivity(LoginActivity::class.java, DataCollection())
return false
}
override fun initData() {
if (!CKApp.app.isUserLoggedIn) {
binding.textNick.text = getString(R.string.guest)
binding.textPhone.text = ""
binding.textPhone.visibility = View.GONE
binding.textBalance.text = "0"
binding.textPoints.text = "0"
binding.textCount.visibility = View.INVISIBLE
binding.imageUser.setImageResource(R.mipmap.image_user_default)
return
}
binding.textNick.text = CKApp.app.userInfo?.custName
binding.textPhone.text = CKApp.app.userInfo?.phonenumber
binding.textPhone.visibility = View.VISIBLE
if (!TextUtils.isEmpty(CKApp.app.userInfo?.avatar)){
Glide.with(this@MineFragment)
@@ -123,8 +156,8 @@ class MineFragment : CKBaseFragment() {
.into(binding.imageUser)
}
binding.textBalance.text = CKApp.app.userInfo?.balance.toString()
binding.textPoints.text = CKApp.app.userInfo?.points.toString()
binding.textBalance.text = CKApp.app.userInfo?.balance?.toString() ?: "0"
binding.textPoints.text = CKApp.app.userInfo?.points?.toString() ?: "0"
if (CKApp.app.userInfo?.isMember == true){
binding.btnOpen.setText(getString(R.string.auto_renewal2))
@@ -150,6 +183,11 @@ class MineFragment : CKBaseFragment() {
getUserInfo()
}
fun getUserInfo(){
if (!CKApp.app.isUserLoggedIn) {
binding.textCount.visibility = View.INVISIBLE
return
}
TTHttpClient.get(activity as TTBaseActivity,"个人资料", TTRequestParam(),object : ICallback{
override fun onSuccess(data: String) {
CKApp.app.userInfo = Gson().fromJson<UserInfoModel>(data, UserInfoModel::class.java)
@@ -187,4 +225,4 @@ class MineFragment : CKBaseFragment() {
}
}

View File

@@ -15,6 +15,7 @@ import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.bumptech.glide.load.resource.bitmap.RoundedCorners
import com.bumptech.glide.request.RequestOptions
import com.ck.ckcollar.app.CKApp
import com.ck.ckcollar.app.R
import com.ck.ckcollar.app.action.ActionCode
import com.ck.ckcollar.app.databinding.FragmentShopBinding
@@ -299,6 +300,11 @@ class ShopFragment : CKBaseFragment() {
}
fun getCarCount() {
if (!CKApp.app.isUserLoggedIn) {
binding.textCount.visibility = View.GONE
return
}
TTHttpClient.get(
activity as TTBaseActivity,
"购物车数量和合计",
@@ -546,4 +552,4 @@ class ShopFragment : CKBaseFragment() {
}
}
}
}

View File

@@ -1,5 +1,6 @@
package com.ck.ckcollar.app.ui.act.petmanager
import android.Manifest
import android.content.Intent
import android.graphics.Bitmap
import android.net.Uri
@@ -97,12 +98,10 @@ class AddPetActivity : CKBaseActivity() {
try {
if (mark == 0){
if (!checkCameraPermissions()){
CKAlertDialog(this@AddPetActivity,getString(R.string.alert),getString(R.string.camera_alert),object : CKAlertDialog.AlertClickListener{
override fun onBack(isConfirm: Boolean) {
TODO("Not yet implemented")
}
}).show()
getPermissionRequst(
Manifest.permission.CAMERA,
REQUEST_CAMERA_PERMISSION
)
return
}
takePhoto()
@@ -194,6 +193,12 @@ class AddPetActivity : CKBaseActivity() {
}
override fun onPermissionsGranted(requestCode: Int, permissions: Array<String>) {
if (requestCode == REQUEST_CAMERA_PERMISSION) {
takePhoto()
}
}
override fun initData() {
var data = getReceiveParam().get("data")
data?.let {
@@ -408,6 +413,10 @@ class AddPetActivity : CKBaseActivity() {
}).show()
}
companion object {
private const val REQUEST_CAMERA_PERMISSION = 1201
}
fun uploadImage(path: String) {

View File

@@ -27,6 +27,8 @@ class SettingActivity : CKBaseActivity(), View.OnClickListener {
}
override fun initView() {
binding.btnLogout.visibility = if (CKApp.app.isUserLoggedIn) View.VISIBLE else View.GONE
binding.contentLoginPassword.setOnClickListener(this)
binding.contentPaymentPassword.setOnClickListener(this)
binding.contentAboutUs.setOnClickListener(this)
@@ -44,9 +46,11 @@ class SettingActivity : CKBaseActivity(), View.OnClickListener {
when (v?.id){
R.id.contentLoginPassword->{
if (!requireLogin()) return
toActivity(PasswordManagerActivity::class.java, DataCollection())
}
R.id.contentPaymentPassword->{
if (!requireLogin()) return
toActivity(PayPasswordManagerActivity::class.java, DataCollection())
}
@@ -60,10 +64,12 @@ class SettingActivity : CKBaseActivity(), View.OnClickListener {
toActivity(AgreementActivity::class.java, DataCollection().apply { add(Data("title","隐私协议")) })
}
R.id.contentShippingAddress->{
if (!requireLogin()) return
toActivity(AddressActivity::class.java, DataCollection().apply { add(Data("flag","1"))
})
}
R.id.contentCancellation->{
if (!requireLogin()) return
toActivity(AccountCancellationActivity::class.java, DataCollection())
}
R.id.btnLogout->{
@@ -80,4 +86,10 @@ class SettingActivity : CKBaseActivity(), View.OnClickListener {
}
}
}
private fun requireLogin(): Boolean {
if (CKApp.app.isUserLoggedIn) return true
toActivity(LoginActivity::class.java, DataCollection())
return false
}
}

View File

@@ -13,6 +13,7 @@ import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.bumptech.glide.load.resource.bitmap.RoundedCorners
import com.bumptech.glide.request.RequestOptions
import com.ck.ckcollar.app.CKApp
import com.ck.ckcollar.app.R
import com.ck.ckcollar.app.action.ActionCode
import com.ck.ckcollar.app.databinding.ActivityProductDetailsBinding
@@ -23,6 +24,7 @@ import com.ck.ckcollar.app.ui.act.customer.PeopleCustomerActivity
import com.ck.ckcollar.app.ui.act.customer.ShopCustomerActivity
import com.ck.ckcollar.app.ui.act.home.fragment.HomeFragment
import com.ck.ckcollar.app.ui.act.home.fragment.HomeFragment.ImageAdapter
import com.ck.ckcollar.app.ui.act.login.LoginActivity
import com.ck.ckcollar.app.ui.act.petmanager.ImageViewActivity
import com.ck.ckcollar.app.ui.base.CKBaseActivity
import com.ck.ckcollar.app.ui.base.CKLHBaseActionBarActivity
@@ -63,20 +65,30 @@ class ProductDetailsActivity : CKBaseActivity() {
setupWebView(binding.textContent)
binding.btnAddCar.setOnClickListener {
if (!requireLogin()) return@setOnClickListener
showProductTypeFragment()
}
binding.btnBuyNow.setOnClickListener {
if (!requireLogin()) return@setOnClickListener
showProductTypeFragment()
}
binding.contentShopCar.setOnClickListener {
if (!requireLogin()) return@setOnClickListener
toActivity(ShopCarActivity::class.java, DataCollection())
}
binding.contentCustomer.setOnClickListener {
if (!requireLogin()) return@setOnClickListener
toActivity(PeopleCustomerActivity::class.java, DataCollection().apply { add(Data("chatType","1")) })
}
}
private fun requireLogin(): Boolean {
if (CKApp.app.isUserLoggedIn) return true
toActivity(LoginActivity::class.java, DataCollection())
return false
}
override fun initData() {
model = Gson().fromJson<ShopProductModel.ProductModel>(getReceiveParam().get("data")!!.stringValue,
ShopProductModel.ProductModel::class.java)
@@ -313,4 +325,4 @@ class ProductDetailsActivity : CKBaseActivity() {
// 使用 loadDataWithBaseURL 加载
webView.loadDataWithBaseURL(null, styledHtml, "text/html", "UTF-8", null)
}
}
}

View File

@@ -33,6 +33,8 @@ import com.tt.kit.model.DataCollection
import com.tt.kit.utils.KeyboardUtils
class TypeActivity : CKLHBaseActionBarActivity() {
override val shouldRequestPermissionsOnCreate: Boolean = false
lateinit var binding: ActivityShopTypeBinding
lateinit var productAdapter: ProductAdapter
@@ -172,4 +174,4 @@ class TypeActivity : CKLHBaseActionBarActivity() {
}
}
}
}

View File

@@ -7,7 +7,6 @@ import android.os.Message
import com.ck.ckcollar.app.CKApp
import com.ck.ckcollar.app.databinding.ActivityIndexBinding
import com.ck.ckcollar.app.ui.act.home.MainActivity
import com.ck.ckcollar.app.ui.act.login.LoginActivity
import com.ck.ckcollar.app.ui.base.CKBaseActivity
import com.ck.ckcollar.app.utils.Const
import com.cyclone.shadowsocks.utils.PreferencesUtils
@@ -29,7 +28,7 @@ class IndexActivity : CKBaseActivity() {
if (isFirst){
toActivity(WelcomeActivity::class.java, DataCollection())
}else{
toActivity(LoginActivity::class.java, DataCollection())
toActivity(MainActivity::class.java, DataCollection())
}
}else{
toActivity(MainActivity::class.java, DataCollection())

View File

@@ -9,7 +9,7 @@ import androidx.viewpager.widget.PagerAdapter
import com.ck.ckcollar.app.R
import com.ck.ckcollar.app.databinding.ActivityWelcomeBinding
import com.ck.ckcollar.app.databinding.LayoutItemWelcomeBinding
import com.ck.ckcollar.app.ui.act.login.LoginActivity
import com.ck.ckcollar.app.ui.act.home.MainActivity
import com.ck.ckcollar.app.ui.base.CKBaseActivity
import com.ck.ckcollar.app.utils.Const
import com.cyclone.shadowsocks.utils.PreferencesUtils
@@ -64,7 +64,7 @@ class WelcomeActivity : CKBaseActivity() {
// }else{
// toActivity(LoginActivity::class.java, DataCollection())
// }
toActivity(LoginActivity::class.java, DataCollection())
toActivity(MainActivity::class.java, DataCollection())
finish()
}
@@ -98,4 +98,4 @@ class WelcomeActivity : CKBaseActivity() {
PreferencesUtils.putBoolean(this, Const.FIRST, false)
}
}
}

View File

@@ -28,6 +28,8 @@ import pub.devrel.easypermissions.EasyPermissions
open class CKLHBaseActionBarActivity : TTBaseActivity(){
protected open val shouldRequestPermissionsOnCreate: Boolean = true
var perms_= listOf<String>(Manifest.permission.CAMERA, Manifest.permission.READ_MEDIA_IMAGES,Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE)
var perms_tiramisu = listOf<String>(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE)
@@ -83,7 +85,7 @@ open class CKLHBaseActionBarActivity : TTBaseActivity(){
// insets
// }
if (!checkPermissions()){
if (shouldRequestPermissionsOnCreate && !checkPermissions()){
requstPermissions()
}
@@ -202,4 +204,4 @@ open class CKLHBaseActionBarActivity : TTBaseActivity(){
// insets
// }
}
}
}

View File

@@ -2,4 +2,5 @@ package com.ck.ckcollar.app.utils.networkone
interface ICallback {
fun onSuccess(data: String)
fun onFailed(code: String, msg: String)
fun onComplete() {}
}

View File

@@ -429,10 +429,12 @@ object TTHttpClient {
}
withContext(Dispatchers.Main) {
iCallback.onFailed("500", "网络连接失败,请检查网络")
iCallback.onComplete()
}
}catch (e: Exception){
withContext(Dispatchers.Main) {
iCallback.onFailed("500", e.message.orEmpty())
}
}
}
@@ -988,4 +990,4 @@ private fun getMessage(data: JSONObject): String {
return ""
}
}
}
}

View File

@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<com.ck.ckcollar.app.widget.CKLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
@@ -7,12 +8,12 @@
android:background="@color/backgroundColor"
>
<include layout="@layout/action_bar"></include>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
></androidx.recyclerview.widget.RecyclerView>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
></androidx.recyclerview.widget.RecyclerView>
<com.ck.ckcollar.app.widget.CKLinearLayout
android:layout_width="match_parent"
@@ -20,7 +21,6 @@
android:orientation="horizontal"
android:background="@color/white"
android:gravity="center_vertical"
android:paddingHorizontal="20dp"
>
<com.ck.ckcollar.app.widget.CKImageView
android:id="@+id/btnKeyboard"
@@ -30,39 +30,86 @@
android:visibility="gone"
></com.ck.ckcollar.app.widget.CKImageView>
<com.ck.ckcollar.app.widget.CKEditView
android:id="@+id/editMessage"
android:layout_width="match_parent"
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:minHeight="34dp"
android:layout_weight="1"
android:textColor="@color/textColor"
android:textSize="14sp"
android:textColorHint="@color/textColor"
android:hint="@string/please_input_message"
android:paddingHorizontal="16dp"
android:paddingVertical="5dp"
android:layout_marginVertical="10dp"
android:layout_marginHorizontal="12dp"
android:background="@drawable/bg_input_message"
android:imeOptions="actionSend"
android:inputType="text"
android:maxLength="100"
></com.ck.ckcollar.app.widget.CKEditView>
<com.ck.ckcollar.app.widget.CKImageView
android:id="@+id/btnSmile"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/image_smile"
></com.ck.ckcollar.app.widget.CKImageView>
android:orientation="vertical">
<com.ck.ckcollar.app.widget.CKImageView
android:id="@+id/btnMore"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/image_more"
android:layout_marginLeft="12dp"
></com.ck.ckcollar.app.widget.CKImageView>
<FrameLayout
android:id="@+id/contentImagePreview"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_marginStart="12dp"
android:layout_marginTop="8dp"
android:visibility="gone">
<com.ck.ckcollar.app.widget.CKRoundImageView
android:id="@+id/imagePreview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
app:roundRadius="6dp" />
<ImageView
android:id="@+id/btnDeleteImage"
android:layout_width="18dp"
android:layout_height="18dp"
android:layout_gravity="end|top"
android:layout_margin="4dp"
android:contentDescription="@null"
android:src="@mipmap/icon_img_del_red" />
</FrameLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_vertical">
<com.ck.ckcollar.app.widget.CKEditView
android:id="@+id/editMessage"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:minHeight="34dp"
android:textColor="@color/textColor"
android:textSize="14sp"
android:textColorHint="@color/textColor"
android:hint="@string/please_input_message"
android:paddingHorizontal="16dp"
android:paddingVertical="5dp"
android:layout_marginVertical="10dp"
android:layout_marginHorizontal="12dp"
android:background="@drawable/bg_input_message"
android:imeOptions="actionSend"
android:inputType="text"
android:maxLength="100" />
<com.ck.ckcollar.app.widget.CKImageView
android:id="@+id/btnSmile"
android:layout_width="24dp"
android:layout_height="24dp"
android:src="@mipmap/image_smile"
android:visibility="visible"/>
<com.ck.ckcollar.app.widget.CKImageView
android:id="@+id/btnMore"
android:layout_width="24dp"
android:layout_height="24dp"
android:src="@mipmap/image_more"
android:layout_marginLeft="12dp"
android:layout_marginRight="15dp"/>
<com.ck.ckcollar.app.widget.CKImageView
android:id="@+id/btnSend"
android:layout_width="24dp"
android:layout_height="24dp"
android:src="@mipmap/icon_send_yellow"
android:layout_marginLeft="12dp"
android:layout_marginRight="15dp"
android:visibility="gone"/>
</LinearLayout>
</LinearLayout>
</com.ck.ckcollar.app.widget.CKLinearLayout>
<com.ck.ckcollar.app.widget.CKLinearLayout
@@ -125,4 +172,4 @@
</com.ck.ckcollar.app.widget.CKLinearLayout>
</com.ck.ckcollar.app.widget.CKLinearLayout>
</com.ck.ckcollar.app.widget.CKLinearLayout>
</com.ck.ckcollar.app.widget.CKLinearLayout>

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

View File

@@ -1,4 +1,5 @@
<resources>
<string name="guest">游客</string>
<string name="app_name">宠盾</string>