From 7a20fe44b78799b41d7199d06a16886dbed95d6d Mon Sep 17 00:00:00 2001 From: wangxiang <1827945911@qq.com> Date: Wed, 10 Jan 2024 15:21:22 +0800 Subject: [PATCH] 111 --- .../kanglai/push/constant/CommonConstant.java | 2 + .../kanglai/push/entity/LocalPushChatMsg.java | 2 +- .../push/ui/activity/InstantActivity.java | 38 ++-- .../push/ui/fragment/MessageFragment.java | 49 +++-- .../kanglai/push/ui/vm/InstantViewModel.java | 172 +++++------------- 5 files changed, 101 insertions(+), 162 deletions(-) diff --git a/app/src/main/java/com/kanglai/push/constant/CommonConstant.java b/app/src/main/java/com/kanglai/push/constant/CommonConstant.java index c79bc8c..0b0fdb0 100644 --- a/app/src/main/java/com/kanglai/push/constant/CommonConstant.java +++ b/app/src/main/java/com/kanglai/push/constant/CommonConstant.java @@ -37,4 +37,6 @@ public interface CommonConstant { /** app 端登录用户类型 */ String ID_ENTITY_PROVIDER = "app"; + String INSTANT_LAUNCHER_RESULT_KEY = "INSTANT_LAUNCHER_RESULT_KEY"; + } diff --git a/app/src/main/java/com/kanglai/push/entity/LocalPushChatMsg.java b/app/src/main/java/com/kanglai/push/entity/LocalPushChatMsg.java index a053c3f..62b97ae 100644 --- a/app/src/main/java/com/kanglai/push/entity/LocalPushChatMsg.java +++ b/app/src/main/java/com/kanglai/push/entity/LocalPushChatMsg.java @@ -32,7 +32,7 @@ public class LocalPushChatMsg implements Parcelable { /** 关注状态 1-从关注列表进入聊天室*/ public String focusType; /** 当前消息是否已读 0已读1未读*/ - public String isRead; + public String isRead = "0"; public Boolean pinned = false; // 偏移量 public LocalPushChatMsg(){} diff --git a/app/src/main/java/com/kanglai/push/ui/activity/InstantActivity.java b/app/src/main/java/com/kanglai/push/ui/activity/InstantActivity.java index a99e7db..b519b0f 100644 --- a/app/src/main/java/com/kanglai/push/ui/activity/InstantActivity.java +++ b/app/src/main/java/com/kanglai/push/ui/activity/InstantActivity.java @@ -1,45 +1,37 @@ package com.kanglai.push.ui.activity; import android.content.Context; +import android.content.Intent; import android.icu.text.SimpleDateFormat; import android.icu.util.Calendar; import android.os.Bundle; import android.text.InputFilter; -import android.text.TextUtils; import android.view.View; import android.view.inputmethod.InputMethodManager; import android.widget.EditText; import android.widget.GridLayout; import android.widget.ImageView; import android.widget.LinearLayout; -import android.widget.TextView; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; -import com.blankj.utilcode.util.CacheDiskUtils; -import com.blankj.utilcode.util.StringUtils; import com.dolphin.core.base.BaseActivity; import com.dolphin.core.bus.RxBus; import com.dolphin.core.bus.RxSubscriptions; import com.dolphin.core.util.RxUtil; -import com.google.gson.Gson; import com.kanglai.push.BR; import com.kanglai.push.R; -import com.kanglai.push.constant.CacheConstant; +import com.kanglai.push.constant.CommonConstant; import com.kanglai.push.databinding.ActivityInstantBinding; import com.kanglai.push.entity.LocalPushChatMsg; import com.kanglai.push.entity.PushChatMessage; -import com.kanglai.push.entity.User; import com.kanglai.push.ui.adapter.SoloChatRoomAdapter; import com.kanglai.push.ui.vm.InstantViewModel; import com.kanglai.push.util.ViewFilterUtil; import com.scwang.smart.refresh.layout.api.RefreshLayout; -import org.json.JSONObject; - import java.util.ArrayList; -import java.util.List; import java.util.Locale; import java.util.Objects; @@ -92,9 +84,8 @@ public class InstantActivity extends BaseActivity changBottomType()); bottom_grid = findViewById(R.id.instant_grid); layout_footer = findViewById(R.id.layout_footer); - - localPushChatMsg= getIntent().getParcelableExtra("GOING_TO_INSTANT"); - if (localPushChatMsg instanceof LocalPushChatMsg) { + localPushChatMsg = getIntent().getParcelableExtra(CommonConstant.INSTANT_LAUNCHER_RESULT_KEY); + if (localPushChatMsg != null) { mViewModel.adverseData = localPushChatMsg; mViewModel.init(); judgeViewType(localPushChatMsg); @@ -113,14 +104,12 @@ public class InstantActivity extends BaseActivity requestList) { final SoloChatRoomAdapter soloChatRoomAdapter = new SoloChatRoomAdapter(requestList, localPushChatMsg); mAdapter = soloChatRoomAdapter; @@ -139,6 +128,20 @@ public class InstantActivity extends BaseActivity instantLauncherResult; @Override public int setContentView(LayoutInflater inflater, @Nullable ViewGroup parentContainer, @Nullable Bundle savedInstanceState) { @@ -74,7 +79,7 @@ public class MessageFragment extends BaseFragment() { + @Override + public LocalPushChatMsg parseResult(int resultCode, @Nullable Intent intent) { + if (intent == null) { + return null; + } + return intent.getParcelableExtra(CommonConstant.INSTANT_LAUNCHER_RESULT_KEY); + } + @NonNull + @Override + public Intent createIntent(@NonNull Context context, LocalPushChatMsg localPushChatMsg) { + Intent intent = new Intent(getActivity(), InstantActivity.class); + intent.putExtra(CommonConstant.INSTANT_LAUNCHER_RESULT_KEY, localPushChatMsg); + return intent; + } + }, result -> { + if (result !=null) { + mViewModel.judgeNewPushMsgs(result.getId(), result.getLastContent()); + } + }); } @Override @@ -128,14 +153,12 @@ public class MessageFragment extends BaseFragment list = mAdapter.getData(); list.get(position).setIsRead("0"); list.get(position).setPinned(false); diff --git a/app/src/main/java/com/kanglai/push/ui/vm/InstantViewModel.java b/app/src/main/java/com/kanglai/push/ui/vm/InstantViewModel.java index c52411f..a226d2a 100644 --- a/app/src/main/java/com/kanglai/push/ui/vm/InstantViewModel.java +++ b/app/src/main/java/com/kanglai/push/ui/vm/InstantViewModel.java @@ -1,6 +1,10 @@ package com.kanglai.push.ui.vm; +import android.app.Activity; import android.app.Application; +import android.content.Intent; +import android.icu.text.SimpleDateFormat; +import android.icu.util.Calendar; import android.os.Handler; import android.os.Looper; import android.util.Pair; @@ -22,6 +26,7 @@ import com.dolphin.core.util.RxUtil; import com.dolphin.core.util.ToastUtil; import com.kanglai.push.app.AppApplication; import com.kanglai.push.constant.CacheConstant; +import com.kanglai.push.constant.CommonConstant; import com.kanglai.push.di.component.DaggerServiceComponent; import com.kanglai.push.entity.LocalPushChatMsg; import com.kanglai.push.entity.MsgVo; @@ -30,10 +35,12 @@ import com.kanglai.push.entity.User; import com.kanglai.push.service.PushService; import com.kanglai.push.ui.activity.InstantActivity; import com.kanglai.push.util.LocalPushChatMsgUtil; +import com.luck.picture.lib.config.PictureConfig; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Locale; import java.util.Map; import javax.inject.Inject; @@ -56,11 +63,7 @@ public class InstantViewModel extends ToolbarViewModel{ public int current = 1; - public Boolean isNew = false; // 是否接收到新消息 - - public Boolean sendBtnType = true; // 发送按钮状态事件 - - public String cursor = ""; // 记录游标 + public String cursor = ""; public ArrayList localPushChatMsgs; // 本地缓存的列表数据 @@ -79,7 +82,7 @@ public class InstantViewModel extends ToolbarViewModel{ public void onCreate(@NonNull LifecycleOwner owner) { super.onCreate(owner); super.setRightIconVisible(View.VISIBLE); - localPushChatMsgs = LocalPushChatMsgUtil.getLocalData(); // 获取本地缓存的历史记录 + localPushChatMsgs = LocalPushChatMsgUtil.getLocalData(); } @Override protected void rightIconOnClick() { @@ -106,20 +109,12 @@ public class InstantViewModel extends ToolbarViewModel{ ToastUtil.showBottom("定时任务"); }); - /** - * 输入框发送消息 - * text - 内容、tit - 标题、alias-接收方id、userId-发送方id - * 禁止重复多次点击 - 只有当新消息完全加载完成之后才能 再一次发送 - */ public BindingCommand sendMsgClickCommand = new BindingCommand(() ->{ - if (!sendBtnType) return; String msg = String.valueOf(mActivity.input_box.getText()); if (StringUtils.isTrimEmpty(msg)) { ToastUtil.show("不能发送空白信息"); return; } - if (isNew) isNew = false; // 防止请求失败也更新了最新的缓存数据 - if (sendBtnType) sendBtnType = false; // 防止新消息加载出来前用户的重复点击 PushChatMessage chatMessage = new PushChatMessage(); if ("1".equals(adverseData.getFocusType())) chatMessage.setConcernFanStatus("1"); // 从关注列表中进入聊天页界面则需要做特殊处理 chatMessage.setText(msg); @@ -128,35 +123,42 @@ public class InstantViewModel extends ToolbarViewModel{ chatMessage.setAlias(adverseData.getId()); chatMessage.setUserId(user.getId()); pushService.concernFanSend(chatMessage) - .compose(RxUtil.schedulersTransformer()) - .compose(RxUtil.exceptionTransformer()) - .doOnSubscribe(this) - .subscribe(new DisposableObserver() { - @Override - public void onNext(ResultResponse R) { - if (R.getCode() == R.SUCCESS) { - mActivity.input_box.setText(""); - isNew = true; // 发送了新的消息 需要更新到本地缓存中 - loadNewDate(); // 加载最新的一条数据 - } else ToastUtil.showTop(R.getMsg()); - } - - @Override - public void onError(Throwable e) { - if ("1".equals(adverseData.getFocusType())) { - ToastUtil.show("对方还未关注你,你只能发送一条消息,发送失败"); - }else ExceptionHandle.baseExceptionMsg(e); - sendBtnType = true; - } - - @Override - public void onComplete() { - mActivity.hideKeyboard(); // 发送成功之后隐藏键盘 - } - }); + .compose(RxUtil.schedulersTransformer()) + .compose(RxUtil.exceptionTransformer()) + .doOnSubscribe(this) + .subscribe(new DisposableObserver() { + @Override + public void onNext(ResultResponse R) { + if (R.getCode() == R.SUCCESS) { + mActivity.input_box.setText(""); + PushChatMessage chatMessage = new PushChatMessage(); + chatMessage.setUserId(user.getId()); + chatMessage.setText(msg); + Calendar calendar = Calendar.getInstance(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()); + String currentTime = sdf.format(calendar.getTime()); + chatMessage.setCreateTime(currentTime); + mActivity.mAdapter.append(chatMessage); + mActivity.setActivitieResult(); + + } else ToastUtil.showTop(R.getMsg()); + } + + @Override + public void onError(Throwable e) { + if ("1".equals(adverseData.getFocusType())) { + ToastUtil.show("对方还未关注你,你只能发送一条消息,发送失败"); + }else ExceptionHandle.baseExceptionMsg(e); + } + + @Override + public void onComplete() { + mActivity.hideKeyboard(); + mActivity.mRecyclerView.scrollToPosition(mActivity.mAdapter.getItemCount()-1); + } + }); }); - /** 进入聊天页 初始化数据 */ public void init() { pushService.listFriendHistoryMessage( MapUtils.newHashMap( @@ -196,56 +198,6 @@ public class InstantViewModel extends ToolbarViewModel{ }); } - /** 加载最新的一条数据 */ - public void loadNewDate() { - pushService.listFriendHistoryMessage( - MapUtils.newHashMap( - Pair.create("size", 1), - Pair.create("cursor", ""), - Pair.create("current", 1), - Pair.create("alias", adverseData.getId()), - Pair.create("userId", user.getId()) - )) - .compose(RxUtil.schedulersTransformer()) - .compose(RxUtil.exceptionTransformer()) - .doOnSubscribe(this) - .subscribe(new DisposableObserver>>() { - @Override - public void onNext(ResultResponse> R) { - if (R.getCode() == R.SUCCESS ) { - MsgVo msgVo = (MsgVo) R.getData(); - List data = msgVo.getData(); - if (CollectionUtils.isEmpty(data)) { - ToastUtil.showBottomWarn("操作移除,退出后重试"); - return; - } - if (CollectionUtils.isEmpty(requestList)) { // 本地没有聊天记录 - cursor = msgVo.getCursor(); - requestList.add(data.get(0)); - mActivity.adapterInit(requestList); - return; - } - if (!data.get(0).getId().equals( requestList.get(requestList.size()-1 ).getId()) ) { - requestList.add(requestList.size(), data.get(0)); // 确定为新消息才将数据插入数组末尾 - mActivity.mAdapter.refreshLastDate(); - } - }else ToastUtil.showBottomWarn(R.getMsg()); - } - - @Override - public void onError(Throwable e) { - ExceptionHandle.baseExceptionMsg(e); - sendBtnType = true; - } - - @Override - public void onComplete() { - if (requestList.size() >= 8) dropDownView(); - sendBtnType = true; - } - }); - } - public void loadMore() { // 加载更多数据 if (CollectionUtils.isEmpty(requestList)) { // 如果此时的列表为空 则重新初始化 init(); @@ -264,7 +216,7 @@ public class InstantViewModel extends ToolbarViewModel{ .subscribe(new DisposableObserver>>() { @Override public void onNext(ResultResponse> R) { - if (R.getCode() == R.SUCCESS ) { + if (R.getCode() == R.SUCCESS) { MsgVo msgVo = (MsgVo) R.getData(); cursor = msgVo.getCursor(); List data = msgVo.getData(); @@ -304,40 +256,4 @@ public class InstantViewModel extends ToolbarViewModel{ } }); } - - /** 将回收视图滚动到底部 */ - public void dropDownView() { // 延时将回收视图下拉到底部 - new Handler(Looper.getMainLooper()).postDelayed(new Runnable() { - @Override - public void run() { - mActivity.mRecyclerView.scrollToPosition(requestList.size()-1); - } - }, 1000); - } - - @Override - public void onStop(@NonNull LifecycleOwner owner) { - super.onStop(owner); - - } - - @Override - public void finish() { // 用户点击返回 - super.finish(); - if (isNew) { - LocalPushChatMsg newLocalData = new LocalPushChatMsg(adverseData.getId(), adverseData.getUserName(), - adverseData.getUserType(), adverseData.getAvatar(), requestList.get(requestList.size() - 1).getCreateTime(), - requestList.get(requestList.size() - 1).getCreateTime(), "0"); - - // todo 如果是主动发送了消息 则需要更新本地缓存 - if (CollectionUtils.isEmpty(localPushChatMsgs)){ // 没有本地缓存 - LocalPushChatMsgUtil.addNewLocalData(newLocalData); - requestList.clear(); - return; - } -// /** 如果有数据就在工具类中处理数据 */ -// LocalPushChatMsgUtil.updateLocalDatas(newLocalData, localPushChatMsgs); -// requestList.clear(); - } - } }