diff --git a/app/src/main/java/com/chwl/app/avroom/fragment/BaseRoomFragment.kt b/app/src/main/java/com/chwl/app/avroom/fragment/BaseRoomFragment.kt index 0dcfc1c91..5babf9d87 100644 --- a/app/src/main/java/com/chwl/app/avroom/fragment/BaseRoomFragment.kt +++ b/app/src/main/java/com/chwl/app/avroom/fragment/BaseRoomFragment.kt @@ -222,7 +222,7 @@ open class BaseRoomFragment?> : publicChatMessageWidget = PublicChatRoomMessageWidget(requireContext()) val tabList: MutableList = java.util.ArrayList(2) tabList.add(getString(R.string.room)) - tabList.add(getString(R.string.public_chat)) + tabList.add(getString(R.string.public_chat_room)) val messagePager = mView.findViewById(R.id.message_pager) val messageIndicator = mView.findViewById(R.id.message_indicator) messagePager.offscreenPageLimit = tabList.size diff --git a/app/src/main/java/com/chwl/app/home/HomeMessageViewModel.kt b/app/src/main/java/com/chwl/app/home/HomeMessageViewModel.kt new file mode 100644 index 000000000..4064c3909 --- /dev/null +++ b/app/src/main/java/com/chwl/app/home/HomeMessageViewModel.kt @@ -0,0 +1,20 @@ +package com.chwl.app.home + +import androidx.lifecycle.MutableLiveData +import com.chwl.app.base.BaseViewModel +import com.chwl.core.bean.response.BeanResult +import com.chwl.core.public_chat_hall.bean.PublicChatMessageBean +import com.chwl.core.public_chat_hall.model.PublicChatModel + +class HomeMessageViewModel : BaseViewModel() { + val topPublicChatMessageLiveData = MutableLiveData>>() + + fun getTopPublicChatMessage() { + safeLaunch(needLoading = false, onError = { + topPublicChatMessageLiveData.postValue(BeanResult.failed(it)) + }) { + val value = PublicChatModel.getTopMessage() + topPublicChatMessageLiveData.postValue(BeanResult.success(value ?: emptyList())) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/chwl/app/home/adapter/PublicChatLaneAdapter.kt b/app/src/main/java/com/chwl/app/home/adapter/PublicChatLaneAdapter.kt new file mode 100644 index 000000000..1edd4860e --- /dev/null +++ b/app/src/main/java/com/chwl/app/home/adapter/PublicChatLaneAdapter.kt @@ -0,0 +1,48 @@ +package com.chwl.app.home.adapter + +import android.view.LayoutInflater +import android.view.ViewGroup +import android.widget.ImageView +import androidx.recyclerview.widget.RecyclerView +import com.chad.library.adapter.base.BaseViewHolder +import com.chwl.app.R +import com.chwl.app.ui.utils.loadAvatar +import com.chwl.core.public_chat_hall.bean.PublicChatMessageBean + +class PublicChatLaneAdapter(private val data: MutableList) : + RecyclerView.Adapter() { + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder { + return BaseViewHolder( + LayoutInflater.from(parent.context).inflate(R.layout.public_chat_lane_item, null) + ) + } + + override fun onBindViewHolder(holder: BaseViewHolder, position: Int) { + val item = getItem(position) + holder.setText(R.id.tv_message, item?.content ?: "") + val avatarView = holder.getView(R.id.iv_avatar) + avatarView.loadAvatar(item?.fromAvatar ?: "") + } + + override fun getItemCount(): Int { + return Int.MAX_VALUE + } + + fun getRealItemCount(): Int { + return data.size + } + + fun setNewData(list: List) { + data.clear() + data.addAll(list) + notifyDataSetChanged() + } + + private fun getItem(position: Int): PublicChatMessageBean? { + if (data.isEmpty()) { + return null + } + return data[position % data.size] + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/chwl/app/home/fragment/ContactsListFragment.kt b/app/src/main/java/com/chwl/app/home/fragment/ContactsListFragment.kt index 8af265a22..6c6bfbc7b 100644 --- a/app/src/main/java/com/chwl/app/home/fragment/ContactsListFragment.kt +++ b/app/src/main/java/com/chwl/app/home/fragment/ContactsListFragment.kt @@ -1,35 +1,44 @@ package com.chwl.app.home.fragment +import android.view.GestureDetector +import android.view.MotionEvent import android.widget.LinearLayout import android.widget.TextView +import androidx.core.view.GestureDetectorCompat +import androidx.core.view.isVisible import androidx.fragment.app.Fragment -import androidx.viewpager.widget.ViewPager.OnPageChangeListener +import androidx.fragment.app.activityViewModels +import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.StaggeredGridLayoutManager import androidx.viewpager2.widget.ViewPager2 -import com.netease.nimlib.sdk.NIMClient -import com.netease.nimlib.sdk.msg.MsgService +import com.chwl.app.MainTabContentView import com.chwl.app.R import com.chwl.app.avroom.adapter.CommonVPAdapter import com.chwl.app.base.BaseViewBindingFragment -import com.chwl.app.common.widget.dialog.DialogManager.AbsOkDialogListener import com.chwl.app.databinding.FragmentContactListBinding -import com.chwl.app.home.event.ContactTrashEvent +import com.chwl.app.home.HomeMessageViewModel +import com.chwl.app.home.adapter.PublicChatLaneAdapter +import com.chwl.app.home.helper.AutoScrollTask +import com.chwl.app.public_chat.ui.message.PublicChatRoomMessageActivity import com.chwl.app.ui.im.friend.FriendListFragment import com.chwl.app.ui.im.recent.RecentListFragment import com.chwl.app.ui.relation.FansListFragment import com.chwl.app.ui.user.adapter.UserInfoIndicatorAdapter -import com.chwl.app.ui.user.adapter.UserInfoPagerAdapter -import com.chwl.app.ui.widget.magicindicator.ViewPagerHelper import com.chwl.app.ui.widget.magicindicator.buildins.commonnavigator.CommonNavigator import com.chwl.core.Constants -import com.chwl.library.utils.ResUtil -import org.greenrobot.eventbus.EventBus +import com.example.lib_utils.UiUtils +import com.example.lib_utils.ktx.singleClick /** * @author jack * @Description * @Date 2018/11/1 */ -class ContactsListFragment : BaseViewBindingFragment() { +class ContactsListFragment : BaseViewBindingFragment(), + MainTabContentView { + + private val viewModel: HomeMessageViewModel by activityViewModels() + private val publicChatAdapter = PublicChatLaneAdapter(ArrayList()) companion object { const val TAG = "ContactsListFragment" @@ -40,8 +49,21 @@ class ContactsListFragment : BaseViewBindingFragment } } + private var isRTL = false + + private val autoScrollTask = AutoScrollTask(15) { + val x = if (isRTL) { + -2 + } else { + 2 + } + binding.recyclerViewPublicChat.scrollBy(x, 0) + } + override fun init() { + isRTL = UiUtils.isRtl(requireContext()) initViewPager() + initPublicChatView() } private fun initViewPager() { @@ -93,4 +115,85 @@ class ContactsListFragment : BaseViewBindingFragment }) } + private fun initPublicChatView() { + val gestureDetectorCompat = GestureDetectorCompat(requireContext(), object : + GestureDetector.OnGestureListener { + override fun onDown(e: MotionEvent): Boolean { + return true + } + + override fun onShowPress(e: MotionEvent) { + } + + override fun onSingleTapUp(e: MotionEvent): Boolean { + PublicChatRoomMessageActivity.start(requireContext()) + return true + } + + override fun onScroll( + e1: MotionEvent, + e2: MotionEvent, + distanceX: Float, + distanceY: Float + ): Boolean { + return true + } + + override fun onLongPress(e: MotionEvent) { + } + + override fun onFling( + e1: MotionEvent, + e2: MotionEvent, + velocityX: Float, + velocityY: Float + ): Boolean { + return true + } + }) + binding.layoutPublicChat.singleClick { + PublicChatRoomMessageActivity.start(requireContext()) + } + binding.recyclerViewPublicChat.setOnTouchListener { v, event -> + gestureDetectorCompat.onTouchEvent(event) + } + binding.recyclerViewPublicChat.layoutManager = + StaggeredGridLayoutManager(2, RecyclerView.HORIZONTAL) + binding.recyclerViewPublicChat.adapter = publicChatAdapter + viewModel.topPublicChatMessageLiveData.observe(this) { + val newList = it.data + if (it.isSuccess && !newList.isNullOrEmpty()) { + publicChatAdapter.setNewData(newList) + switchPublicChatMessageScrollState(true) + } + binding.layoutPublicChat.isVisible = (publicChatAdapter.getRealItemCount() > 0) + } + } + + private fun refreshPublicChatMessage() { + viewModel.getTopPublicChatMessage() + } + + override fun onStart() { + super.onStart() + onVisibleStateChanged(true) + refreshPublicChatMessage() + } + + override fun onStop() { + super.onStop() + onVisibleStateChanged(false) + } + + override fun onVisibleStateChanged(showOrHide: Boolean) { + switchPublicChatMessageScrollState(showOrHide) + } + + private fun switchPublicChatMessageScrollState(showOrHide: Boolean) { + if (showOrHide && publicChatAdapter.getRealItemCount() > 0) { + autoScrollTask.start() + } else { + autoScrollTask.stop() + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/chwl/app/home/helper/AutoScrollTask.kt b/app/src/main/java/com/chwl/app/home/helper/AutoScrollTask.kt new file mode 100644 index 000000000..bed2ab5f5 --- /dev/null +++ b/app/src/main/java/com/chwl/app/home/helper/AutoScrollTask.kt @@ -0,0 +1,23 @@ +package com.chwl.app.home.helper + +import android.os.Handler +import android.os.Looper + +class AutoScrollTask(val timeInterval: Long, call: () -> Unit) { + private val handler = Handler(Looper.getMainLooper()) + private val autoRunnable = object : Runnable { + override fun run() { + call.invoke() + handler.postDelayed(this, timeInterval) + } + } + + fun start() { + handler.removeCallbacks(autoRunnable) + handler.postDelayed(autoRunnable, 0) + } + + fun stop() { + handler.removeCallbacks(autoRunnable) + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-xxhdpi/public_chat_bg_lane.webp b/app/src/main/res/drawable-xxhdpi/public_chat_bg_lane.webp new file mode 100644 index 000000000..35bbdd766 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/public_chat_bg_lane.webp differ diff --git a/app/src/main/res/layout/fragment_contact_list.xml b/app/src/main/res/layout/fragment_contact_list.xml index 747c0f9fd..4d4a9571e 100644 --- a/app/src/main/res/layout/fragment_contact_list.xml +++ b/app/src/main/res/layout/fragment_contact_list.xml @@ -3,7 +3,8 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/color_F7F7F7"> + android:background="@color/color_F7F7F7" + xmlns:tools="http://schemas.android.com/tools"> + + + + + + + + + + + + + + app:layout_constraintTop_toBottomOf="@id/layout_public_chat" + app:layout_goneMarginTop="@dimen/dp_44"> + + + + + + \ No newline at end of file diff --git a/app/src/module_public_chat/java/com/chwl/app/public_chat/ui/message/PublicChatRoomMessageActivity.kt b/app/src/module_public_chat/java/com/chwl/app/public_chat/ui/message/PublicChatRoomMessageActivity.kt index 4b1461d2e..94fc7548d 100644 --- a/app/src/module_public_chat/java/com/chwl/app/public_chat/ui/message/PublicChatRoomMessageActivity.kt +++ b/app/src/module_public_chat/java/com/chwl/app/public_chat/ui/message/PublicChatRoomMessageActivity.kt @@ -50,7 +50,7 @@ class PublicChatRoomMessageActivity : BaseBindingActivity - 公聊廳 + 公聊廳 我要上頭條~ 獲取公聊廳信息失敗 %s 上頭條 diff --git a/app/src/module_public_chat/res/values-zh-rTW/strings.xml b/app/src/module_public_chat/res/values-zh-rTW/strings.xml index 2474bb9e1..6decd42eb 100644 --- a/app/src/module_public_chat/res/values-zh-rTW/strings.xml +++ b/app/src/module_public_chat/res/values-zh-rTW/strings.xml @@ -1,7 +1,7 @@ - 公聊廳 + 公聊廳 我要上頭條~ 獲取公聊廳信息失敗 %s 上頭條 diff --git a/app/src/module_public_chat/res/values/strings.xml b/app/src/module_public_chat/res/values/strings.xml index fd4f3475a..2aba88dcc 100644 --- a/app/src/module_public_chat/res/values/strings.xml +++ b/app/src/module_public_chat/res/values/strings.xml @@ -1,6 +1,6 @@ - 公聊廳 + 公聊廳 我要上頭條~ 獲取公聊廳信息失敗 %s 上頭條 diff --git a/core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/bean/HeadlineBean.kt b/core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/bean/HeadlineBean.kt index eaec7ec00..5ed6e19c3 100644 --- a/core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/bean/HeadlineBean.kt +++ b/core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/bean/HeadlineBean.kt @@ -1,9 +1,10 @@ package com.chwl.core.public_chat_hall.bean import androidx.annotation.Keep +import java.io.Serializable @Keep -class HeadlineBean { +class HeadlineBean : Serializable { val content: String? = null val id: Long? = null val uid: Long? = null diff --git a/core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/bean/PublicChatMessageBean.kt b/core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/bean/PublicChatMessageBean.kt new file mode 100644 index 000000000..1202800bd --- /dev/null +++ b/core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/bean/PublicChatMessageBean.kt @@ -0,0 +1,10 @@ +package com.chwl.core.public_chat_hall.bean + +import androidx.annotation.Keep + +@Keep +class PublicChatMessageBean { + val content: String? = null + val fromAvatar: String? = null + val fromNick: String? = null +} \ No newline at end of file diff --git a/core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/model/PublicChatModel.kt b/core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/model/PublicChatModel.kt index 6c083aed3..bf4021674 100644 --- a/core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/model/PublicChatModel.kt +++ b/core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/model/PublicChatModel.kt @@ -3,6 +3,7 @@ package com.chwl.core.public_chat_hall.model import com.chwl.core.base.BaseModel import com.chwl.core.bean.response.ServiceResult import com.chwl.core.public_chat_hall.bean.HeadlineBean +import com.chwl.core.public_chat_hall.bean.PublicChatMessageBean import com.chwl.core.utils.net.launchRequest import com.chwl.core.vip.bean.VipPageInfo import com.chwl.library.net.rxnet.RxNet @@ -14,6 +15,11 @@ import retrofit2.http.POST object PublicChatModel : BaseModel() { private val api = RxNet.create(PublicChatModel.Api::class.java) + suspend fun getTopMessage(): List? = + launchRequest { + api.getTopMessage() + } + suspend fun getCurrentHeadline(): HeadlineBean? = launchRequest { api.getCurrentHeadline() @@ -31,6 +37,12 @@ object PublicChatModel : BaseModel() { interface Api { + /** + * 获取前几条数据 + */ + @GET("publicChatTopRecord/getChatForTop50") + suspend fun getTopMessage(): ServiceResult> + /** * 获取头条 */