Commit df78610d authored by sheteng's avatar sheteng

fix

parent a3d0a99c
...@@ -26,5 +26,25 @@ ...@@ -26,5 +26,25 @@
<option name="name" value="Google" /> <option name="name" value="Google" />
<option name="url" value="https://dl.google.com/dl/android/maven2/" /> <option name="url" value="https://dl.google.com/dl/android/maven2/" />
</remote-repository> </remote-repository>
<remote-repository>
<option name="id" value="maven" />
<option name="name" value="maven" />
<option name="url" value="file:/$PROJECT_DIR$/%20https:/jitpack.io%20" />
</remote-repository>
<remote-repository>
<option name="id" value="maven" />
<option name="name" value="maven" />
<option name="url" value="file:/$PROJECT_DIR$/ccim/%20https:/jitpack.io%20" />
</remote-repository>
<remote-repository>
<option name="id" value="maven" />
<option name="name" value="maven" />
<option name="url" value="file:/$PROJECT_DIR$/app/%20https:/jitpack.io%20" />
</remote-repository>
<remote-repository>
<option name="id" value="maven" />
<option name="name" value="maven" />
<option name="url" value="https://nexus.sky-shark.com/repository/ccnet-group/" />
</remote-repository>
</component> </component>
</project> </project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="DesignSurface">
<option name="filePathToZoomLevelMap">
<map>
<entry key="..\:/project/ccwangluoIm/app/src/main/res/layout/activity_main.xml" value="0.20153985507246377" />
<entry key="..\:/project/ccwangluoIm/app/src/main/res/layout/content_main.xml" value="0.20153985507246377" />
<entry key="..\:/project/ccwangluoIm/app/src/main/res/layout/fragment_first.xml" value="0.4530812324929972" />
</map>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK"> <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" /> <output url="file://$PROJECT_DIR$/build/classes" />
</component> </component>
......
...@@ -46,4 +46,5 @@ dependencies { ...@@ -46,4 +46,5 @@ dependencies {
compile 'com.google.protobuf:protobuf-java:3.5.1' compile 'com.google.protobuf:protobuf-java:3.5.1'
implementation 'com.google.protobuf:protobuf-java:3.8.0' implementation 'com.google.protobuf:protobuf-java:3.8.0'
implementation 'com.google.protobuf:protobuf-java-util:3.8.0' implementation 'com.google.protobuf:protobuf-java-util:3.8.0'
implementation 'com.guolindev.permissionx:permissionx:1.6.1'
} }
\ No newline at end of file
package com.ccwangluo.im; package com.ccwangluo.im;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
...@@ -7,14 +7,15 @@ import android.util.Log; ...@@ -7,14 +7,15 @@ import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.Toast;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import com.ccwangluo.ccim.CCIMClient; import com.ccwangluo.ccim.CCIMClient;
import com.ccwangluo.ccim.listener.OnConnectListener;
import com.ccwangluo.ccim.listener.ResultCallback; import com.ccwangluo.ccim.listener.ResultCallback;
import com.ccwangluo.ccim.listener.ResultEventCallback; import com.ccwangluo.ccim.listener.ResultEventCallback;
import com.ccwangluo.ccim.util.HmacUtil;
import com.ccwangluo.im.databinding.FragmentFirstBinding; import com.ccwangluo.im.databinding.FragmentFirstBinding;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -40,35 +41,30 @@ public class FirstFragment extends Fragment { ...@@ -40,35 +41,30 @@ public class FirstFragment extends Fragment {
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) { public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState); super.onViewCreated(view, savedInstanceState);
CCIMClient.getInstance().initSDK(); String appKey = "c981adfde9c4000";
CCIMClient.getInstance().registerMessageListener(new ResultEventCallback<Chat.ChatResponseMessage>() { String userName = "user100";
@Override Long userId = 100L;
public void onSuccess(Chat.ChatResponseMessage chatResponseMessage) { Long ts = System.currentTimeMillis();
new Handler(Looper.getMainLooper()).post(new Runnable() { String data = appKey + "&" + userId + "&" + userName + "&" + ts +
@Override "&wW7cR31PwJseIoZMOs311nljHpwUmujs";
public void run() {
Toast.makeText(getContext(),chatResponseMessage.toString(),Toast.LENGTH_SHORT).show();
}
});
} String sign = HmacUtil.stringToSign("wW7cR31PwJseIoZMOs311nljHpwUmujs",data);
});
binding.buttonLogin.setOnClickListener(new View.OnClickListener() { CCIMClient.getInstance().initSDK(appKey, userName, 100L, ts, sign, new OnConnectListener() {
@Override @Override
public void onClick(View v) { public void onSocketConnection() {
CCIMClient.getInstance().login("user1","123456",1L,new ResultCallback(){ refreshLogView("connect success");
}
@Override @Override
public void onSuccess() { public void onSocketDisconnection() {
refreshLogView("disconnect");
} }
// @Override
// public void onFailed(int errorCode) {
//
// }
}); });
CCIMClient.getInstance().registerMessageListener(new ResultEventCallback<Chat.ChatResponseMessage>() {
@Override
public void onSuccess(Chat.ChatResponseMessage chatResponseMessage) {
refreshLogView(chatResponseMessage.toString());
} }
}); });
...@@ -76,15 +72,18 @@ public class FirstFragment extends Fragment { ...@@ -76,15 +72,18 @@ public class FirstFragment extends Fragment {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
CCIMClient.getInstance().getChatList(new ResultEventCallback<Chat.PullContactsResponse>() { CCIMClient.getInstance().getContactList(new ResultEventCallback<Chat.PullContactsResponse>() {
@Override @Override
public void onSuccess(Chat.PullContactsResponse pullContactsResponse) { public void onSuccess(Chat.PullContactsResponse pullContactsResponse) {
List<Chat.PullContactsResponse.Channel> channelsList = pullContactsResponse.getChannelsList(); List<Chat.PullContactsResponse.Channel> channelsList = pullContactsResponse.getChannelsList();
Log.d(TAG, "channelsList: " + channelsList.toString()); Log.d(TAG, "channelsList: " + channelsList.toString());
refreshLogView("channelsList: " + channelsList.toString());
List<Chat.PullContactsResponse.ContactGroup> contactGroupsList = pullContactsResponse.getContactGroupsList(); List<Chat.PullContactsResponse.ContactGroup> contactGroupsList = pullContactsResponse.getContactGroupsList();
Log.d(TAG, "contactGroupsList: " + contactGroupsList.toString()); Log.d(TAG, "contactGroupsList: " + contactGroupsList.toString());
refreshLogView("contactGroupsList: " + contactGroupsList.toString());
List<Chat.PullContactsResponse.Contact> contactsList = pullContactsResponse.getContactsList(); List<Chat.PullContactsResponse.Contact> contactsList = pullContactsResponse.getContactsList();
Log.d(TAG, "contactsList: " + contactsList.toString()); Log.d(TAG, "contactsList: " + contactsList.toString());
refreshLogView("contactsList: " + contactsList.toString());
} }
}); });
} }
...@@ -93,10 +92,11 @@ public class FirstFragment extends Fragment { ...@@ -93,10 +92,11 @@ public class FirstFragment extends Fragment {
binding.getOfflineMessage.setOnClickListener(new View.OnClickListener() { binding.getOfflineMessage.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
CCIMClient.getInstance().getOfflineMessage(new ResultEventCallback<ArrayList<Message.PullOfflineMessageResponse.OfflineMessage>>() { CCIMClient.getInstance().getOfflineMessage(0L,new ResultEventCallback<List<Message.PullOfflineMessageResponse.OfflineMessage>>() {
@Override @Override
public void onSuccess(ArrayList<Message.PullOfflineMessageResponse.OfflineMessage> offlineMessages) { public void onSuccess(List<Message.PullOfflineMessageResponse.OfflineMessage> offlineMessages) {
Log.d(TAG, "offlineMessages: " + offlineMessages.toString()); Log.d(TAG, "offlineMessages: " + offlineMessages.toString());
refreshLogView("offlineMessages: " + offlineMessages.toString());
} }
}); });
} }
...@@ -105,10 +105,11 @@ public class FirstFragment extends Fragment { ...@@ -105,10 +105,11 @@ public class FirstFragment extends Fragment {
binding.searchUser.setOnClickListener(new View.OnClickListener() { binding.searchUser.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
CCIMClient.getInstance().searchUser("user2", new ResultEventCallback<List<Chat.SearchResponse.User>>() { CCIMClient.getInstance().searchUser("feng", new ResultEventCallback<List<Chat.SearchResponse.User>>() {
@Override @Override
public void onSuccess(List<Chat.SearchResponse.User> users) { public void onSuccess(List<Chat.SearchResponse.User> users) {
Log.d(TAG, "onSuccess: " + users); Log.d(TAG, "onSuccess: " + users);
refreshLogView("searchUser: " + users);
} }
}); });
} }
...@@ -120,7 +121,7 @@ public class FirstFragment extends Fragment { ...@@ -120,7 +121,7 @@ public class FirstFragment extends Fragment {
CCIMClient.getInstance().addContact(Long.parseLong(binding.userId.getText().toString()), new ResultEventCallback<Chat.AddContactResponse.AddResult>() { CCIMClient.getInstance().addContact(Long.parseLong(binding.userId.getText().toString()), new ResultEventCallback<Chat.AddContactResponse.AddResult>() {
@Override @Override
public void onSuccess(Chat.AddContactResponse.AddResult addResult) { public void onSuccess(Chat.AddContactResponse.AddResult addResult) {
refreshLogView("addUser : " + addResult.toString());
} }
}); });
} }
...@@ -132,7 +133,7 @@ public class FirstFragment extends Fragment { ...@@ -132,7 +133,7 @@ public class FirstFragment extends Fragment {
CCIMClient.getInstance().sendTextMessage("你好", Long.parseLong(binding.userId.getText().toString()), new ResultCallback() { CCIMClient.getInstance().sendTextMessage("你好", Long.parseLong(binding.userId.getText().toString()), new ResultCallback() {
@Override @Override
public void onSuccess() { public void onSuccess() {
refreshLogView("sendTextMessage success");
} }
}); });
} }
...@@ -141,10 +142,10 @@ public class FirstFragment extends Fragment { ...@@ -141,10 +142,10 @@ public class FirstFragment extends Fragment {
binding.getContactRequests.setOnClickListener(new View.OnClickListener() { binding.getContactRequests.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
CCIMClient.getInstance().getContactRequests(new ResultEventCallback<Chat.ContactRequestsResponse>() { CCIMClient.getInstance().getContactReqList(new ResultEventCallback<Chat.ContactRequestsResponse>() {
@Override @Override
public void onSuccess(Chat.ContactRequestsResponse contactRequestsResponse) { public void onSuccess(Chat.ContactRequestsResponse contactRequestsResponse) {
refreshLogView("getContactRequests: " + contactRequestsResponse.toString());
} }
}); });
} }
...@@ -156,7 +157,7 @@ public class FirstFragment extends Fragment { ...@@ -156,7 +157,7 @@ public class FirstFragment extends Fragment {
CCIMClient.getInstance().checkContactReq(Long.parseLong(binding.userId.getText().toString()), true, new ResultCallback() { CCIMClient.getInstance().checkContactReq(Long.parseLong(binding.userId.getText().toString()), true, new ResultCallback() {
@Override @Override
public void onSuccess() { public void onSuccess() {
refreshLogView("checkContactRequests success");
} }
}); });
} }
...@@ -164,26 +165,26 @@ public class FirstFragment extends Fragment { ...@@ -164,26 +165,26 @@ public class FirstFragment extends Fragment {
binding.createContactGroupRequest.setOnClickListener(new View.OnClickListener() { binding.createContactGroupRequest.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
CCIMClient.getInstance().createContactGroup("zhangsan", new ResultEventCallback<Long>() { CCIMClient.getInstance().createContactGroup("zhangsan", new ResultEventCallback<Chat.CreateContactGroupResponse>() {
@Override @Override
public void onSuccess(Long aLong) { public void onSuccess(Chat.CreateContactGroupResponse aLong) {
refreshLogView("createContactGroupRequest : " + aLong);
} }
}); });
} }
}); });
binding.moveContactGroupRequest.setOnClickListener(new View.OnClickListener() { // binding.moveContactGroupRequest.setOnClickListener(new View.OnClickListener() {
@Override // @Override
public void onClick(View v) { // public void onClick(View v) {
CCIMClient.getInstance().moveContactGroup(Long.parseLong(binding.groupId.getText().toString()), Long.parseLong(binding.userId.getText().toString()), new ResultCallback() { // CCIMClient.getInstance().moveContactGroup(Long.parseLong(binding.groupId.getText().toString()), Long.parseLong(binding.userId.getText().toString()), new ResultCallback() {
@Override // @Override
public void onSuccess() { // public void onSuccess() {
// refreshLogView("moveContactGroupRequest success " );
} // }
}); // });
} // }
}); // });
binding.deleteContact.setOnClickListener(new View.OnClickListener() { binding.deleteContact.setOnClickListener(new View.OnClickListener() {
@Override @Override
...@@ -191,7 +192,7 @@ public class FirstFragment extends Fragment { ...@@ -191,7 +192,7 @@ public class FirstFragment extends Fragment {
CCIMClient.getInstance().deleteContact(Long.parseLong(binding.userId.getText().toString()), new ResultCallback() { CCIMClient.getInstance().deleteContact(Long.parseLong(binding.userId.getText().toString()), new ResultCallback() {
@Override @Override
public void onSuccess() { public void onSuccess() {
refreshLogView("deleteContact success " );
} }
}); });
} }
...@@ -203,7 +204,7 @@ public class FirstFragment extends Fragment { ...@@ -203,7 +204,7 @@ public class FirstFragment extends Fragment {
CCIMClient.getInstance().blockContact(Long.parseLong(binding.userId.getText().toString()), true, new ResultCallback() { CCIMClient.getInstance().blockContact(Long.parseLong(binding.userId.getText().toString()), true, new ResultCallback() {
@Override @Override
public void onSuccess() { public void onSuccess() {
refreshLogView("blockContact success " );
} }
}); });
} }
...@@ -215,33 +216,58 @@ public class FirstFragment extends Fragment { ...@@ -215,33 +216,58 @@ public class FirstFragment extends Fragment {
CCIMClient.getInstance().reportIllegalUser("搞黄色", "搞黄色", Long.parseLong(binding.userId.getText().toString()), new ResultCallback() { CCIMClient.getInstance().reportIllegalUser("搞黄色", "搞黄色", Long.parseLong(binding.userId.getText().toString()), new ResultCallback() {
@Override @Override
public void onSuccess() { public void onSuccess() {
refreshLogView("reportIllegalUser success " );
} }
}); });
} }
}); });
binding.sendGroupMessage.setOnClickListener(new View.OnClickListener() {
binding.sendChannelMessage.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
CCIMClient.getInstance().sendGroupMessage("搞黄色", Long.parseLong(binding.groupId.getText().toString()), new ResultCallback() { CCIMClient.getInstance().sendChannelMessage("搞黄色", Long.parseLong(binding.channelId.getText().toString()), new ResultCallback() {
@Override @Override
public void onSuccess() { public void onSuccess() {
refreshLogView("sendChannelMessage success");
} }
}); });
} }
}); });
binding.sendChannelMessage.setOnClickListener(new View.OnClickListener() { binding.startRecordAudioMessage.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
CCIMClient.getInstance().sendChannelMessage("搞黄色", Long.parseLong(binding.channelId.getText().toString()), new ResultCallback() {
CCIMClient.getInstance().startRecordAudioMessage(getActivity());
}
});
binding.stopAndSendAudioMessage.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onSuccess() { public void onClick(View v) {
CCIMClient.getInstance().stopAndSendAudioMessage();
}
});
binding.cancleAudioMessage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
CCIMClient.getInstance().cancleAudioMessage();
} }
}); });
}
public void refreshLogView(String msg) {
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
binding.txLog.append(msg);
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);
}
} }
}); });
......
...@@ -2,6 +2,7 @@ package com.ccwangluo.im; ...@@ -2,6 +2,7 @@ package com.ccwangluo.im;
import android.os.Bundle; import android.os.Bundle;
import com.ccwangluo.ccim.util.HmacUtil;
import com.google.android.material.snackbar.Snackbar; import com.google.android.material.snackbar.Snackbar;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
...@@ -36,13 +37,6 @@ public class MainActivity extends AppCompatActivity { ...@@ -36,13 +37,6 @@ public class MainActivity extends AppCompatActivity {
appBarConfiguration = new AppBarConfiguration.Builder(navController.getGraph()).build(); appBarConfiguration = new AppBarConfiguration.Builder(navController.getGraph()).build();
NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration); NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
binding.fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
} }
@Override @Override
......
...@@ -22,12 +22,5 @@ ...@@ -22,12 +22,5 @@
<include layout="@layout/content_main" /> <include layout="@layout/content_main" />
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="@dimen/fab_margin"
app:srcCompat="@android:drawable/ic_dialog_email" />
</androidx.coordinatorlayout.widget.CoordinatorLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>
\ No newline at end of file
...@@ -3,173 +3,209 @@ ...@@ -3,173 +3,209 @@
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:orientation="horizontal"
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".FirstFragment"> tools:context=".FirstFragment">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:id="@+id/tx_log"
android:layout_height="100dp"/>
<LinearLayout
android:layout_width="match_parent"
android:orientation="horizontal"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:text="userId"
android:layout_height="wrap_content"/>
<EditText
android:id="@+id/userId"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="userId"
android:text="2" />
<TextView
android:layout_width="wrap_content"
android:text="channelId"
android:layout_height="wrap_content"/>
<EditText
android:id="@+id/channelId"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="channelId"
android:text="1" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ScrollView <ScrollView
android:layout_width="0dp" android:layout_width="0dp"
android:layout_weight="1" android:layout_height="match_parent"
android:layout_height="match_parent"> android:layout_weight="1">
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:orientation="vertical" android:layout_height="match_parent"
android:layout_height="match_parent"> android:orientation="vertical">
<Button
android:layout_marginTop="50dp"
android:layout_gravity="center_horizontal"
android:id="@+id/button_login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="登录" />
<Button <Button
android:layout_marginTop="20dp"
android:layout_gravity="center_horizontal"
android:id="@+id/getChatList" android:id="@+id/getChatList"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="10dp"
android:text="获取联系人列表" /> android:text="获取联系人列表" />
<Button <Button
android:layout_marginTop="20dp"
android:layout_gravity="center_horizontal"
android:id="@+id/getOfflineMessage" android:id="@+id/getOfflineMessage"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="10dp"
android:text="同步离线消息" /> android:text="同步离线消息" />
<Button <Button
android:layout_marginTop="20dp"
android:layout_gravity="center_horizontal"
android:id="@+id/searchUser" android:id="@+id/searchUser"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="10dp"
android:text="查找好友" /> android:text="查找好友" />
<Button <Button
android:layout_marginTop="20dp"
android:layout_gravity="center_horizontal"
android:id="@+id/addUser" android:id="@+id/addUser"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="10dp"
android:text="添加好友" /> android:text="添加好友" />
<Button <Button
android:layout_marginTop="20dp"
android:layout_gravity="center_horizontal"
android:id="@+id/getContactRequests" android:id="@+id/getContactRequests"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="10dp"
android:text="联系人申请列表" /> android:text="联系人申请列表" />
<Button <Button
android:layout_marginTop="20dp"
android:layout_gravity="center_horizontal"
android:id="@+id/checkContactRequests" android:id="@+id/checkContactRequests"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="10dp"
android:text="验证联系人申请" /> android:text="验证联系人申请" />
<Button <Button
android:layout_marginTop="20dp"
android:layout_gravity="center_horizontal"
android:id="@+id/sendTextMessage" android:id="@+id/sendTextMessage"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="10dp"
android:text="发送消息" /> android:text="发送消息" />
<Button <Button
android:layout_marginTop="20dp"
android:layout_gravity="center_horizontal"
android:id="@+id/createContactGroupRequest" android:id="@+id/createContactGroupRequest"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="10dp"
android:text="创建联系人组" /> android:text="创建联系人组" />
</LinearLayout> </LinearLayout>
</ScrollView> </ScrollView>
<ScrollView <ScrollView
android:layout_width="0dp" android:layout_width="0dp"
android:layout_weight="1" android:layout_height="match_parent"
android:layout_height="match_parent"> android:layout_weight="1">
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:orientation="vertical" android:layout_height="match_parent"
android:layout_height="match_parent"> android:orientation="vertical">
<EditText
android:id="@+id/userId"
android:layout_width="match_parent"
android:text="2"
android:hint="userId"
android:layout_height="wrap_content"/>
<EditText
android:id="@+id/groupId"
android:layout_width="match_parent"
android:hint="groupId"
android:text="1"
android:layout_height="wrap_content"/>
<EditText
android:id="@+id/channelId"
android:text="1"
android:layout_width="match_parent"
android:hint="channelId"
android:layout_height="wrap_content"/>
<Button <Button
android:layout_marginTop="20dp"
android:layout_gravity="center_horizontal"
android:id="@+id/moveContactGroupRequest" android:id="@+id/moveContactGroupRequest"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="10dp"
android:text="移动联系人所在群组" /> android:text="移动联系人所在群组" />
<Button <Button
android:layout_marginTop="20dp"
android:layout_gravity="center_horizontal"
android:id="@+id/deleteContact" android:id="@+id/deleteContact"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="10dp"
android:text="删除联系人" /> android:text="删除联系人" />
<Button <Button
android:layout_marginTop="20dp"
android:layout_gravity="center_horizontal"
android:id="@+id/blockContact" android:id="@+id/blockContact"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="10dp"
android:text="拉黑联系人" /> android:text="拉黑联系人" />
<Button <Button
android:layout_marginTop="20dp"
android:layout_gravity="center_horizontal"
android:id="@+id/reportIllegalUser" android:id="@+id/reportIllegalUser"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="10dp"
android:text="举报违规用户" /> android:text="举报违规用户" />
<Button <Button
android:layout_marginTop="20dp" android:id="@+id/sendChannelMessage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"
android:id="@+id/sendGroupMessage" android:layout_marginTop="10dp"
android:text="发送频道消息" />
<Button
android:id="@+id/startRecordAudioMessage"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="发送群组消息" /> android:layout_gravity="center_horizontal"
android:layout_marginTop="10dp"
android:text="开始录音" />
<Button <Button
android:layout_marginTop="20dp" android:id="@+id/stopAndSendAudioMessage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"
android:id="@+id/sendChannelMessage" android:layout_marginTop="10dp"
android:text="录音上传" />
<Button
android:id="@+id/cancleAudioMessage"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="发送频道消息" /> android:layout_gravity="center_horizontal"
android:layout_marginTop="10dp"
android:text="取消上传" />
</LinearLayout> </LinearLayout>
</ScrollView> </ScrollView>
</LinearLayout>
</LinearLayout> </LinearLayout>
\ No newline at end of file
// Top-level build file where you can add configuration options common to all sub-projects/modules. // Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript { buildscript {
repositories { repositories {
maven {
url "https://nexus.sky-shark.com/repository/ccnet-group/"
}
google() google()
mavenCentral() mavenCentral()
maven { url ' https://jitpack.io ' }
} }
dependencies { dependencies {
classpath "com.android.tools.build:gradle:4.2.2" classpath "com.android.tools.build:gradle:4.2.2"
...@@ -14,9 +18,12 @@ buildscript { ...@@ -14,9 +18,12 @@ buildscript {
allprojects { allprojects {
repositories { repositories {
maven {
url "https://nexus.sky-shark.com/repository/ccnet-group/"
}
google() google()
mavenCentral() mavenCentral()
jcenter() // Warning: this repository is going to shut down soon maven { url ' https://jitpack.io ' }
} }
} }
......
...@@ -57,15 +57,12 @@ protobuf { ...@@ -57,15 +57,12 @@ protobuf {
} }
} }
} }
dependencies { dependencies {
implementation 'androidx.appcompat:appcompat:1.3.1' implementation 'androidx.appcompat:appcompat:1.3.1'
implementation 'com.google.android.material:material:1.4.0' implementation 'com.google.android.material:material:1.4.0'
testImplementation 'junit:junit:4.+' implementation 'com.google.protobuf:protobuf-java:3.13.0'
androidTestImplementation 'androidx.test.ext:junit:1.1.2' implementation 'com.google.protobuf:protobuf-java-util:3.12.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' implementation 'com.tonystark.android:socket:latest.release'
implementation 'com.google.protobuf:protobuf-java:3.8.0' implementation 'com.tonystark.android:socket-server:latest.release'
implementation 'com.google.protobuf:protobuf-java-util:3.8.0' implementation 'com.guolindev.permissionx:permissionx:1.6.1'
api 'com.tonystark.android:socket:latest.release'
api 'com.tonystark.android:socket-server:latest.release'
} }
\ No newline at end of file
...@@ -3,5 +3,7 @@ ...@@ -3,5 +3,7 @@
package="com.ccwangluo.ccim"> package="com.ccwangluo.ccim">
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
</manifest> </manifest>
\ No newline at end of file
package com.ccwangluo.ccim; package com.ccwangluo.ccim;
import android.Manifest;
import android.media.MediaPlayer;
import androidx.fragment.app.FragmentActivity;
import com.ccwangluo.ccim.listener.OnConnectListener;
import com.ccwangluo.ccim.listener.ResultCallback; import com.ccwangluo.ccim.listener.ResultCallback;
import com.ccwangluo.ccim.listener.ResultEventCallback; import com.ccwangluo.ccim.listener.ResultEventCallback;
import com.ccwangluo.ccim.manage.CallBackManager; import com.ccwangluo.ccim.manage.CallBackManager;
import com.ccwangluo.ccim.manage.SocketManageer; import com.ccwangluo.ccim.manage.SocketManageer;
import com.ccwangluo.ccim.util.MediaHelper;
import com.google.protobuf.RepeatedFieldBuilder;
import com.permissionx.guolindev.PermissionX;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.logging.Logger; import java.util.logging.Logger;
import ccim.protocol.Chat; import ccim.protocol.Chat;
import ccim.protocol.Message; import ccim.protocol.Message;
import ccim.protocol.MessageSpec; import ccim.protocol.MessageSpec;
...@@ -38,10 +44,10 @@ public class CCIMClient { ...@@ -38,10 +44,10 @@ public class CCIMClient {
return mInstance; return mInstance;
} }
public void initSDK() { public void initSDK(String appKey, String userName, Long userId, Long ts, String sign, OnConnectListener resultCallback) {
callBackManager = new CallBackManager<>(); callBackManager = new CallBackManager<>();
socketManageer = new SocketManageer(callBackManager); socketManageer = new SocketManageer(callBackManager);
socketManageer.initAuth(); socketManageer.initChat(appKey, userName, userId,ts,sign,resultCallback);
} }
...@@ -52,10 +58,6 @@ public class CCIMClient { ...@@ -52,10 +58,6 @@ public class CCIMClient {
MessageSpec.ChatMessage pushPrivateMsgRes = chatResponseMessage.getPushPrivateMsgRes().getMessage(); MessageSpec.ChatMessage pushPrivateMsgRes = chatResponseMessage.getPushPrivateMsgRes().getMessage();
pushPrivateMessageAck(pushPrivateMsgRes.getSenderUserId(), pushPrivateMsgRes.getMsgId()); pushPrivateMessageAck(pushPrivateMsgRes.getSenderUserId(), pushPrivateMsgRes.getMsgId());
} }
if (chatResponseMessage.hasPushGroupMsgRes()) {
Push.PushGroupMessageResponse message = chatResponseMessage.getPushGroupMsgRes();
pushGroupMessageAck(message.getGroupId(), message.getMessage().getMsgId());
}
if (chatResponseMessage.hasPushChannelMsgRes()) { if (chatResponseMessage.hasPushChannelMsgRes()) {
Push.PushChannelMessageResponse channelMsgRes = chatResponseMessage.getPushChannelMsgRes(); Push.PushChannelMessageResponse channelMsgRes = chatResponseMessage.getPushChannelMsgRes();
pushChannelMessage(channelMsgRes.getChannelId(), channelMsgRes.getMessage().getMsgId()); pushChannelMessage(channelMsgRes.getChannelId(), channelMsgRes.getMessage().getMsgId());
...@@ -65,25 +67,10 @@ public class CCIMClient { ...@@ -65,25 +67,10 @@ public class CCIMClient {
} }
public void login(String username, String password,Long appId, ResultCallback resultEventCallback) {
socketManageer.login(username, password, appId,new ResultEventCallback<String>() {
@Override
public void onSuccess(String s) {
resultEventCallback.onSuccess();
}
@Override
public void onFailed(int errorCode) {
resultEventCallback.onFailed(errorCode);
}
});
}
/** /**
* 获取联系人列表 * 获取联系人列表
*/ */
public synchronized void getChatList(ResultEventCallback<Chat.PullContactsResponse> resultEventCallback) { public void getContactList(ResultEventCallback<Chat.PullContactsResponse> resultEventCallback) {
Chat.PullContactsRequest builder = Chat.PullContactsRequest.newBuilder() Chat.PullContactsRequest builder = Chat.PullContactsRequest.newBuilder()
.build(); .build();
int id = socketManageer.sendRequest(builder); int id = socketManageer.sendRequest(builder);
...@@ -109,21 +96,18 @@ public class CCIMClient { ...@@ -109,21 +96,18 @@ public class CCIMClient {
/** /**
* 同步离线消息 * 同步离线消息
*/ */
public void getOfflineMessage(ResultEventCallback<ArrayList<Message.PullOfflineMessageResponse.OfflineMessage>> resultEventCallback) { public void getOfflineMessage(Long lastPullMsgId,ResultEventCallback<List<Message.PullOfflineMessageResponse.OfflineMessage>> resultEventCallback) {
ArrayList<Message.PullOfflineMessageResponse.OfflineMessage> offlineMessages = new ArrayList<>(); Message.PullOfflineMessageRequest offlineMessageRequest = Message.PullOfflineMessageRequest.newBuilder()
Message.PullOfflineMessageRequest offlineMessageRequest = Message.PullOfflineMessageRequest.newBuilder().build(); .setLastPulledMsgId(lastPullMsgId)
int id = socketManageer.sendRequest( offlineMessageRequest); .build();
int id = socketManageer.sendRequest(offlineMessageRequest);
callBackManager.addCallBack(id, new ResultEventCallback<Chat.ChatResponseMessage>() { callBackManager.addCallBack(id, new ResultEventCallback<Chat.ChatResponseMessage>() {
@Override @Override
public void onSuccess(Chat.ChatResponseMessage chatResponseMessage) { public void onSuccess(Chat.ChatResponseMessage chatResponseMessage) {
if (chatResponseMessage.hasPullOfflineMsgRes()) { if (chatResponseMessage.hasPullOfflineMsgRes()) {
logger.info(String.valueOf(chatResponseMessage)); logger.info(String.valueOf(chatResponseMessage));
List<Message.PullOfflineMessageResponse.OfflineMessage> offlineMsgsList = chatResponseMessage.getPullOfflineMsgRes().getOfflineMsgsList(); List<Message.PullOfflineMessageResponse.OfflineMessage> offlineMsgsList = chatResponseMessage.getPullOfflineMsgRes().getOfflineMsgsList();
offlineMessages.addAll(offlineMsgsList); resultEventCallback.onSuccess(offlineMsgsList);
if (offlineMsgsList.isEmpty()) {
resultEventCallback.onSuccess(offlineMessages);
callBackManager.removeCallBack(chatResponseMessage.getHeader().getSeq());
}
} }
} }
...@@ -186,7 +170,7 @@ public class CCIMClient { ...@@ -186,7 +170,7 @@ public class CCIMClient {
/** /**
* 联系人申请列表 * 联系人申请列表
*/ */
public void getContactRequests(ResultEventCallback<Chat.ContactRequestsResponse> callback) { public void getContactReqList(ResultEventCallback<Chat.ContactRequestsResponse> callback) {
Chat.ContactRequestsRequest contactRequestsRequest = Chat.ContactRequestsRequest.newBuilder().build(); Chat.ContactRequestsRequest contactRequestsRequest = Chat.ContactRequestsRequest.newBuilder().build();
int id = socketManageer.sendRequest(contactRequestsRequest); int id = socketManageer.sendRequest(contactRequestsRequest);
callBackManager.addCallBack(id, new ResultEventCallback<Chat.ChatResponseMessage>() { callBackManager.addCallBack(id, new ResultEventCallback<Chat.ChatResponseMessage>() {
...@@ -235,7 +219,7 @@ public class CCIMClient { ...@@ -235,7 +219,7 @@ public class CCIMClient {
/** /**
* 创建联系人群组 * 创建联系人群组
*/ */
public void createContactGroup(String name, ResultEventCallback<Long> callback) { public void createContactGroup(String name, ResultEventCallback<Chat.CreateContactGroupResponse> callback) {
Chat.CreateContactGroupRequest createContactGroupRequest = Chat.CreateContactGroupRequest.newBuilder() Chat.CreateContactGroupRequest createContactGroupRequest = Chat.CreateContactGroupRequest.newBuilder()
.setName(name) .setName(name)
.build(); .build();
...@@ -246,7 +230,7 @@ public class CCIMClient { ...@@ -246,7 +230,7 @@ public class CCIMClient {
if (chatResponseMessage.hasCreateContactGroupRes()) { if (chatResponseMessage.hasCreateContactGroupRes()) {
logger.info(String.valueOf(chatResponseMessage)); logger.info(String.valueOf(chatResponseMessage));
Chat.CreateContactGroupResponse createContactGroupRes = chatResponseMessage.getCreateContactGroupRes(); Chat.CreateContactGroupResponse createContactGroupRes = chatResponseMessage.getCreateContactGroupRes();
callback.onSuccess(createContactGroupRes.getGroupId()); callback.onSuccess(createContactGroupRes);
} }
} }
...@@ -364,7 +348,7 @@ public class CCIMClient { ...@@ -364,7 +348,7 @@ public class CCIMClient {
public void sendTextMessage(String content, Long reciveUserId, ResultCallback callback) { public void sendTextMessage(String content, Long reciveUserId, ResultCallback callback) {
Message.SendMessageRequest messageRequest = Message.SendMessageRequest.newBuilder() Message.SendMessageRequest messageRequest = Message.SendMessageRequest.newBuilder()
.setContent(content) .setContent(content)
.setMsgType(MessageSpec.MessageType.TEXT) .setMsgType(MessageSpec.MessageType.MESSAGE_TYPE_TEXT)
.setReceiverUserId(reciveUserId).build(); .setReceiverUserId(reciveUserId).build();
int id = socketManageer.sendRequest(messageRequest); int id = socketManageer.sendRequest(messageRequest);
callBackManager.addCallBack(id, new ResultEventCallback<Chat.ChatResponseMessage>() { callBackManager.addCallBack(id, new ResultEventCallback<Chat.ChatResponseMessage>() {
...@@ -383,39 +367,13 @@ public class CCIMClient { ...@@ -383,39 +367,13 @@ public class CCIMClient {
}); });
} }
/**
* 发送群组消息
*/
public void sendGroupMessage(String content, Long groupId, ResultCallback callback) {
Message.SendGroupMessageRequest sendGroupMessageRequest = Message.SendGroupMessageRequest.newBuilder()
.setContent(content)
.setMsgType(MessageSpec.MessageType.TEXT)
.setGroupId(groupId)
.build();
int id = socketManageer.sendRequest(sendGroupMessageRequest);
callBackManager.addCallBack(id, new ResultEventCallback<Chat.ChatResponseMessage>() {
@Override
public void onSuccess(Chat.ChatResponseMessage chatResponseMessage) {
if (chatResponseMessage.hasSendGroupMsgRes()) {
logger.info(String.valueOf(chatResponseMessage));
callback.onSuccess();
}
}
@Override
public void onFailed(int errorCode) {
callback.onFailed(errorCode);
}
});
}
/** /**
* 发送群组消息 * 发送群组消息
*/ */
public void sendChannelMessage(String content, Long channelId, ResultCallback callback) { public void sendChannelMessage(String content, Long channelId, ResultCallback callback) {
Message.SendChannelMessageRequest sendChannelMessageRequest = Message.SendChannelMessageRequest.newBuilder() Message.SendChannelMessageRequest sendChannelMessageRequest = Message.SendChannelMessageRequest.newBuilder()
.setContent(content) .setContent(content)
.setMsgType(MessageSpec.MessageType.TEXT) .setMsgType(MessageSpec.MessageType.MESSAGE_TYPE_TEXT)
.setChannelId(channelId) .setChannelId(channelId)
.build(); .build();
int id = socketManageer.sendRequest(sendChannelMessageRequest); int id = socketManageer.sendRequest(sendChannelMessageRequest);
...@@ -447,17 +405,6 @@ public class CCIMClient { ...@@ -447,17 +405,6 @@ public class CCIMClient {
callBackManager.addCallBack(id, chatResponseMessage -> logger.info(String.valueOf(chatResponseMessage))); callBackManager.addCallBack(id, chatResponseMessage -> logger.info(String.valueOf(chatResponseMessage)));
} }
/**
* 推送渠道消息成功ack
*/
public void pushGroupMessageAck(Long groupId, Long msgId) {
Push.PushGroupMessageAckRequest groupMessageAckRequest = Push.PushGroupMessageAckRequest.newBuilder()
.setGroupId(groupId)
.setMsgId(msgId)
.build();
int id = socketManageer.sendRequest(groupMessageAckRequest);
callBackManager.addCallBack(id, chatResponseMessage -> logger.info(String.valueOf(chatResponseMessage)));
}
/** /**
* 推送渠道消息成功ack * 推送渠道消息成功ack
...@@ -471,4 +418,35 @@ public class CCIMClient { ...@@ -471,4 +418,35 @@ public class CCIMClient {
callBackManager.addCallBack(id, chatResponseMessage -> logger.info(String.valueOf(chatResponseMessage))); callBackManager.addCallBack(id, chatResponseMessage -> logger.info(String.valueOf(chatResponseMessage)));
} }
/**
* 开始录音
*/
public void startRecordAudioMessage(FragmentActivity activity) {
PermissionX.init(activity)
.permissions(Manifest.permission.RECORD_AUDIO)
.onExplainRequestReason((scope, deniedList, beforeRequest) -> scope.showRequestReasonDialog(deniedList, "即将申请的权限是程序必须依赖的权限", "我已明白"))
.onForwardToSettings((scope, deniedList) -> scope.showForwardToSettingsDialog(deniedList, "您需要去应用程序设置当中手动开启权限", "我已明白"))
.request((allGranted, grantedList, deniedList) -> {
if (allGranted) {
MediaHelper.getInstance().prepare(activity);
}
});
}
public void stopAndSendAudioMessage(){
MediaHelper.getInstance().release();
String filePath = MediaHelper.getInstance().getFilePath();
}
public void cancleAudioMessage(){
MediaHelper.getInstance().cancel();
}
public void startPlayAudio(String filePath){
MediaHelper.getInstance().play(filePath);
}
} }
package com.ccwangluo.ccim.listener;
public interface OnConnectListener {
void onSocketConnection();
void onSocketDisconnection();
}
...@@ -10,10 +10,10 @@ import java.util.HashMap; ...@@ -10,10 +10,10 @@ import java.util.HashMap;
public class CallBackManager<T> { public class CallBackManager<T> {
private final HashMap<Integer, ResultEventCallback<T>> callbackHashMap = new HashMap<>(); private final HashMap<Integer, ResultEventCallback<T>> callbackHashMap = new HashMap<>();
private final int time_out = 60 * 1000; private static final int time_out = 60 * 1000;
public synchronized void addCallBack(int id, ResultEventCallback<T> resultEventCallback) { public void addCallBack(int id, ResultEventCallback<T> resultEventCallback) {
callbackHashMap.put(id, resultEventCallback); callbackHashMap.put(id, resultEventCallback);
//设置60秒超时 //设置60秒超时
new Handler(Looper.getMainLooper()).postDelayed(() -> { new Handler(Looper.getMainLooper()).postDelayed(() -> {
...@@ -25,11 +25,11 @@ public class CallBackManager<T> { ...@@ -25,11 +25,11 @@ public class CallBackManager<T> {
},time_out); },time_out);
} }
public synchronized ResultEventCallback<T> getCallBack(int id) { public ResultEventCallback<T> getCallBack(int id) {
return callbackHashMap.get(id); return callbackHashMap.get(id);
} }
public synchronized void removeCallBack(int id) { public void removeCallBack(int id) {
callbackHashMap.remove(id); callbackHashMap.remove(id);
} }
......
package com.ccwangluo.ccim.manage; package com.ccwangluo.ccim.manage;
import android.text.TextUtils;
import com.ccwangluo.ccim.CCIMClient; import com.ccwangluo.ccim.CCIMClient;
import com.ccwangluo.ccim.listener.OnConnectListener;
import com.ccwangluo.ccim.modle.IrequestData; import com.ccwangluo.ccim.modle.IrequestData;
import com.ccwangluo.ccim.modle.MyIReaderProtocol; import com.ccwangluo.ccim.modle.MyIReaderProtocol;
import com.ccwangluo.ccim.listener.MessageListener; import com.ccwangluo.ccim.listener.MessageListener;
import com.ccwangluo.ccim.listener.ResultEventCallback; import com.ccwangluo.ccim.listener.ResultEventCallback;
import com.ccwangluo.ccim.util.HmacUtil;
import com.xuhao.didi.core.pojo.OriginalData; import com.xuhao.didi.core.pojo.OriginalData;
import com.xuhao.didi.socket.client.sdk.OkSocket; import com.xuhao.didi.socket.client.sdk.OkSocket;
import com.xuhao.didi.socket.client.sdk.client.ConnectionInfo; import com.xuhao.didi.socket.client.sdk.client.ConnectionInfo;
import com.xuhao.didi.socket.client.sdk.client.OkSocketOptions; import com.xuhao.didi.socket.client.sdk.client.OkSocketOptions;
import com.xuhao.didi.socket.client.sdk.client.action.SocketActionAdapter; import com.xuhao.didi.socket.client.sdk.client.action.SocketActionAdapter;
import com.xuhao.didi.socket.client.sdk.client.connection.IConnectionManager; import com.xuhao.didi.socket.client.sdk.client.connection.IConnectionManager;
import java.util.logging.Logger; import java.util.logging.Logger;
import ccim.protocol.Auth;
import ccim.protocol.Chat; import ccim.protocol.Chat;
import ccim.protocol.Common; import ccim.protocol.Common;
import ccim.protocol.Message; import ccim.protocol.Message;
import ccim.protocol.Push; import ccim.protocol.Push;
public class SocketManageer { public class SocketManageer {
private final Logger logger = Logger.getLogger(CCIMClient.class.getName());
private final int version = 1; private static final String SERVER_IP = "117.144.156.2";
private static final int SERVER_PORT = 8000;
private static final int version = 1;
private volatile int id = 1; private volatile int id = 1;
...@@ -34,23 +34,9 @@ public class SocketManageer { ...@@ -34,23 +34,9 @@ public class SocketManageer {
this.callBackManager = callBackManager; this.callBackManager = callBackManager;
} }
private ConnectionInfo authInfo; private OnConnectListener onConnectListener;
private ConnectionInfo chatInfo;
private String token;
private ResultEventCallback<String> loginCallBack;
public String getToken() { private ConnectionInfo chatInfo;
return token;
}
public void setToken(String token) {
this.token = token;
}
public ConnectionInfo getAuthInfo() {
return authInfo;
}
public ConnectionInfo getChatInfo() { public ConnectionInfo getChatInfo() {
...@@ -58,58 +44,32 @@ public class SocketManageer { ...@@ -58,58 +44,32 @@ public class SocketManageer {
} }
public void initAuth() { public void connectChatServer(String appKey, String userName, Long userId,Long ts, String sign) {
//连接参数设置(IP,端口号),这也是一个连接的唯一标识,不同连接,该参数中的两个值至少有其一不一样 Chat.ConnectRequest builder = Chat.ConnectRequest.newBuilder()
this.authInfo = initServer("117.144.156.2", 9000, data -> { .setUsername(userName)
try { .setAppKey(appKey)
Auth.AuthResponseMessage chatResponseMessage = Auth.AuthResponseMessage.parseFrom(data.getBodyBytes()); .setUserId(userId)
logger.info(String.valueOf(chatResponseMessage)); .setTs(ts)
if (chatResponseMessage.getHeader().getCode() == 0) { .setSign(sign)
token = chatResponseMessage.getLoginRes().getToken(); .build();
String server = chatResponseMessage.getLoginRes().getServer();
initChat(server);
OkSocket.open(authInfo).disconnect();
if (loginCallBack != null){
loginCallBack.onSuccess(token);
}
} else {
if (loginCallBack != null){
loginCallBack.onFailed(chatResponseMessage.getHeader().getCode());
}
}
} catch (Exception e) {
e.printStackTrace();
}
});
}
public void login(String username, String password,Long appId, ResultEventCallback<String> resultEventCallback) {
Auth.LoginRequest.Builder builder = Auth.LoginRequest.newBuilder().setUsername(username).setPassword(password).setAppId(appId);
Auth.AuthRequestMessage build = Auth.AuthRequestMessage.newBuilder().setLoginReq(builder.build()).build();
OkSocket.open(getAuthInfo())
.send(new IrequestData(build.toByteArray()));
this.loginCallBack = resultEventCallback;
}
public void connectChatServer() {
if (TextUtils.isEmpty(getToken())) {
return;
}
Chat.ConnectRequest builder = Chat.ConnectRequest.newBuilder().setToken(getToken()).build();
Common.RequestMessageHeader header = Common.RequestMessageHeader.newBuilder().setVersion(1).setSeq(1).build(); Common.RequestMessageHeader header = Common.RequestMessageHeader.newBuilder().setVersion(1).setSeq(1).build();
Chat.ChatRequestMessage build = Chat.ChatRequestMessage.newBuilder().setConnectReq(builder).setHeader(header).build(); Chat.ChatRequestMessage build = Chat.ChatRequestMessage.newBuilder().setConnectReq(builder).setHeader(header).build();
OkSocket.open(getChatInfo()) OkSocket.open(getChatInfo())
.send(new IrequestData(build.toByteArray())); .send(new IrequestData(build.toByteArray()));
callBackManager.addCallBack(idPlus(), new ResultEventCallback<Chat.ChatResponseMessage>() {
@Override
public void onSuccess(Chat.ChatResponseMessage chatResponseMessage) {
onConnectListener.onSocketConnection();
}
});
} }
private void initChat(String server) { public void initChat(String appKey, String userName, Long userId, Long ts, String sign, OnConnectListener resultCallback) {
//连接参数设置(IP,端口号),这也是一个连接的唯一标识,不同连接,该参数中的两个值至少有其一不一样 onConnectListener = resultCallback;
String[] split = server.split(":"); this.chatInfo = initServer(SERVER_IP, SERVER_PORT, new MessageListener() {
this.chatInfo = initServer(split[0], Integer.parseInt(split[1]), new MessageListener() {
@Override @Override
public void onServerConnect() { public void onServerConnect() {
connectChatServer(); connectChatServer(appKey, userName, userId,ts,sign);
} }
@Override @Override
...@@ -120,10 +80,10 @@ public class SocketManageer { ...@@ -120,10 +80,10 @@ public class SocketManageer {
ResultEventCallback<Chat.ChatResponseMessage> callBack = callBackManager.getCallBack(seq); ResultEventCallback<Chat.ChatResponseMessage> callBack = callBackManager.getCallBack(seq);
if (callBack != null) { if (callBack != null) {
if (seq > 0) { if (seq > 0) {
if (chatResponseMessage.getHeader().getCode() == 0) { if (chatResponseMessage.getHeader().getCode() == Common.StatusCode.STATUS_CODE_OK) {
callBack.onSuccess(chatResponseMessage); callBack.onSuccess(chatResponseMessage);
} else { } else {
callBack.onFailed(chatResponseMessage.getHeader().getCode()); callBack.onFailed(chatResponseMessage.getHeader().getCode().getNumber());
} }
if (!chatResponseMessage.hasPullOfflineMsgRes()) { if (!chatResponseMessage.hasPullOfflineMsgRes()) {
callBackManager.removeCallBack(seq); callBackManager.removeCallBack(seq);
...@@ -146,35 +106,27 @@ public class SocketManageer { ...@@ -146,35 +106,27 @@ public class SocketManageer {
//调用OkSocket,开启这次连接的通道,拿到通道Manager //调用OkSocket,开启这次连接的通道,拿到通道Manager
IConnectionManager manager = OkSocket.open(authInfo); IConnectionManager manager = OkSocket.open(authInfo);
//获得当前连接通道的参配对象 //获得当前连接通道的参配对象
OkSocketOptions options = manager.getOption();
//基于当前参配对象构建一个参配建造者类
OkSocketOptions.Builder builder = new OkSocketOptions.Builder(options);
//修改参配设置(其他参配请参阅类文档)
// builder.setSinglePackageBytes(size);
//建造一个新的参配对象并且付给通道
manager.option(builder.build());
//调用通道进行连接
manager.connect();
//设置自定义解析头
OkSocketOptions.Builder okOptionsBuilder = new OkSocketOptions.Builder(); OkSocketOptions.Builder okOptionsBuilder = new OkSocketOptions.Builder();
okOptionsBuilder.setReaderProtocol(new MyIReaderProtocol()); okOptionsBuilder.setReaderProtocol(new MyIReaderProtocol());
okOptionsBuilder.setConnectionHolden(false);
//将新的修改后的参配设置给连接管理器 //将新的修改后的参配设置给连接管理器
manager.option(okOptionsBuilder.build()); manager.option(okOptionsBuilder.build());
//调用通道进行连接
manager.connect();
manager.registerReceiver(new SocketActionAdapter() { manager.registerReceiver(new SocketActionAdapter() {
@Override @Override
public void onSocketConnectionSuccess(ConnectionInfo info, String action) { public void onSocketConnectionSuccess(ConnectionInfo info, String action) {
super.onSocketConnectionSuccess(info, action); super.onSocketConnectionSuccess(info, action);
logger.info("connect success");
messageListener.onServerConnect(); messageListener.onServerConnect();
} }
@Override @Override
public void onSocketDisconnection(ConnectionInfo info, String action, Exception e) { public void onSocketDisconnection(ConnectionInfo info, String action, Exception e) {
super.onSocketDisconnection(info, action, e); super.onSocketDisconnection(info, action, e);
logger.info("disconnect success"); if (onConnectListener != null) {
onConnectListener.onSocketDisconnection();
}
} }
@Override @Override
...@@ -186,8 +138,9 @@ public class SocketManageer { ...@@ -186,8 +138,9 @@ public class SocketManageer {
return authInfo; return authInfo;
} }
public synchronized int sendRequest(Object request) { public int sendRequest(Object request) {
Common.RequestMessageHeader header = Common.RequestMessageHeader.newBuilder().setVersion(version).setSeq(id).build(); int idPlus = idPlus();
Common.RequestMessageHeader header = Common.RequestMessageHeader.newBuilder().setVersion(version).setSeq(idPlus).build();
Chat.ChatRequestMessage.Builder builder = Chat.ChatRequestMessage.newBuilder(); Chat.ChatRequestMessage.Builder builder = Chat.ChatRequestMessage.newBuilder();
builder.setHeader(header); builder.setHeader(header);
if (request instanceof Chat.PullContactsRequest){ if (request instanceof Chat.PullContactsRequest){
...@@ -212,14 +165,10 @@ public class SocketManageer { ...@@ -212,14 +165,10 @@ public class SocketManageer {
builder.setReportIllegalUserReq((Chat.ReportIllegalUserRequest) request); builder.setReportIllegalUserReq((Chat.ReportIllegalUserRequest) request);
} else if (request instanceof Message.SendMessageRequest){ } else if (request instanceof Message.SendMessageRequest){
builder.setSendMsgReq((Message.SendMessageRequest) request); builder.setSendMsgReq((Message.SendMessageRequest) request);
} else if (request instanceof Message.SendGroupMessageRequest){
builder.setSendGroupMsgReq((Message.SendGroupMessageRequest) request);
} else if (request instanceof Message.SendChannelMessageRequest){ } else if (request instanceof Message.SendChannelMessageRequest){
builder.setSendChannelMsgReq((Message.SendChannelMessageRequest) request); builder.setSendChannelMsgReq((Message.SendChannelMessageRequest) request);
} else if (request instanceof Push.PushPrivateMessageAckRequest){ } else if (request instanceof Push.PushPrivateMessageAckRequest){
builder.setPushPrivateMsgAckReq((Push.PushPrivateMessageAckRequest) request); builder.setPushPrivateMsgAckReq((Push.PushPrivateMessageAckRequest) request);
} else if (request instanceof Push.PushGroupMessageAckRequest){
builder.setPushGroupMsgAckReq((Push.PushGroupMessageAckRequest) request);
} else if (request instanceof Push.PushChannelMessageAckRequest){ } else if (request instanceof Push.PushChannelMessageAckRequest){
builder.setPushChannelMsgAckReq((Push.PushChannelMessageAckRequest) request); builder.setPushChannelMsgAckReq((Push.PushChannelMessageAckRequest) request);
} else if (request instanceof Message.PullOfflineMessageRequest){ } else if (request instanceof Message.PullOfflineMessageRequest){
...@@ -229,6 +178,13 @@ public class SocketManageer { ...@@ -229,6 +178,13 @@ public class SocketManageer {
OkSocket.open(getChatInfo()) OkSocket.open(getChatInfo())
.send(new IrequestData(builder.build().toByteArray())); .send(new IrequestData(builder.build().toByteArray()));
return idPlus;
}
public synchronized int idPlus() {
if (id == Integer.MAX_VALUE){
id = 1;
}
return id++; return id++;
} }
......
package com.ccwangluo.ccim.util;
import android.util.Base64;
import android.util.Log;
import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import com.google.common.base.Strings;
import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
/**
* Created by xiang.li on 2015/2/27.
*/
public class HmacUtil {
private final static String LOG_TAG = HmacUtil.class.getName();
public static String stringToSign(String appSecret,String data) {
try {
Mac mac = Mac.getInstance("hmacSHA256");
SecretKeySpec secret = new SecretKeySpec(
appSecret.getBytes("UTF-8"), mac.getAlgorithm());
mac.init(secret);
byte[] bytes = mac.doFinal(data.getBytes());
return bytesToHex(bytes);
} catch (NoSuchAlgorithmException e) {
Log.e(LOG_TAG, "Hash algorithm SHA-1 is not supported", e);
} catch (UnsupportedEncodingException e) {
Log.e(LOG_TAG, "Encoding UTF-8 is not supported", e);
} catch (InvalidKeyException e) {
Log.e(LOG_TAG, "Invalid key", e);
}
return "";
}
public static String bytesToHex(byte[] bytes) {
StringBuffer sb = new StringBuffer();
for(int i = 0; i < bytes.length; i++) {
String hex = Integer.toHexString(bytes[i] & 0xFF);
if(hex.length() < 2){
sb.append(0);
}
sb.append(hex);
}
return sb.toString();
}
}
package com.ccwangluo.ccim.util; package com.ccwangluo.ccim.util;
import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaRecorder; import android.media.MediaRecorder;
import android.os.Build; import android.os.Build;
import android.os.Environment;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
public class MediaHelper { public class MediaHelper {
private MediaRecorder mMediaRecorder; private MediaRecorder mMediaRecorder;
private String mPath;//文件夹
private String mFilePath;//文件 private String mFilePath;//文件
private static MediaHelper mInstance; private static MediaHelper mInstance;
private MediaHelper(String path) {
mPath = path;
}
/**
* 准备播放后的回调
* 这个时候文件夹里已经有文件生成了
* 如果不去释放资源将会一直进行录音
*/
public interface MediaStateListener {
void preparedDone();
}
public MediaStateListener mMediaStateListener;
public void setMediaStateListener(MediaStateListener mediaStateListener) {
mMediaStateListener = mediaStateListener;
}
/** /**
* 单例模式获取 MediaHelper * 单例模式获取 MediaHelper
* 双检锁/双重校验锁 * 双检锁/双重校验锁
*
* @param path
* @return
*/ */
public static MediaHelper getInstance(String path) { public static MediaHelper getInstance() {
if (mInstance == null) { if (mInstance == null) {
synchronized (MediaHelper.class) { synchronized (MediaHelper.class) {
if (mInstance == null) { if (mInstance == null) {
mInstance = new MediaHelper(path); mInstance = new MediaHelper();
} }
} }
} }
...@@ -52,9 +32,18 @@ public class MediaHelper { ...@@ -52,9 +32,18 @@ public class MediaHelper {
/** /**
* 准备录音 * 准备录音
*/ */
public void prepare() { public void prepare(Activity activity) {
try { try {
File fileDir = new File(mPath); if (mMediaRecorder != null){
cancel();
}
String path;
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
path = activity.getExternalFilesDir("test").getAbsolutePath();
} else {
path = activity.getCacheDir().getAbsolutePath();
}
File fileDir = new File(path);
boolean b = !fileDir.exists(); boolean b = !fileDir.exists();
if (b) { if (b) {
fileDir.mkdirs(); fileDir.mkdirs();
...@@ -72,13 +61,10 @@ public class MediaHelper { ...@@ -72,13 +61,10 @@ public class MediaHelper {
mMediaRecorder.setOutputFile(new File(file.getAbsolutePath())); mMediaRecorder.setOutputFile(new File(file.getAbsolutePath()));
} }
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 设置MediaRecorder的音频源为麦克风 mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 设置MediaRecorder的音频源为麦克风
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB); // 设置音频的格式 mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.AAC_ADTS); // 设置音频的格式
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); // 设置音频的编码为AMR_NB mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); // 设置音频的编码为AMR_NB
mMediaRecorder.prepare(); mMediaRecorder.prepare();
mMediaRecorder.start(); mMediaRecorder.start();
if (mMediaStateListener != null) {
mMediaStateListener.preparedDone();
}
} catch (IllegalStateException e) { } catch (IllegalStateException e) {
e.printStackTrace(); e.printStackTrace();
} catch (IOException e) { } catch (IOException e) {
...@@ -89,10 +75,12 @@ public class MediaHelper { ...@@ -89,10 +75,12 @@ public class MediaHelper {
* 释放资源 * 释放资源
*/ */
public void release() { public void release() {
if (mMediaRecorder != null) {
mMediaRecorder.stop(); mMediaRecorder.stop();
mMediaRecorder.release(); mMediaRecorder.release();
mMediaRecorder = null; mMediaRecorder = null;
} }
}
/** /**
* 取消 * 取消
*/ */
...@@ -107,6 +95,24 @@ public class MediaHelper { ...@@ -107,6 +95,24 @@ public class MediaHelper {
mFilePath = null; mFilePath = null;
} }
} }
/**
* 播放
* @param filePath
*/
public void play(String filePath) {
MediaPlayer mediaPlayer = new MediaPlayer();
try {
mediaPlayer.setDataSource(filePath);
mediaPlayer.prepare();
//播放
mediaPlayer.start();
} catch (Exception e) {
e.printStackTrace();
}
}
//获取生成的文件路径 //获取生成的文件路径
public String getFilePath() { public String getFilePath() {
return mFilePath; return mFilePath;
......
syntax = "proto3";
package ccim.protocol;
message CreateChannelRequest {
string name = 1;
bool open = 2;
repeated int64 user_ids = 3;
}
message CreateChannelResponse {
int64 channel_id = 1;
}
message JoinChannelRequest {
int64 channel_id = 1;
}
message JoinChannelResponse {
}
message RemoveMemberRequest {
int64 channel_id = 1;
int64 user_id = 2;
}
message RemoveMemberResponse {}
message ExitChannelRequest {
int64 channel_id = 1;
}
message ExitChannelResponse {
}
...@@ -2,6 +2,7 @@ syntax = "proto3"; ...@@ -2,6 +2,7 @@ syntax = "proto3";
package ccim.protocol; package ccim.protocol;
import "channel.proto";
import "common.proto"; import "common.proto";
import "message.proto"; import "message.proto";
import "push.proto"; import "push.proto";
...@@ -10,24 +11,29 @@ message ChatRequestMessage { ...@@ -10,24 +11,29 @@ message ChatRequestMessage {
RequestMessageHeader header = 1; RequestMessageHeader header = 1;
oneof payload { oneof payload {
ConnectRequest connect_req = 2; ConnectRequest connect_req = 2; // 连接
PullContactsRequest pull_contacts_req = 3; PullContactsRequest pull_contacts_req = 3; // 拉联系人
SearchRequest search_req = 4; SearchRequest search_req = 4; // 查找用户
AddContactRequest add_contact_req = 5; AddContactRequest add_contact_req = 5; // 添加联系人
ContactRequestsRequest contact_requests_req = 6; ContactRequestsRequest contact_requests_req = 6; // 联系人申请列表
CheckContactReqRequest check_contact_req_req = 7; CheckContactReqRequest check_contact_req_req = 7; // 验证联系人申请
CreateContactGroupRequest create_contact_group_req = 8; CreateContactGroupRequest create_contact_group_req = 8; // 创建联系人群组
MoveContactGroupRequest move_contact_group_req = 9; MoveContactGroupRequest move_contact_group_req = 9; // 移动联系人所在群组
DeleteContactRequest delete_contact_req = 10; DeleteContactRequest delete_contact_req = 10; // 删除联系人
BlockContactRequest block_contact_req = 11; BlockContactRequest block_contact_req = 11; // 联系人拉入黑名单
ReportIllegalUserRequest report_illegal_user_req = 12; ReportIllegalUserRequest report_illegal_user_req = 12; // 举报违规用户
SendMessageRequest send_msg_req = 13; PullOfflineMessageRequest pull_offline_msg_req = 13; // 拉取离线消息
SendGroupMessageRequest send_group_msg_req = 14;
SendChannelMessageRequest send_channel_msg_req = 15; CreateChannelRequest create_channel_req = 21; // 创建频道
PushPrivateMessageAckRequest push_private_msg_ack_req = 16; JoinChannelRequest join_channel_req = 22; // 加入频道
PushGroupMessageAckRequest push_group_msg_ack_req = 17; RemoveMemberRequest remove_member_req = 23; // 移除成员
PushChannelMessageAckRequest push_channel_msg_ack_req = 18; ExitChannelRequest exit_channel_req = 24; // 退出频道
PullOfflineMessageRequest pull_offline_msg_req = 19;
SendMessageRequest send_msg_req = 42; // 发送消息
SendChannelMessageRequest send_channel_msg_req = 43; // 发送频道消息
PushPrivateMessageAckRequest push_private_msg_ack_req = 61; // 推送私人消息成功ack
PushChannelMessageAckRequest push_channel_msg_ack_req = 62; // 推送频道消息ack
} }
}; };
...@@ -45,19 +51,31 @@ message ChatResponseMessage { ...@@ -45,19 +51,31 @@ message ChatResponseMessage {
MoveContactGroupResponse move_contact_group_res = 9; MoveContactGroupResponse move_contact_group_res = 9;
DeleteContactResponse delete_contact_res = 10; DeleteContactResponse delete_contact_res = 10;
BlockContactResponse block_contact_res = 11; BlockContactResponse block_contact_res = 11;
ReportIllegalUserResponse report_illegal_user_res = 12; PullOfflineMessageResponse pull_offline_msg_res = 12;
SendMessageResponse send_msg_res = 13;
SendGroupMessageResponse send_group_msg_res = 14; CreateChannelResponse create_channel_res = 21;
SendChannelMessageResponse send_channel_msg_res = 15; JoinChannelResponse join_channel_res = 22;
PushPrivateMessageResponse push_private_msg_res = 16; RemoveMemberResponse remove_member_res = 23;
PushGroupMessageResponse push_group_msg_res = 17; ExitChannelResponse exit_channel_res = 24;
PushChannelMessageResponse push_channel_msg_res = 18;
PullOfflineMessageResponse pull_offline_msg_res = 19; ReportIllegalUserResponse report_illegal_user_res = 41;
SendMessageResponse send_msg_res = 42;
SendChannelMessageResponse send_channel_msg_res = 43;
PushPrivateMessageResponse push_private_msg_res = 61;
PushChannelMessageResponse push_channel_msg_res = 62;
} }
}; };
message ConnectRequest { message ConnectRequest {
string token = 1; string app_key = 1;
int64 user_id = 2;
string username = 3;
int64 ts = 4;
string sign = 5;
// sign使用HMAC加密算法,由接入端的服务端计算完成传给接入端的客户端
// sign = HMAC(app_secret).digestToHex(app_key&user_id&username&ts&app_secret)
// ts=CurrentTimeMillis (毫秒)
} }
message ConnectResponse { message ConnectResponse {
...@@ -88,15 +106,15 @@ message PullContactsResponse { ...@@ -88,15 +106,15 @@ message PullContactsResponse {
Status status = 8; // 联系人状态 Status status = 8; // 联系人状态
string ext_data = 9; // 扩展数据 string ext_data = 9; // 扩展数据
} }
message Group { // message Group {
int64 group_id = 1; // int64 group_id = 1;
int64 app_id = 2; // int64 app_id = 2;
int64 owner_user_id = 3; // int64 owner_user_id = 3;
int32 limited = 4; // int32 limited = 4;
bool muted = 5; // bool muted = 5;
string name = 6; // string name = 6;
string ext_data = 7; // string ext_data = 7;
} // }
message Channel { message Channel {
int64 channel_id = 1; int64 channel_id = 1;
int64 app_id = 2; int64 app_id = 2;
...@@ -108,8 +126,8 @@ message PullContactsResponse { ...@@ -108,8 +126,8 @@ message PullContactsResponse {
} }
repeated ContactGroup contact_groups = 2; // 联系人群组列表 repeated ContactGroup contact_groups = 2; // 联系人群组列表
repeated Contact contacts = 3; // 联系人列表 repeated Contact contacts = 3; // 联系人列表
repeated Group groups = 4; // 群组 // repeated Group groups = 4; // 群组
repeated Channel channels = 5; // 频道 repeated Channel channels = 4; // 频道
} }
message SearchRequest { message SearchRequest {
...@@ -134,7 +152,7 @@ message AddContactResponse { ...@@ -134,7 +152,7 @@ message AddContactResponse {
ALREADY_SENT = 1; ALREADY_SENT = 1;
NO_AUTHORITY = 2; NO_AUTHORITY = 2;
ALREADY_CONTACT = 3; ALREADY_CONTACT = 3;
ACCEPT_REQ = 4; ACCEPT_REQ = 4; // 接受对方的好友申请(对方已经发送申请,自己不必申请直接同意)
} }
AddResult result = 1; AddResult result = 1;
} }
......
...@@ -2,14 +2,38 @@ syntax = "proto3"; ...@@ -2,14 +2,38 @@ syntax = "proto3";
package ccim.protocol; package ccim.protocol;
//enum StatusCode { enum StatusCode {
// OK = 0; STATUS_CODE_OK = 0; // 正常
// UNKNOWN_SERVER_ERROR = 100;
// AUTH_ERROR = 101; STATUS_CODE_SERVER_INTERNAL_ERROR = 10000; // 服务器内部未知错误
// AUTH_INCORRECT_INPUT_ERROR = 102; STATUS_CODE_TOO_FREQUENTLY_ERROR = 10001; // 调用过于频繁
// STATUS_CODE_UNKNOWN_REQUEST_ERROR = 10002; // 未知请求
// CHAT_SERVICE_ERROR = 201; 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; // 无效签名
// CHAT_SERVICE_ERROR = 30000;
STATUS_CODE_CHECK_CONTACT_UPDATED_ERROR = 30001; // 好友请求已同意或拒绝
STATUS_CODE_CONTACT_GROUP_EXCEEDED_LIMIT_ERROR = 30002; // 群组成员到达上限
STATUS_CODE_NOT_CONTACT_ERROR = 30101; // 非好友不能调用该api
STATUS_CODE_USER_MUTED_ERROR = 30102; // 用户被禁言
STATUS_CODE_CONTACT_BLOCKED_ERROR = 30103; // 联系人已被拉入黑名单
STATUS_CODE_CONTACT_BLOCKED_ME_ERROR = 30104; // 联系人已把我拉入黑名单
// 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; // 频道不允许该用户加入
}
message RequestMessageHeader { message RequestMessageHeader {
int32 version = 1; int32 version = 1;
...@@ -19,5 +43,5 @@ message RequestMessageHeader { ...@@ -19,5 +43,5 @@ message RequestMessageHeader {
message ResponseMessageHeader { message ResponseMessageHeader {
int32 version = 1; int32 version = 1;
int32 seq = 2; int32 seq = 2;
int32 code = 3; StatusCode code = 3;
} }
\ No newline at end of file
...@@ -14,15 +14,15 @@ message SendMessageResponse { ...@@ -14,15 +14,15 @@ message SendMessageResponse {
int64 msg_id = 1; int64 msg_id = 1;
} }
message SendGroupMessageRequest { //message SendGroupMessageRequest {
int64 group_id = 1; // int64 group_id = 1;
string content = 2; // string content = 2;
MessageType msg_type = 3; // MessageType msg_type = 3;
} //}
//
message SendGroupMessageResponse { //message SendGroupMessageResponse {
int64 msg_id = 1; // int64 msg_id = 1;
} //}
message SendChannelMessageRequest { message SendChannelMessageRequest {
int64 channel_id = 1; int64 channel_id = 1;
......
...@@ -3,19 +3,22 @@ syntax = "proto3"; ...@@ -3,19 +3,22 @@ syntax = "proto3";
package ccim.protocol; package ccim.protocol;
enum MessageType { enum MessageType {
TEXT = 0; MESSAGE_TYPE_TEXT = 0;
VOICE = 1; MESSAGE_TYPE_VOICE = 1;
} }
enum MessageSourceType { enum MessageSourceType {
PRIVATE = 0; MESSAGE_SOURCE_TYPE_PRIVATE = 0;
GROUP = 1; MESSAGE_SOURCE_TYPE_CHANNEL = 1;
CHANNEL = 2;
} }
message ChatMessage { message ChatMessage {
int64 msg_id = 1; int64 msg_id = 1;
int64 sender_user_id = 2; int64 sender_user_id = 2;
MessageType msg_type = 3; int64 msg_src_id = 3;
string content = 4; MessageSourceType msg_src_type = 4;
MessageType msg_type = 5;
string content = 6;
int64 created_date = 7;
int64 modified_date = 8;
} }
\ No newline at end of file
...@@ -13,16 +13,6 @@ message PushPrivateMessageAckRequest { ...@@ -13,16 +13,6 @@ message PushPrivateMessageAckRequest {
int64 contact_user_id = 2; int64 contact_user_id = 2;
} }
message PushGroupMessageResponse {
int64 group_id = 1;
ChatMessage message = 2;
}
message PushGroupMessageAckRequest {
int64 msg_id = 1;
int64 group_id = 2;
}
message PushChannelMessageResponse { message PushChannelMessageResponse {
int64 channel_id = 1; int64 channel_id = 1;
ChatMessage message = 2; ChatMessage message = 2;
......
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