wangxiang 2 years ago
parent
commit
7a20fe44b7
  1. 2
      app/src/main/java/com/kanglai/push/constant/CommonConstant.java
  2. 2
      app/src/main/java/com/kanglai/push/entity/LocalPushChatMsg.java
  3. 38
      app/src/main/java/com/kanglai/push/ui/activity/InstantActivity.java
  4. 49
      app/src/main/java/com/kanglai/push/ui/fragment/MessageFragment.java
  5. 172
      app/src/main/java/com/kanglai/push/ui/vm/InstantViewModel.java

2
app/src/main/java/com/kanglai/push/constant/CommonConstant.java

@ -37,4 +37,6 @@ public interface CommonConstant { @@ -37,4 +37,6 @@ public interface CommonConstant {
/** app 端登录用户类型 */
String ID_ENTITY_PROVIDER = "app";
String INSTANT_LAUNCHER_RESULT_KEY = "INSTANT_LAUNCHER_RESULT_KEY";
}

2
app/src/main/java/com/kanglai/push/entity/LocalPushChatMsg.java

@ -32,7 +32,7 @@ public class LocalPushChatMsg implements Parcelable { @@ -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(){}

38
app/src/main/java/com/kanglai/push/ui/activity/InstantActivity.java

@ -1,45 +1,37 @@ @@ -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<ActivityInstantBinding, Instan @@ -92,9 +84,8 @@ public class InstantActivity extends BaseActivity<ActivityInstantBinding, Instan
more_fill.setOnClickListener(view -> 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<ActivityInstantBinding, Instan @@ -113,14 +104,12 @@ public class InstantActivity extends BaseActivity<ActivityInstantBinding, Instan
chatMessage.setCreateTime(currentTime);
mAdapter.append(chatMessage);
mRecyclerView.scrollToPosition(mAdapter.getItemCount() - 1);
setActivitieResult();
});
RxSubscriptions.add(mSubscription);
}
/**
* 请求数据加载之后 再进行RecyclerView的加载
* @param requestList
*/
public void adapterInit(ArrayList<PushChatMessage> requestList) {
final SoloChatRoomAdapter soloChatRoomAdapter = new SoloChatRoomAdapter(requestList, localPushChatMsg);
mAdapter = soloChatRoomAdapter;
@ -139,6 +128,20 @@ public class InstantActivity extends BaseActivity<ActivityInstantBinding, Instan @@ -139,6 +128,20 @@ public class InstantActivity extends BaseActivity<ActivityInstantBinding, Instan
mRecyclerView.scrollToPosition(mAdapter.getItemCount() - 1);
}
public void setActivitieResult() {
if (!mAdapter.mItemList.isEmpty()) {
setResult(RESULT_OK, new Intent().putExtra(CommonConstant.INSTANT_LAUNCHER_RESULT_KEY, new LocalPushChatMsg()
.setId(localPushChatMsg.getId())
.setUserName(localPushChatMsg.getUserName())
.setUserType(localPushChatMsg.getUserType())
.setAvatar(localPushChatMsg.getAvatar())
.setSendTime(mAdapter.mItemList.get(mAdapter.getItemCount() - 1).getCreateTime())
.setLastContent(mAdapter.mItemList.get(mAdapter.getItemCount() - 1).getText())
));
}
}
/**
* 加载不同用户类型时的界面
* app端不能给 系统/企业用户/企业内部/系统 用户发消息
@ -167,7 +170,6 @@ public class InstantActivity extends BaseActivity<ActivityInstantBinding, Instan @@ -167,7 +170,6 @@ public class InstantActivity extends BaseActivity<ActivityInstantBinding, Instan
}
}
/**隐藏键盘 */
public void hideKeyboard() {
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
View currentFocusView = getCurrentFocus();

49
app/src/main/java/com/kanglai/push/ui/fragment/MessageFragment.java

@ -1,5 +1,7 @@ @@ -1,5 +1,7 @@
package com.kanglai.push.ui.fragment;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.LayoutInflater;
@ -9,6 +11,9 @@ import android.view.ViewGroup; @@ -9,6 +11,9 @@ import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContract;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
@ -19,6 +24,7 @@ import com.dolphin.core.base.BaseFragment; @@ -19,6 +24,7 @@ import com.dolphin.core.base.BaseFragment;
import com.dolphin.core.bus.RxBus;
import com.dolphin.core.bus.RxSubscriptions;
import com.dolphin.core.util.RxUtil;
import com.dolphin.core.util.ToastUtil;
import com.dolphin.umeng.entity.PushChatMessage;
import com.google.gson.Gson;
import com.h6ah4i.android.widget.advrecyclerview.animator.GeneralItemAnimator;
@ -27,6 +33,7 @@ import com.h6ah4i.android.widget.advrecyclerview.swipeable.RecyclerViewSwipeMana @@ -27,6 +33,7 @@ import com.h6ah4i.android.widget.advrecyclerview.swipeable.RecyclerViewSwipeMana
import com.h6ah4i.android.widget.advrecyclerview.touchguard.RecyclerViewTouchActionGuardManager;
import com.kanglai.push.BR;
import com.kanglai.push.R;
import com.kanglai.push.constant.CommonConstant;
import com.kanglai.push.databinding.FragmentMessageBinding;
import com.kanglai.push.entity.LocalPushChatMsg;
import com.kanglai.push.ui.activity.InstantActivity;
@ -35,8 +42,6 @@ import com.kanglai.push.ui.vm.MessageViewModel; @@ -35,8 +42,6 @@ import com.kanglai.push.ui.vm.MessageViewModel;
import com.kanglai.push.util.LocalPushChatMsgUtil;
import com.scwang.smart.refresh.layout.api.RefreshLayout;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
@ -61,7 +66,7 @@ public class MessageFragment extends BaseFragment<FragmentMessageBinding, Messag @@ -61,7 +66,7 @@ public class MessageFragment extends BaseFragment<FragmentMessageBinding, Messag
public RefreshLayout mRefreshLayout;
public LoadingLayout mLoadingLayout;
private Disposable mSubscription;
private Boolean btnClickType = true;
private ActivityResultLauncher<LocalPushChatMsg> instantLauncherResult;
@Override
public int setContentView(LayoutInflater inflater, @Nullable ViewGroup parentContainer, @Nullable Bundle savedInstanceState) {
@ -74,7 +79,7 @@ public class MessageFragment extends BaseFragment<FragmentMessageBinding, Messag @@ -74,7 +79,7 @@ public class MessageFragment extends BaseFragment<FragmentMessageBinding, Messag
}
@Override
public void onCreate(Bundle savedInstanceState) {;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mSubscription = RxBus.getInstance().toObservableSticky(PushChatMessage.class)
.compose(RxUtil.schedulersTransformer())
@ -86,6 +91,26 @@ public class MessageFragment extends BaseFragment<FragmentMessageBinding, Messag @@ -86,6 +91,26 @@ public class MessageFragment extends BaseFragment<FragmentMessageBinding, Messag
}
});
RxSubscriptions.add(mSubscription);
instantLauncherResult = registerForActivityResult(new ActivityResultContract<LocalPushChatMsg, LocalPushChatMsg>() {
@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<FragmentMessageBinding, Messag @@ -128,14 +153,12 @@ public class MessageFragment extends BaseFragment<FragmentMessageBinding, Messag
public void onStart() {
super.onStart();
mViewModel.setAlias();
btnClickType = true;
if (mRefreshLayout != null){
mRefreshLayout.resetNoMoreData(); // 恢复没有数据的初始状态 等待系统销毁
mRefreshLayout.resetNoMoreData();
mRefreshLayout.setOnRefreshListener(mViewModel::refresh);
}
}
@Override
public void onDestroy() {
super.onDestroy();
@ -170,22 +193,18 @@ public class MessageFragment extends BaseFragment<FragmentMessageBinding, Messag @@ -170,22 +193,18 @@ public class MessageFragment extends BaseFragment<FragmentMessageBinding, Messag
}
@Override
public void onItemViewClicked(View v, LocalPushChatMsg item) { // 单项点击事件
if (!btnClickType) return;
Bundle bundle = new Bundle();
bundle.putParcelable("GOING_TO_INSTANT", item);
startActivity(InstantActivity.class, bundle);
btnClickType = false; // 禁止连续点击
public void onItemViewClicked(View v, LocalPushChatMsg item) {
instantLauncherResult.launch(item);
}
@Override
public void setToRemove(LocalPushChatMsg item) { // 移除本地存储
public void setToRemove(LocalPushChatMsg item) {
LocalPushChatMsgUtil.clearAppointData(item.getId());
mViewModel.refresh(mRefreshLayout);
}
@Override
public void setToRead(int position) { // 设置为已读
public void setToRead(int position) {
List<LocalPushChatMsg> list = mAdapter.getData();
list.get(position).setIsRead("0");
list.get(position).setPinned(false);

172
app/src/main/java/com/kanglai/push/ui/vm/InstantViewModel.java

@ -1,6 +1,10 @@ @@ -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; @@ -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; @@ -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<InstantActivity>{ @@ -56,11 +63,7 @@ public class InstantViewModel extends ToolbarViewModel<InstantActivity>{
public int current = 1;
public Boolean isNew = false; // 是否接收到新消息
public Boolean sendBtnType = true; // 发送按钮状态事件
public String cursor = ""; // 记录游标
public String cursor = "";
public ArrayList<LocalPushChatMsg> localPushChatMsgs; // 本地缓存的列表数据
@ -79,7 +82,7 @@ public class InstantViewModel extends ToolbarViewModel<InstantActivity>{ @@ -79,7 +82,7 @@ public class InstantViewModel extends ToolbarViewModel<InstantActivity>{
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<InstantActivity>{ @@ -106,20 +109,12 @@ public class InstantViewModel extends ToolbarViewModel<InstantActivity>{
ToastUtil.showBottom("定时任务");
});
/**
* 输入框发送消息
* text - 内容tit - 标题alias-接收方iduserId-发送方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<InstantActivity>{ @@ -128,35 +123,42 @@ public class InstantViewModel extends ToolbarViewModel<InstantActivity>{
chatMessage.setAlias(adverseData.getId());
chatMessage.setUserId(user.getId());
pushService.concernFanSend(chatMessage)
.compose(RxUtil.schedulersTransformer())
.compose(RxUtil.exceptionTransformer())
.doOnSubscribe(this)
.subscribe(new DisposableObserver<ResultResponse>() {
@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<ResultResponse>() {
@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<InstantActivity>{ @@ -196,56 +198,6 @@ public class InstantViewModel extends ToolbarViewModel<InstantActivity>{
});
}
/** 加载最新的一条数据 */
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<ResultResponse<Map<String, Object>>>() {
@Override
public void onNext(ResultResponse<Map<String, Object>> R) {
if (R.getCode() == R.SUCCESS ) {
MsgVo msgVo = (MsgVo) R.getData();
List<PushChatMessage> 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<InstantActivity>{ @@ -264,7 +216,7 @@ public class InstantViewModel extends ToolbarViewModel<InstantActivity>{
.subscribe(new DisposableObserver<ResultResponse<Map<String, Object>>>() {
@Override
public void onNext(ResultResponse<Map<String, Object>> R) {
if (R.getCode() == R.SUCCESS ) {
if (R.getCode() == R.SUCCESS) {
MsgVo msgVo = (MsgVo) R.getData();
cursor = msgVo.getCursor();
List<PushChatMessage> data = msgVo.getData();
@ -304,40 +256,4 @@ public class InstantViewModel extends ToolbarViewModel<InstantActivity>{ @@ -304,40 +256,4 @@ public class InstantViewModel extends ToolbarViewModel<InstantActivity>{
}
});
}
/** 将回收视图滚动到底部 */
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();
}
}
}

Loading…
Cancel
Save