Commit 57f5faf0 authored by sheteng's avatar sheteng

xiugai extdata

parent 097174c8
......@@ -52,6 +52,7 @@ dependencies {
implementation 'androidx.constraintlayout:constraintlayout:2.1.1'
implementation 'androidx.navigation:navigation-fragment:2.3.0'
implementation 'androidx.navigation:navigation-ui:2.3.0'
implementation 'org.greenrobot:eventbus:3.1.1'
// implementation(name: 'ccim-release', ext: 'aar')
implementation project(path: ':ccim')
......
......@@ -22,10 +22,7 @@
android:name=".MainActivity2"
android:exported="false"
android:label="@string/title_activity_main2"
android:screenOrientation="portrait" /> <!-- <activity -->
<!-- android:name=".ui.login.LoginActivity" -->
<!-- android:exported="false" -->
<!-- android:label="@string/title_activity_login" /> -->
android:screenOrientation="portrait" />
<activity
android:name=".ui.login.LoginActivity"
android:label="@string/app_name"
......
package com.ccwangluo.im;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import com.ccwangluo.ccim.CCIMClient;
import com.ccwangluo.ccim.listener.OnPushMsgListener;
import com.ccwangluo.ccim.listener.ResultEventCallback;
import com.ccwangluo.ccim.modle.Contact;
import com.ccwangluo.ccim.modle.MessageContent;
import com.ccwangluo.ccim.modle.NetStatus;
import com.ccwangluo.ccim.modle.PullContactsRes;
import com.ccwangluo.ccim.modle.User;
import com.ccwangluo.im.databinding.FragmentFirstBinding;
import java.util.ArrayList;
import java.util.List;
public class FirstFragment extends Fragment {
private FragmentFirstBinding binding;
private static final String TAG = FirstFragment.class.getName();
@Override
public View onCreateView(
LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState
) {
binding = FragmentFirstBinding.inflate(inflater, container, false);
return binding.getRoot();
}
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
// String appKey = "c981adfde9c4000";
// String userName = "user101";
// Long userId = 101L;
// String extData = "extData";
// Long ts = System.currentTimeMillis();
// String data = appKey + "&" + userId + "&" + userName + "&" + extData + "&" + ts +
// "&wW7cR31PwJseIoZMOs311nljHpwUmujs";
// //sign计算在服务器,本地不要暴露appsecrect
// String sign = HmacUtil.stringToSign("wW7cR31PwJseIoZMOs311nljHpwUmujs", data);
//
// CCIMClient.getInstance().initSDK(getContext(), appKey, userName, extData, userId, ts, sign, new OnConnectListener() {
// @Override
// public void onSocketConnection() {
// refreshLogView("connect success");
// }
//
// @Override
// public void onSocketDisconnection(int code) {
//
// }
//
//
// });
CCIMClient.getInstance().registerMessageListener(new OnPushMsgListener() {
@Override
public void pushPrivateMsg(MessageContent msg) {
}
@Override
public void pushChannelMsg(MessageContent msg) {
}
@Override
public void pushNewContact(Contact contact) {
refreshLogView("new Contact " + contact);
}
@Override
public void pushDeleteContact(Long contactId) {
refreshLogView("delete contactId " + contactId);
}
@Override
public void pushContactNetStatus(Long contactId, NetStatus status) {
refreshLogView("ContactNetStatus is :" + contactId + " status:" + status);
}
@Override
public void pushContactNewReq(User user) {
}
});
binding.getChatList.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
CCIMClient.getInstance().getContactList(true, new ResultEventCallback<PullContactsRes>() {
@Override
public void onSuccess(PullContactsRes pullContactsRes) {
}
@Override
public void onFailed(int errorCode) {
}
});
}
});
binding.getOfflineMessage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// CCIMClient.getInstance().getOfflineMessage(0L, new ResultEventCallback<List<Message.PullOfflineMessageResponse.OfflineMessage>>() {
// @Override
// public void onSuccess(List<Message.PullOfflineMessageResponse.OfflineMessage> offlineMessages) {
// Log.d(TAG, "offlineMessages: " + offlineMessages.toString());
// refreshLogView("offlineMessages: " + offlineMessages.toString());
// }
// });
}
});
binding.searchUser.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// CCIMClient.getInstance().searchUser(binding.userName.getText().toString(), new ResultEventCallback<List<User>>());
}
});
binding.addUser.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
CCIMClient.getInstance().addContact(Long.parseLong(binding.userId.getText().toString()), new ResultEventCallback<Void>() {
@Override
public void onSuccess(Void unused) {
}
@Override
public void onFailed(int errorCode) {
}
});
}
});
binding.sendTextMessage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
CCIMClient.getInstance().sendTextMessage(binding.msg.getText().toString(), Long.parseLong(binding.userId.getText().toString()), binding.userName.getText().toString(),
new ResultEventCallback<MessageContent>() {
@Override
public void onSuccess(MessageContent messageContent) {
}
@Override
public void onFailed(int errorCode) {
}
});
}
});
binding.getContactRequests.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
CCIMClient.getInstance().getContactReqList(new ResultEventCallback<List<User>>() {
@Override
public void onSuccess(List<User> contactRequestsResponse) {
refreshLogView("getContactRequests: " + contactRequestsResponse.toString());
}
@Override
public void onFailed(int errorCode) {
}
});
}
});
binding.checkContactRequests.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
CCIMClient.getInstance().checkContactReq(Long.parseLong(binding.userId.getText().toString()), true, new ResultEventCallback<Void>() {
@Override
public void onSuccess(Void unused) {
}
@Override
public void onFailed(int errorCode) {
}
});
}
});
binding.createContactGroupRequest.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
CCIMClient.getInstance().createContactGroup("zhangsan", new ResultEventCallback<Long>() {
@Override
public void onSuccess(Long aLong) {
refreshLogView("createContactGroupRequest : " + aLong);
}
@Override
public void onFailed(int errorCode) {
}
});
}
});
binding.moveContactGroupRequest.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
CCIMClient.getInstance().moveContactGroup(Long.parseLong(binding.groupId.getText().toString()), Long.parseLong(binding.userId.getText().toString()),
new ResultEventCallback<Void>() {
@Override
public void onSuccess(Void unused) {
}
@Override
public void onFailed(int errorCode) {
}
});
}
});
binding.deleteContact.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
CCIMClient.getInstance().deleteContact(Long.parseLong(binding.userId.getText().toString()), new ResultEventCallback<Void>() {
@Override
public void onSuccess(Void unused) {
}
@Override
public void onFailed(int errorCode) {
}
});
}
});
binding.blockContact.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
CCIMClient.getInstance().blockContact(Long.parseLong(binding.userId.getText().toString()), new ResultEventCallback<Void>() {
@Override
public void onSuccess(Void unused) {
}
@Override
public void onFailed(int errorCode) {
}
});
}
});
binding.reportIllegalUser.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
CCIMClient.getInstance().reportIllegalUser("搞黄色", "搞黄色", Long.parseLong(binding.userId.getText().toString()),
new ResultEventCallback<Void>() {
@Override
public void onSuccess(Void unused) {
}
@Override
public void onFailed(int errorCode) {
}
});
}
});
binding.sendChannelMessage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// CCIMClient.getInstance().sendChannelMessage(binding.msg.getText().toString(), Long.parseLong(binding.channelId.getText().toString()), new ResultCallback() {
// @Override
// public void onSuccess() {
// refreshLogView("sendChannelMessage success");
// }
// });
}
});
//
// binding.startRecordAudioMessage.setOnClickListener(new View.OnClickListener() {
// @Override
// public void onClick(View v) {
// CCIMClient.getInstance().startRecordAudioMessage(getActivity(), new ResultEventCallback<Void>() {
// @Override
// public void onSuccess(Void unused) {
//
// }
//
// @Override
// public void onFailed(int errorCode) {
//
// }
// }
// );
// })
binding.stopAndSendAudioMessage.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick (View v){
}
});
binding.cancleAudioMessage.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick (View v){
CCIMClient.getInstance().cancleAudioMessage();
}
});
binding.createChannel.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick (View v){
ArrayList<Long> userIds = new ArrayList<>();
userIds.add(Long.parseLong(binding.userId.getText().toString()));
CCIMClient.getInstance().createChannel("大世界", "112", false, userIds, new ResultEventCallback<Long>() {
@Override
public void onSuccess(Long aLong) {
binding.channelId.setText(aLong.toString());
refreshLogView("createChannel " + aLong);
}
@Override
public void onFailed(int errorCode) {
}
});
}
});
binding.joinChannel.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick (View v){
CCIMClient.getInstance().joinChannel(Long.parseLong(binding.channelId.getText().toString()), new ResultEventCallback<Void>() {
@Override
public void onSuccess(Void unused) {
}
@Override
public void onFailed(int errorCode) {
}
});
}
});
binding.removeChannelMember.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick (View v){
CCIMClient.getInstance().removeChannelMember(Long.parseLong(binding.channelId.getText().toString()), Long.parseLong(binding.userId.getText().toString()),
new ResultEventCallback<Void>() {
@Override
public void onSuccess(Void unused) {
}
@Override
public void onFailed(int errorCode) {
}
});
}
});
binding.exitChannel.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick (View v){
CCIMClient.getInstance().exitChannel(Long.parseLong(binding.channelId.getText().toString()), new ResultEventCallback<Void>() {
@Override
public void onSuccess(Void unused) {
}
@Override
public void onFailed(int errorCode) {
}
});
}
});
}
public void refreshLogView (String msg){
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
binding.txLog.append(msg + "\r\n");
int offset = binding.txLog.getLineCount() * binding.txLog.getLineHeight();
if (offset > binding.txLog.getHeight()) {
binding.txLog.scrollTo(0, offset - binding.txLog.getHeight() + binding.txLog.getLineHeight() * 2);
}
}
});
}
@Override
public void onDestroyView () {
super.onDestroyView();
binding = null;
}
}
package com.ccwangluo.im;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import androidx.appcompat.app.AppCompatActivity;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;
import com.ccwangluo.im.databinding.ActivityMainBinding;
public class MainActivity extends AppCompatActivity {
private AppBarConfiguration appBarConfiguration;
private ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
setSupportActionBar(binding.toolbar);
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_content_main);
appBarConfiguration = new AppBarConfiguration.Builder(navController.getGraph()).build();
NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu) ;
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public boolean onSupportNavigateUp() {
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_content_main);
return NavigationUI.navigateUp(navController, appBarConfiguration)
|| super.onSupportNavigateUp();
}
}
\ No newline at end of file
......@@ -24,6 +24,8 @@ import com.ccwangluo.im.data.LoginViewModel;
import com.ccwangluo.im.databinding.ActivityMain2Binding;
import com.google.android.material.bottomnavigation.BottomNavigationView;
import org.greenrobot.eventbus.EventBus;
public class MainActivity2 extends AppCompatActivity {
private LoginViewModel loginViewModel;
......@@ -53,18 +55,19 @@ public class MainActivity2 extends AppCompatActivity {
loginViewModel = new ViewModelProvider(this)
.get(LoginViewModel.class);
CCIMClient.getInstance().registerMessageListener(new OnPushMsgListener() {
@Override
public void pushPrivateMsg(MessageContent msg) {
loginViewModel.addPrivateMsg(msg);
loginViewModel.getContactList();
EventBus.getDefault().post(msg);
}
@Override
public void pushChannelMsg(MessageContent msg) {
loginViewModel.addChannelMsg(msg);
EventBus.getDefault().post(msg);
}
@Override
......
......@@ -16,15 +16,15 @@ import com.ccwangluo.ccim.listener.ResultEventCallback;
import com.ccwangluo.ccim.modle.MessageContent;
import com.ccwangluo.im.R;
import java.util.Collection;
import java.util.List;
public class PrivateMsgAdapter extends BaseAdapter {
private Collection<MessageContent> dataList;
private List<MessageContent> dataList;
private Context context;
public PrivateMsgAdapter(Collection<MessageContent> dataList, Context context) {
public PrivateMsgAdapter(List<MessageContent> dataList, Context context) {
this.dataList = dataList;
this.context = context;
}
......@@ -46,7 +46,7 @@ public class PrivateMsgAdapter extends BaseAdapter {
@Override
public Object getItem(int position) {
return position;
return dataList.get(position);
}
@Override
......@@ -68,7 +68,7 @@ public class PrivateMsgAdapter extends BaseAdapter {
} else {
mHolder = (ViewHolder) convertView.getTag();
}
MessageContent message = (MessageContent) dataList.toArray()[position];
MessageContent message = dataList.get(position);
if (message.getSenderUserId() != null) {
mHolder.msg_content.setVisibility(View.VISIBLE);
mHolder.msg_content_send.setVisibility(View.GONE);
......
......@@ -14,6 +14,7 @@ import com.ccwangluo.ccim.modle.Dialog;
import com.ccwangluo.ccim.modle.MessageContent;
import com.ccwangluo.ccim.modle.PullContactsRes;
import com.ccwangluo.ccim.util.HmacUtil;
import com.ccwangluo.im.util.ToastUtil;
import java.util.ArrayList;
import java.util.Collection;
......@@ -48,7 +49,7 @@ public class LoginViewModel extends ViewModel {
@Override
public void onSocketDisconnection(int code) {
System.out.println("onSocketDisconnection");
ToastUtil.show(context,"onSocketDisconnection + " + code);
//重连
// login(context, appKey, appsecret, username, userId, ip, port);
}
......
......@@ -17,14 +17,18 @@ import com.ccwangluo.im.data.LoginViewModel;
import com.ccwangluo.im.databinding.ActivityConnectBinding;
import com.ccwangluo.im.util.ToastUtil;
import java.util.HashMap;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import java.util.ArrayList;
import java.util.List;
public class ConnectActivity extends AppCompatActivity {
private ActivityConnectBinding binding;
private LoginViewModel loginViewModel;
private PrivateMsgAdapter privaetMsgAdapter;
private HashMap<Long,MessageContent> map = new HashMap<>();
private List<MessageContent> list = new ArrayList<>();
private String filePath;
private boolean isSuccess = false;
......@@ -36,7 +40,7 @@ public class ConnectActivity extends AppCompatActivity {
loginViewModel = new ViewModelProvider(this)
.get(LoginViewModel.class);
privaetMsgAdapter = new PrivateMsgAdapter(map.values(),this);
privaetMsgAdapter = new PrivateMsgAdapter(list,this);
binding.msgList.setAdapter(privaetMsgAdapter);
......@@ -46,7 +50,7 @@ public class ConnectActivity extends AppCompatActivity {
@Override
public void onChanged(MessageContent messageContent) {
if (messageContent.getSenderUserId().equals(contact.getContactUserId()) || messageContent.getReciveUserId().equals(contact.getContactUserId())) {
map.put(messageContent.getMsgId(),messageContent);
list.add(messageContent);
privaetMsgAdapter.refreshData();
binding.msgList.setSelection(privaetMsgAdapter.getCount() - 1);
}
......@@ -114,7 +118,7 @@ public class ConnectActivity extends AppCompatActivity {
@Override
public void onSuccess(List<MessageContent> messageContents) {
for (MessageContent messageContent : messageContents) {
map.put(messageContent.getMsgId(),messageContent);
list.add(messageContent);
}
privaetMsgAdapter.refreshData();
binding.msgList.setSelection(privaetMsgAdapter.getCount() - 1);
......@@ -125,5 +129,18 @@ public class ConnectActivity extends AppCompatActivity {
}
});
EventBus.getDefault().register(this);
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onGetMessage(MessageContent message) {
loginViewModel.addPrivateMsg(message);
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
}
\ No newline at end of file
package com.ccwangluo.im.ui.dashboard;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import com.ccwangluo.ccim.CCIMClient;
import com.ccwangluo.ccim.listener.ResultEventCallback;
import com.ccwangluo.ccim.modle.Contact;
import com.ccwangluo.ccim.modle.MessageContent;
import com.ccwangluo.im.adapter.PrivateMsgAdapter;
import com.ccwangluo.im.data.LoginViewModel;
import com.ccwangluo.im.databinding.FragmentConnectBinding;
import com.ccwangluo.im.util.ToastUtil;
import java.util.HashMap;
import java.util.List;
public class ConnectFragment extends Fragment {
private FragmentConnectBinding binding;
private LoginViewModel loginViewModel;
private PrivateMsgAdapter privaetMsgAdapter;
private HashMap<Long,MessageContent> map = new HashMap<>();
private String filePath;
private boolean isSuccess = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
binding = FragmentConnectBinding.inflate(inflater, container, false);
loginViewModel = new ViewModelProvider(getActivity())
.get(LoginViewModel.class);
privaetMsgAdapter = new PrivateMsgAdapter(map.values(), getContext());
binding.msgList.setAdapter(privaetMsgAdapter);
Contact contact = (Contact) getArguments().getSerializable("contact");
loginViewModel.privateMsgList.observe(getViewLifecycleOwner(), new Observer<MessageContent>() {
@Override
public void onChanged(MessageContent messageContent) {
if (messageContent.getSenderUserId().equals(contact.getContactUserId()) || messageContent.getReciveUserId().equals(contact.getContactUserId())) {
map.put(messageContent.getMsgId(),messageContent);
privaetMsgAdapter.refreshData();
binding.msgList.setSelection(privaetMsgAdapter.getCount() - 1);
}
}
});
binding.sendBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String content = binding.sendEdit.getText().toString();
CCIMClient.getInstance().sendTextMessage(content, contact.getContactUserId(), contact.getContactUserName(), new ResultEventCallback<MessageContent>() {
@Override
public void onSuccess(MessageContent messageContent) {
binding.sendEdit.setText("");
loginViewModel.addPrivateMsg(messageContent);
ToastUtil.show(getContext(), "send Success");
}
@Override
public void onFailed(int errorCode) {
ToastUtil.show(getContext(), "send onFailed :" + errorCode);
}
});
}
});
binding.sendVoice.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
if (isSuccess)
CCIMClient.getInstance().stopAndSendAudioMessage(contact.getContactUserId(), contact.getContactUserName(), new ResultEventCallback<MessageContent>() {
@Override
public void onSuccess(MessageContent message) {
binding.sendEdit.setText("");
loginViewModel.addPrivateMsg(message);
ToastUtil.show(getContext(), "send Success");
}
@Override
public void onFailed(int errorCode) {
ToastUtil.show(getContext(), "send onFailed :" + errorCode);
}
});
}
if (event.getAction() == MotionEvent.ACTION_DOWN) {
CCIMClient.getInstance().startRecordAudioMessage(getActivity(), new ResultEventCallback<Void>() {
@Override
public void onSuccess(Void unused) {
isSuccess = true;
}
@Override
public void onFailed(int errorCode) {
isSuccess = false;
ToastUtil.show(getContext(), errorCode + "");
}
});
}
return false;
}
});
CCIMClient.getInstance().getPrivateMessage(contact.getContactUserId(), new ResultEventCallback<List<MessageContent>>() {
@Override
public void onSuccess(List<MessageContent> messageContents) {
for (MessageContent messageContent : messageContents) {
map.put(messageContent.getMsgId(),messageContent);
}
privaetMsgAdapter.refreshData();
binding.msgList.setSelection(privaetMsgAdapter.getCount() - 1);
}
@Override
public void onFailed(int errorCode) {
}
});
return binding.getRoot();
}
}
\ No newline at end of file
......@@ -2,6 +2,7 @@ package com.ccwangluo.im.ui.dashboard;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
......@@ -23,7 +24,6 @@ import com.ccwangluo.ccim.modle.ContactGroup;
import com.ccwangluo.ccim.modle.Dialog;
import com.ccwangluo.ccim.modle.SearchRes;
import com.ccwangluo.ccim.modle.User;
import com.ccwangluo.im.R;
import com.ccwangluo.im.adapter.ContactExpandableAdapter;
import com.ccwangluo.im.data.LoginViewModel;
import com.ccwangluo.im.databinding.FragmentDashboardBinding;
......@@ -56,9 +56,12 @@ public class ContactsFragment extends Fragment {
contactExpandableAdapter = new ContactExpandableAdapter(getContext(), contactGroupList, contactList, loginViewModel, new OnContactClickLisener() {
@Override
public void onClick(Contact contact) {
Bundle bundle = new Bundle();
bundle.putSerializable("contact", contact);
navController.navigate(R.id.navigation_connect, bundle);
// Bundle bundle = new Bundle();
// bundle.putSerializable("contact", contact);
// navController.navigate(R.id.navigation_connect, bundle);
Intent intent = new Intent(getContext(), ConnectActivity.class);
intent.putExtra("contact", contact);
startActivity(intent);
}
});
......
......@@ -16,6 +16,10 @@ import com.ccwangluo.im.data.LoginViewModel;
import com.ccwangluo.im.databinding.ActivityConnectChannelBinding;
import com.ccwangluo.im.util.ToastUtil;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import java.util.ArrayList;
import java.util.List;
......@@ -123,5 +127,19 @@ public class ConnectChannelActivity extends AppCompatActivity {
return false;
}
});
EventBus.getDefault().register(this);
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onGetMessage(MessageContent message) {
loginViewModel.addChannelMsg(message);
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
}
\ No newline at end of file
......@@ -39,7 +39,6 @@ import java.util.concurrent.Executors;
import java.util.logging.Logger;
import ccim.protocol.Chat;
import ccim.protocol.Message;
import ccim.protocol.MessageSpec;
import ccim.protocol.Push;
......@@ -360,8 +359,8 @@ public class CCIMClient {
/**
* 同步离线消息
*/
private void getOfflineMessage(Long lastPullMsgId, ResultEventCallback<List<Message.PullOfflineMessageResponse.OfflineMessage>> resultEventCallback) {
messageManager.getOfflineMessage(lastPullMsgId, resultEventCallback);
private void getOfflineMessage(Long contactId,ResultEventCallback<List<MessageContent>> resultEventCallback) {
messageManager.getOfflineMessage(contactId,resultEventCallback);
}
/**
......
......@@ -22,4 +22,7 @@ public interface MessageDao {
@Query("SELECT * FROM messagecontent where msgId = :msgId")
MessageContent getMsgById(Long msgId);
@Query("SELECT * FROM messagecontent where senderUserId = :userId or reciveUserId = :userId")
MessageContent getLastMsgById(Long userId);
}
......@@ -9,10 +9,12 @@ import com.ccwangluo.ccim.database.AppDatabase;
import com.ccwangluo.ccim.listener.ResultEventCallback;
import com.ccwangluo.ccim.modle.MessageContent;
import com.ccwangluo.ccim.modle.PullMessageRes;
import com.ccwangluo.ccim.modle.PullOffLineMessageRes;
import com.ccwangluo.ccim.util.ErrorCode;
import com.ccwangluo.ccim.util.FileUtils;
import com.ccwangluo.ccim.util.MediaHelper;
import com.google.gson.Gson;
import com.google.protobuf.InvalidProtocolBufferException;
import com.google.protobuf.util.JsonFormat;
import java.io.File;
......@@ -51,29 +53,50 @@ public class MessageManager {
/**
* 同步离线消息
*/
public void getOfflineMessage(Long lastPullMsgId, ResultEventCallback<List<Message.PullOfflineMessageResponse.OfflineMessage>> resultEventCallback) {
Message.PullOfflineMessageRequest offlineMessageRequest = Message.PullOfflineMessageRequest.newBuilder()
.setLastPulledMsgId(lastPullMsgId)
.build();
Chat.ChatRequestMessage.Builder builder = Chat.ChatRequestMessage.newBuilder();
builder.setPullOfflineMsgReq(offlineMessageRequest);
int id = socketManager.sendRequest(builder);
callBackManager.addCallBack(id, new ResultEventCallback<Chat.ChatResponseMessage>() {
@Override
public void onSuccess(Chat.ChatResponseMessage chatResponseMessage) {
if (chatResponseMessage.hasPullOfflineMsgRes()) {
logger.info(String.valueOf(chatResponseMessage));
List<Message.PullOfflineMessageResponse.OfflineMessage> offlineMsgsList = chatResponseMessage.getPullOfflineMsgRes().getOfflineMsgsList();
resultEventCallback.onSuccess(offlineMsgsList);
}
public void getOfflineMessage(Long contactId, ResultEventCallback<List<MessageContent>> resultEventCallback) {
executor.execute(() -> {
long lastPullMsgId = 0;
MessageContent lastMsgById = db.messageDao().getLastMsgById(contactId);
if (lastMsgById != null) {
lastPullMsgId = lastMsgById.getMsgId();
}
Message.PullOfflineMessageRequest offlineMessageRequest = Message.PullOfflineMessageRequest.newBuilder()
.setLastPulledMsgId(lastPullMsgId)
.build();
Chat.ChatRequestMessage.Builder builder = Chat.ChatRequestMessage.newBuilder();
builder.setPullOfflineMsgReq(offlineMessageRequest);
int id = socketManager.sendRequest(builder);
callBackManager.addCallBack(id, new ResultEventCallback<Chat.ChatResponseMessage>() {
@Override
public void onSuccess(Chat.ChatResponseMessage chatResponseMessage) {
if (chatResponseMessage.hasPullOfflineMsgRes()) {
logger.info(String.valueOf(chatResponseMessage));
Gson gson = new Gson();
try {
String print = JsonFormat.printer().print(chatResponseMessage.getPullOfflineMsgRes());
PullOffLineMessageRes pullOffLineMessageRes = gson.fromJson(print, PullOffLineMessageRes.class);
List<MessageContent> message = pullOffLineMessageRes.getOfflineMessages();
for (MessageContent messageContent : message) {
if (!messageContent.getSenderUserId().equals(userId)) {
messageContent.setReciveUserId(userId);
}
}
resultEventCallback.onSuccess(message);
pushNewMessageList(message);
} catch (InvalidProtocolBufferException e) {
e.printStackTrace();
}
}
}
@Override
public void onFailed(int errorCode) {
resultEventCallback.onFailed(errorCode);
}
@Override
public void onFailed(int errorCode) {
resultEventCallback.onFailed(errorCode);
}
});
});
}
......
......@@ -15,6 +15,15 @@ public class MessageContent {
private Long channelId;
private MessageType msgType = MessageType.MESSAGE_TYPE_TEXT;
private MessageSourceType msgSrcType = MessageSourceType.MESSAGE_SOURCE_TYPE_PRIVATE;
private User senderUser;
public User getSenderUser() {
return senderUser;
}
public void setSenderUser(User senderUser) {
this.senderUser = senderUser;
}
public MessageType getMsgType() {
return msgType;
......
package com.ccwangluo.ccim.modle;
import java.util.List;
public class PullOffLineMessageRes {
private List<MessageContent> offlineMessages;
public List<MessageContent> getOfflineMessages() {
return offlineMessages;
}
public void setOfflineMessages(List<MessageContent> offlineMessages) {
this.offlineMessages = offlineMessages;
}
}
......@@ -9,6 +9,15 @@ public class User {
private Long userId;
private String username;
private String extData;
public String getExtData() {
return extData;
}
public void setExtData(String extData) {
this.extData = extData;
}
public Long getUserId() {
return userId;
......
......@@ -7,6 +7,8 @@ message CreateChannelRequest {
string tag = 2;
bool open = 3;
repeated int64 user_ids = 4;
int32 limit = 5;
string game_server = 6;
}
message CreateChannelResponse {
......@@ -35,9 +37,9 @@ message ExitChannelResponse {
}
message ChannelBlockUserRequest {
int64 channel_id = 1;
int64 blocked_user_id = 2;
int64 expired_at_millis = 3; // 频道拉黑到期时间,毫秒
int64 channel_id = 1;
int64 blocked_user_id = 2;
int64 expired_at_millis = 3;
}
message ChannelBlockUserResponse {
......
......@@ -153,6 +153,7 @@ message SearchResponse {
message User {
int64 user_id = 1;
string username = 2;
string ext_data = 3;
}
repeated User users = 1;
int32 total = 2;
......
......@@ -3,50 +3,50 @@ syntax = "proto3";
package ccim.protocol;
enum StatusCode {
STATUS_CODE_OK = 0; // 正常
STATUS_CODE_NO_RESPONSE = 10; // 无响应
STATUS_CODE_SERVER_INTERNAL_ERROR = 10000; // 服务器内部未知错误
STATUS_CODE_TOO_FREQUENTLY_ERROR = 10001; // 调用过于频繁
STATUS_CODE_UNKNOWN_REQUEST_ERROR = 10002; // 未知请求
STATUS_CODE_INVALID_ARGUMENTS_ERROR = 10003; // 无效参数
// AUTH_ERROR = 20000;
STATUS_CODE_AUTH_INCORRECT_INPUT_ERROR = 20001; // 认证无效输入
STATUS_CODE_NO_AUTH_ERROR = 20002; // 未认证
STATUS_CODE_INVALID_APP_KEY = 20003; // 无效app_key
STATUS_CODE_SIGN_EXPIRED = 20004; // 签名过期
STATUS_CODE_INVALID_SIGN = 20005; // 无效签名
STATUS_CODE_EXT_DATA_TOO_LARGE = 20006; // 扩展数据过大
STATUS_CODE_SENSITIVE_ERROR = 20007; // 包含敏感信息,被禁止发送
// CHAT_SERVICE_ERROR = 30000;
STATUS_CODE_CHECK_CONTACT_UPDATED_ERROR = 30001; // 好友请求已同意或拒绝
STATUS_CODE_CONTACT_GROUP_EXCEEDED_LIMIT_ERROR = 30002; // 群组成员到达上限
STATUS_CODE_CONTACT_EXCEEDED_LIMIT_ERROR = 30003; // 联系人达到上限
STATUS_CODE_NOT_CONTACT_ERROR = 30101; // 非好友不能调用该api
STATUS_CODE_USER_MUTED_ERROR = 30102; // 用户被禁言
STATUS_CODE_SEND_TO_BLOCKED_ERROR = 30103; // 向被拉黑的人发送消息
// STATUS_CODE_GROUP_NOT_MEMBER_ERROR = 30201;
// STATUS_CODE_GROUP_MUTED_ME_ERROR = 30202;
STATUS_CODE_CHANNEL_NOT_MEMBER_ERROR = 30302; // 非频道成员不能调用该api
STATUS_CODE_CHANNEL_MUTED_ME_ERROR = 30303; // 频道对我禁言
STATUS_CODE_CHANNEL_NOT_EXISTS = 30304; // 频道不存在
STATUS_CODE_CHANNEL_NOT_PERMITTED = 30305; // 频道不允许该用户加入
STATUS_CODE_CHANNEL_LIMIT_EXCEEDED = 30306; // 频道加入时人数达到限制
STATUS_CODE_OK = 0; // 正常
STATUS_CODE_NO_RESPONSE = 10; // 无响应
STATUS_CODE_SERVER_INTERNAL_ERROR = 10000; // 服务器内部未知错误
STATUS_CODE_TOO_FREQUENTLY_ERROR = 10001; // 调用过于频繁
STATUS_CODE_UNKNOWN_REQUEST_ERROR = 10002; // 未知请求
STATUS_CODE_INVALID_ARGUMENTS_ERROR = 10003; // 无效参数
// AUTH_ERROR = 20000;
STATUS_CODE_AUTH_INCORRECT_INPUT_ERROR = 20001; // 认证无效输入
STATUS_CODE_NO_AUTH_ERROR = 20002; // 未认证
STATUS_CODE_INVALID_APP_KEY = 20003; // 无效app_key
STATUS_CODE_SIGN_EXPIRED = 20004; // 签名过期
STATUS_CODE_INVALID_SIGN = 20005; // 无效签名
STATUS_CODE_EXT_DATA_TOO_LARGE = 20006; // 扩展数据过大
STATUS_CODE_SENSITIVE_ERROR = 20007; // 包含敏感信息,被禁止发送
// CHAT_SERVICE_ERROR = 30000;
STATUS_CODE_CHECK_CONTACT_UPDATED_ERROR = 30001; // 好友请求已同意或拒绝
STATUS_CODE_CONTACT_GROUP_EXCEEDED_LIMIT_ERROR = 30002; // 群组成员到达上限
STATUS_CODE_CONTACT_EXCEEDED_LIMIT_ERROR = 30003; // 联系人达到上限
STATUS_CODE_NOT_CONTACT_ERROR = 30101; // 非好友不能调用该api
STATUS_CODE_USER_MUTED_ERROR = 30102; // 用户被禁言
STATUS_CODE_SEND_TO_BLOCKED_ERROR = 30103; // 向被拉黑的人发送消息
// STATUS_CODE_GROUP_NOT_MEMBER_ERROR = 30201;
// STATUS_CODE_GROUP_MUTED_ME_ERROR = 30202;
STATUS_CODE_CHANNEL_NOT_MEMBER_ERROR = 30302; // 非频道成员不能调用该api
STATUS_CODE_CHANNEL_MUTED_ME_ERROR = 30303; // 频道对我禁言
STATUS_CODE_CHANNEL_NOT_EXISTS = 30304; // 频道不存在
STATUS_CODE_CHANNEL_NOT_PERMITTED = 30305; // 频道不允许该用户加入
STATUS_CODE_CHANNEL_LIMIT_EXCEEDED = 30306; // 频道加入时人数达到限制
}
message RequestMessageHeader {
int32 version = 1;
int32 seq = 2;
int32 version = 1;
int32 seq = 2;
}
message ResponseMessageHeader {
int32 version = 1;
int32 seq = 2;
StatusCode code = 3;
int32 version = 1;
int32 seq = 2;
StatusCode code = 3;
}
\ No newline at end of file
......@@ -38,6 +38,7 @@ message Dialog {
message ContactReqData {
int64 user_id = 1;
string username = 2;
string ext_data = 3;
}
message AddContactResponse {
......
......@@ -35,17 +35,13 @@ message SendChannelMessageResponse {
}
message PullOfflineMessageRequest {
int64 last_pulled_msg_id = 1;
int64 last_pulled_msg_id = 1; // 本地存储最后一条私聊消息id,调用此接口时带上,若没有填0
int32 limit = 2; // 条数
}
message PullOfflineMessageResponse {
message OfflineMessage {
int64 msg_src_id = 1;
MessageSourceType msg_src_type = 2;
ChatMessage message = 3;
int64 send_date = 4;
}
repeated OfflineMessage offline_msgs = 1;
// repeated OfflineMessage offline_msgs = 1; reserved for compatibility
repeated ChatMessage offline_messages = 2;
}
message PullPrivateMessageRequest {
......
......@@ -13,6 +13,12 @@ enum MessageSourceType {
}
message ChatMessage {
message UserInfo {
int64 user_id = 1;
string username = 2;
string ext_data = 3;
}
int64 msg_id = 1;
int64 sender_user_id = 2;
int64 msg_src_id = 3;
......@@ -21,4 +27,6 @@ message ChatMessage {
string content = 6;
int64 created_date = 7;
int64 modified_date = 8;
UserInfo sender_user = 9;
}
\ No newline at end of file
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment