parent
e8e7f10a0f
commit
a319f90bad
@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<litepal>
|
||||
|
||||
<dbname value="leukemia" />
|
||||
|
||||
<version value="1" />
|
||||
|
||||
<list>
|
||||
<mapping class="com.example.leudaemialikeme.Model.Owner"/>
|
||||
<mapping class="com.example.leudaemialikeme.Model.Message"/>
|
||||
</list>
|
||||
|
||||
</litepal>
|
@ -0,0 +1,84 @@
|
||||
package com.example.leudaemialikeme.Adapter;
|
||||
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.example.leudaemialikeme.Model.Message;
|
||||
import com.example.leudaemialikeme.Model.Owner;
|
||||
import com.example.leudaemialikeme.R;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class ChatAdapter extends RecyclerView.Adapter<ChatAdapter.ViewHolder> {
|
||||
private List<Message> messageList = new ArrayList<>();
|
||||
private Owner owner;
|
||||
|
||||
static class ViewHolder extends RecyclerView.ViewHolder{
|
||||
LinearLayout msg_content_left;
|
||||
LinearLayout msg_content_right;
|
||||
TextView left_msg;
|
||||
TextView right_msg;
|
||||
List<LinearLayout> layouts = new ArrayList<>();
|
||||
public ViewHolder(View view){
|
||||
super(view);
|
||||
msg_content_left = (LinearLayout) view.findViewById(R.id.msg_content_left);
|
||||
msg_content_right = (LinearLayout) view.findViewById(R.id.msg_content_right);
|
||||
left_msg = (TextView) view.findViewById(R.id.left_msg);
|
||||
right_msg = (TextView) view.findViewById(R.id.right_msg);
|
||||
}
|
||||
|
||||
public void setVisibility(LinearLayout layout){
|
||||
for(LinearLayout layout1: layouts){
|
||||
if(layout1==layout){
|
||||
layout1.setVisibility(View.VISIBLE);
|
||||
}else {
|
||||
layout1.setVisibility(View.GONE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
public ChatAdapter(List<Message> messageList, Owner owner){
|
||||
this.messageList = messageList;
|
||||
this.owner = owner;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public ChatAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.msg_content_item,parent,false);
|
||||
ChatAdapter.ViewHolder holder = new ChatAdapter.ViewHolder(view);
|
||||
return holder;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(@NonNull ChatAdapter.ViewHolder holder, int position) {
|
||||
Message message = messageList.get(position);
|
||||
switch (message.getMessageType()){
|
||||
case 1:
|
||||
if(message.getSenderNetId()==owner.getNetId()){
|
||||
holder.setVisibility(holder.msg_content_right);
|
||||
holder.right_msg.setText(message.getContent());
|
||||
}else {
|
||||
holder.setVisibility(holder.msg_content_left);
|
||||
holder.left_msg.setText(message.getContent());
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemCount() {
|
||||
return messageList.size();
|
||||
}
|
||||
}
|
@ -0,0 +1,31 @@
|
||||
package com.example.leudaemialikeme.Controller;
|
||||
|
||||
import android.app.Activity;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class ActivityController {
|
||||
public static List<Activity> activities=new ArrayList<>();
|
||||
|
||||
public static void addActivity(Activity activity){
|
||||
activities.add(activity);
|
||||
}
|
||||
|
||||
public static void removeActivity(Activity activity){
|
||||
activities.remove(activity);
|
||||
activity.finish();
|
||||
}
|
||||
|
||||
public static void finishAll(){
|
||||
for (Activity activity : activities){
|
||||
if (!activity.isFinishing() && !activity.getLocalClassName().equals("activity.LoginActivity")){
|
||||
activity.finish();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static Activity getCurrentActivity(){
|
||||
return activities.get(activities.size()-1);
|
||||
}
|
||||
}
|
@ -0,0 +1,32 @@
|
||||
package com.example.leudaemialikeme.Dao;
|
||||
|
||||
import org.litepal.LitePal;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
public class BaseDao {
|
||||
//添加数据
|
||||
public void insert(Object obj){
|
||||
Class objClass=obj.getClass();
|
||||
try {
|
||||
Method save=objClass.getMethod("save");
|
||||
save.invoke(obj);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
//删除数据
|
||||
public void deleteById(Object obj,int id){
|
||||
LitePal.delete(obj.getClass(),id);
|
||||
}
|
||||
//更新数据
|
||||
public void update(Object obj,int id){
|
||||
Class objClass=obj.getClass();
|
||||
try {
|
||||
Method save=objClass.getMethod("update");
|
||||
save.invoke(obj,id);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,109 @@
|
||||
package com.example.leudaemialikeme.Dao;
|
||||
|
||||
|
||||
import android.database.Cursor;
|
||||
|
||||
import com.example.leudaemialikeme.Model.Message;
|
||||
import com.example.leudaemialikeme.Utils.DBUtil;
|
||||
|
||||
import org.litepal.LitePal;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
|
||||
public class MessageDao extends BaseDao {
|
||||
|
||||
public Message findLastMessage(int friendNetId, int ownerNetId){
|
||||
String fnId=String.valueOf(friendNetId);
|
||||
String onId=String.valueOf(ownerNetId);
|
||||
Cursor cursor=
|
||||
LitePal.findBySQL(
|
||||
"select * from message where (senderNetId = ? AND receiverNetId = ?) OR (senderNetId = ? AND receiverNetId = ?) order by createTime desc limit 1",
|
||||
onId,fnId,
|
||||
fnId,onId);
|
||||
|
||||
ArrayList<Message> messages= DBUtil.cursorToList(cursor,Message.class);
|
||||
if (messages.size()==0){
|
||||
return null;
|
||||
}else {
|
||||
return messages.get(0);
|
||||
}
|
||||
}
|
||||
|
||||
public ArrayList<Message> findUnReadMessage(int ownerNetId){
|
||||
String onId=String.valueOf(ownerNetId);
|
||||
Cursor cursor=
|
||||
LitePal.findBySQL(
|
||||
"select * from message where receiverNetId = ? and flag=0 order by createTime desc limit 1",
|
||||
onId);
|
||||
|
||||
ArrayList<Message> messages=DBUtil.cursorToList(cursor,Message.class);
|
||||
if (messages.size()==0){
|
||||
return null;
|
||||
}else {
|
||||
return messages;
|
||||
}
|
||||
}
|
||||
|
||||
public ArrayList<Message> findNearlyMessage(int friendNetId,int ownerNetId){
|
||||
String fnId=String.valueOf(friendNetId);
|
||||
String onId=String.valueOf(ownerNetId);
|
||||
Cursor cursor=
|
||||
LitePal.findBySQL(
|
||||
"select * from message where (senderNetId = ? AND receiverNetId = ?) OR (senderNetId = ? AND receiverNetId = ?) order by createTime desc limit 20",
|
||||
onId,fnId,
|
||||
fnId,onId);
|
||||
|
||||
ArrayList<Message> messages=DBUtil.cursorToList(cursor,Message.class);
|
||||
Collections.reverse(messages);
|
||||
|
||||
if (messages.size()==0||messages==null){
|
||||
return new ArrayList<Message>();
|
||||
}
|
||||
return messages;
|
||||
}
|
||||
|
||||
public void changeMsgStatus(int friendNetId,int ownerNetId){
|
||||
String fnId=String.valueOf(friendNetId);
|
||||
String onId=String.valueOf(ownerNetId);
|
||||
Cursor cursor=
|
||||
LitePal.findBySQL(
|
||||
"select * from message where senderNetId = ? AND receiverNetId = ? AND flag= 0",
|
||||
fnId,onId);
|
||||
|
||||
ArrayList<Message> messages=DBUtil.cursorToList(cursor,Message.class);
|
||||
if (messages !=null || messages.size()>0){
|
||||
for (Message message : messages){
|
||||
message.setFlag(1);
|
||||
message.update(message.getId());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public ArrayList<Message> findAllMessage(int friendNetId,int ownerNetId){
|
||||
String fnId=String.valueOf(friendNetId);
|
||||
String onId=String.valueOf(ownerNetId);
|
||||
Cursor cursor=
|
||||
LitePal.findBySQL(
|
||||
"select * from message where (senderNetId = ? AND receiverNetId = ?) OR (senderNetId = ? AND receiverNetId = ?) order by createtime desc",
|
||||
onId,fnId,
|
||||
fnId,onId);
|
||||
|
||||
ArrayList<Message> messages=DBUtil.cursorToList(cursor,Message.class);
|
||||
Collections.reverse(messages);
|
||||
|
||||
if (messages.size()==0||messages==null){
|
||||
return new ArrayList<Message>();
|
||||
}
|
||||
return messages;
|
||||
}
|
||||
|
||||
public void delete(int friendNetId,int ownerNetId){
|
||||
String fnId=String.valueOf(friendNetId);
|
||||
String onId=String.valueOf(ownerNetId);
|
||||
LitePal.deleteAll(Message.class,
|
||||
"(senderNetId = ? AND receiverNetId = ?) OR (senderNetId = ? AND receiverNetId = ?)",
|
||||
fnId,onId,
|
||||
onId,fnId);
|
||||
}
|
||||
}
|
@ -0,0 +1,29 @@
|
||||
package com.example.leudaemialikeme.Dao;
|
||||
|
||||
|
||||
import com.example.leudaemialikeme.Model.Owner;
|
||||
|
||||
import org.litepal.LitePal;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class OwnerDao extends BaseDao {
|
||||
|
||||
public Owner findOwnerByNetId(int netId){
|
||||
ArrayList<Owner> owner= (ArrayList<Owner>) LitePal.where("netId = ?", String.valueOf(netId)).find(Owner.class);
|
||||
if (owner.size()==0){
|
||||
return null;
|
||||
}else {
|
||||
return owner.get(0);
|
||||
}
|
||||
}
|
||||
|
||||
public Owner findOwnerByUsername(String username){
|
||||
ArrayList<Owner> owner= (ArrayList<Owner>) LitePal.where("username = ?", username).find(Owner.class);
|
||||
if (owner.size()==0){
|
||||
return null;
|
||||
}else {
|
||||
return owner.get(0);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,57 @@
|
||||
package com.example.leudaemialikeme.Model;
|
||||
|
||||
public class Chat {
|
||||
private int friendId;
|
||||
private String friendName;
|
||||
private String lastMessage;
|
||||
private int flag;
|
||||
private String time;
|
||||
|
||||
public Chat(int friendId, String friendName, String lastMessage, int flag, String time) {
|
||||
this.friendId = friendId;
|
||||
this.friendName = friendName;
|
||||
this.lastMessage = lastMessage;
|
||||
this.flag = flag;
|
||||
this.time = time;
|
||||
}
|
||||
|
||||
public int getFriendId() {
|
||||
return friendId;
|
||||
}
|
||||
|
||||
public void setFriendId(int friendId) {
|
||||
this.friendId = friendId;
|
||||
}
|
||||
|
||||
public String getFriendName() {
|
||||
return friendName;
|
||||
}
|
||||
|
||||
public void setFriendName(String friendName) {
|
||||
this.friendName = friendName;
|
||||
}
|
||||
|
||||
public String getLastMessage() {
|
||||
return lastMessage;
|
||||
}
|
||||
|
||||
public void setLastMessage(String lastMessage) {
|
||||
this.lastMessage = lastMessage;
|
||||
}
|
||||
|
||||
public int getFlag() {
|
||||
return flag;
|
||||
}
|
||||
|
||||
public void setFlag(int flag) {
|
||||
this.flag = flag;
|
||||
}
|
||||
|
||||
public String getTime() {
|
||||
return time;
|
||||
}
|
||||
|
||||
public void setTime(String time) {
|
||||
this.time = time;
|
||||
}
|
||||
}
|
@ -0,0 +1,104 @@
|
||||
package com.example.leudaemialikeme.Model;
|
||||
|
||||
import com.example.leudaemialikeme.service.WebSocketClient;
|
||||
|
||||
import org.litepal.crud.LitePalSupport;
|
||||
|
||||
public class Message extends LitePalSupport {
|
||||
private int id;
|
||||
private int senderNetId;
|
||||
private int receiverNetId;
|
||||
private String content;
|
||||
private int messageType;
|
||||
private long createTime;
|
||||
private int flag;
|
||||
|
||||
public Message() {
|
||||
super();
|
||||
}
|
||||
|
||||
public Message(int senderNetId, int receiverNetId, String content) {
|
||||
this.senderNetId = senderNetId;
|
||||
this.receiverNetId = receiverNetId;
|
||||
this.content = content;
|
||||
this.flag = 0;
|
||||
this.createTime = System.currentTimeMillis();
|
||||
this.messageType = WebSocketClient.MSG_TEXT;
|
||||
}
|
||||
|
||||
public Message(int senderNetId, int receiverNetId, String content, int messageType) {
|
||||
this.senderNetId = senderNetId;
|
||||
this.receiverNetId = receiverNetId;
|
||||
this.content = content;
|
||||
this.messageType = messageType;
|
||||
this.flag = 0;
|
||||
this.createTime = System.currentTimeMillis();
|
||||
}
|
||||
|
||||
public Message(int senderNetId, int receiverNetId, int messageType, String content, long createTime) {
|
||||
this.senderNetId = senderNetId;
|
||||
this.receiverNetId = receiverNetId;
|
||||
this.messageType = messageType;
|
||||
this.content = content;
|
||||
this.createTime = createTime;
|
||||
this.flag = 0;
|
||||
}
|
||||
|
||||
public int getMessageType() {
|
||||
return messageType;
|
||||
}
|
||||
|
||||
public void setMessageType(int messageType) {
|
||||
this.messageType = messageType;
|
||||
}
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(int id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public int getSenderNetId() {
|
||||
return senderNetId;
|
||||
}
|
||||
|
||||
public void setSenderNetId(int senderNetId) {
|
||||
this.senderNetId = senderNetId;
|
||||
}
|
||||
|
||||
public int getReceiverNetId() {
|
||||
return receiverNetId;
|
||||
}
|
||||
|
||||
public void setReceiverNetId(int receiverNetId) {
|
||||
this.receiverNetId = receiverNetId;
|
||||
}
|
||||
|
||||
public String getContent() {
|
||||
return content;
|
||||
}
|
||||
|
||||
public void setContent(String content) {
|
||||
this.content = content;
|
||||
}
|
||||
|
||||
public long getCreateTime() {
|
||||
return createTime;
|
||||
}
|
||||
|
||||
public void setCreateTime(long createTime) {
|
||||
this.createTime = createTime;
|
||||
}
|
||||
|
||||
public int getFlag() {
|
||||
return flag;
|
||||
}
|
||||
|
||||
public void setFlag(int flag) {
|
||||
this.flag = flag;
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,49 @@
|
||||
package com.example.leudaemialikeme.Model;
|
||||
|
||||
import org.litepal.annotation.Column;
|
||||
import org.litepal.crud.LitePalSupport;
|
||||
|
||||
public class Owner extends LitePalSupport {
|
||||
private int id; //本地数据库自增id
|
||||
@Column(unique = true)
|
||||
private int netId; //mysql自增id
|
||||
@Column(unique = true)
|
||||
private String username;
|
||||
private String password;
|
||||
|
||||
public Owner(){
|
||||
super();
|
||||
}
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(int id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public int getNetId() {
|
||||
return netId;
|
||||
}
|
||||
|
||||
public void setNetId(int netId) {
|
||||
this.netId = netId;
|
||||
}
|
||||
|
||||
public String getUsername() {
|
||||
return username;
|
||||
}
|
||||
|
||||
public void setUsername(String username) {
|
||||
this.username = username;
|
||||
}
|
||||
|
||||
public String getPassword() {
|
||||
return password;
|
||||
}
|
||||
|
||||
public void setPassword(String password) {
|
||||
this.password = password;
|
||||
}
|
||||
}
|
@ -0,0 +1,38 @@
|
||||
package com.example.leudaemialikeme.Receiver;
|
||||
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
|
||||
import com.example.leudaemialikeme.Activity.BaseActivity;
|
||||
import com.example.leudaemialikeme.Activity.LoginActivity;
|
||||
import com.example.leudaemialikeme.Controller.ActivityController;
|
||||
|
||||
|
||||
public class ForceOfflineReceiver extends BroadcastReceiver {
|
||||
|
||||
@Override
|
||||
public void onReceive(final Context context, final Intent intent) {
|
||||
//创建一个弹窗,不可取消类型
|
||||
String warringMsg=intent.getStringExtra("warringMsg");
|
||||
AlertDialog.Builder builder=new AlertDialog.Builder(context);
|
||||
builder.setTitle("警告");
|
||||
builder.setMessage(warringMsg);
|
||||
builder.setCancelable(false);
|
||||
builder.setPositiveButton("退出", new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
ActivityController.finishAll();
|
||||
//关闭WS
|
||||
BaseActivity.wsClient.close();
|
||||
BaseActivity.isNeedReconnect=false;
|
||||
Intent intent1=new Intent(context, LoginActivity.class);
|
||||
context.startActivity(intent1);
|
||||
}
|
||||
});
|
||||
builder.show();
|
||||
}
|
||||
}
|
@ -0,0 +1,52 @@
|
||||
package com.example.leudaemialikeme.Utils;
|
||||
|
||||
import android.database.Cursor;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class DBUtil {
|
||||
public static ArrayList cursorToList(Cursor cursor,Class objClass) {
|
||||
try {
|
||||
ArrayList objList=new ArrayList();
|
||||
//获取全部字段名
|
||||
Field[] fields=objClass.getDeclaredFields();
|
||||
//通过fieldName获取指定数据
|
||||
while (cursor.moveToNext()){
|
||||
Object newObj=objClass.newInstance();
|
||||
for (Field field : fields){
|
||||
field.setAccessible(true);
|
||||
String colName=field.getName().toLowerCase();
|
||||
Class fileType=field.getType();
|
||||
int valueIndex=cursor.getColumnIndex(colName);
|
||||
Object value=null;
|
||||
//根据字段类型判断调用哪个方法/String/Int/Long/boolean
|
||||
switch (fileType.getSimpleName()){
|
||||
case "String":
|
||||
value=cursor.getString(valueIndex);
|
||||
break;
|
||||
case "int":
|
||||
value=cursor.getInt(valueIndex);
|
||||
break;
|
||||
case "long":
|
||||
value=cursor.getLong(valueIndex);
|
||||
break;
|
||||
case "boolean":
|
||||
int dbVal=cursor.getInt(valueIndex);
|
||||
value=true;
|
||||
if (dbVal == 0){
|
||||
value=false;
|
||||
}
|
||||
}
|
||||
field.set(newObj,value);
|
||||
}
|
||||
objList.add(newObj);
|
||||
}
|
||||
return objList;
|
||||
}catch (Exception e){
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,85 @@
|
||||
package com.example.leudaemialikeme.Utils;
|
||||
|
||||
import android.util.Log;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import okhttp3.Callback;
|
||||
import okhttp3.FormBody;
|
||||
import okhttp3.OkHttpClient;
|
||||
import okhttp3.Request;
|
||||
import okhttp3.RequestBody;
|
||||
import okhttp3.Response;
|
||||
|
||||
public class OkHttpUtil {
|
||||
private static OkHttpClient client = new OkHttpClient();
|
||||
private static Gson gson = new Gson();
|
||||
//同步GET请求
|
||||
public static String synGet(String url){
|
||||
try{
|
||||
Request request = new Request.Builder()
|
||||
.url(url)
|
||||
.build();
|
||||
Response response = client.newCall(request).execute();
|
||||
return response.body().string();
|
||||
}catch (Exception e){
|
||||
Log.d("ok http","ok http is error");
|
||||
e.printStackTrace();
|
||||
return "error";
|
||||
}
|
||||
}
|
||||
//同步POST请求
|
||||
public static String synPost(String url, Map params){
|
||||
try{
|
||||
|
||||
String jsonStr= gson.toJson(params);
|
||||
RequestBody requestBody=new FormBody.Builder()
|
||||
.add("jsonStr",jsonStr)
|
||||
.build();
|
||||
|
||||
Request request = new Request.Builder()
|
||||
.url(url)
|
||||
.post(requestBody)
|
||||
.build();
|
||||
Response response = client.newCall(request).execute();
|
||||
return response.body().string();
|
||||
}catch (Exception e){
|
||||
Log.d("ok http","ok http is error");
|
||||
e.printStackTrace();
|
||||
return "error";
|
||||
}
|
||||
}
|
||||
//异步GET请求
|
||||
public static void asyGet(String url, Callback callback){
|
||||
try{
|
||||
Request request = new Request.Builder()
|
||||
.url(url)
|
||||
.build();
|
||||
client.newCall(request).enqueue(callback);
|
||||
}catch (Exception e){
|
||||
Log.d("ok http","ok http is error");
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
//异步POST请求
|
||||
public static void asyPost(String url, Map params, Callback callback){
|
||||
try{
|
||||
String jsonStr = gson.toJson(params);
|
||||
RequestBody requestBody=new FormBody.Builder()
|
||||
.add("jsonStr",jsonStr)
|
||||
.build();
|
||||
|
||||
Request request = new Request.Builder()
|
||||
.url(url)
|
||||
.post(requestBody)
|
||||
.build();
|
||||
client.newCall(request).enqueue(callback);
|
||||
}catch (Exception e){
|
||||
Log.d("ok http","ok http is error");
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,186 @@
|
||||
package com.example.leudaemialikeme.service;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.util.Log;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.example.leudaemialikeme.Activity.BaseActivity;
|
||||
import com.example.leudaemialikeme.Activity.ChatActivity;
|
||||
import com.example.leudaemialikeme.Controller.ActivityController;
|
||||
import com.example.leudaemialikeme.Model.Message;
|
||||
import com.example.leudaemialikeme.Utils.OkHttpUtil;
|
||||
import com.google.gson.Gson;
|
||||
|
||||
import org.java_websocket.drafts.Draft_6455;
|
||||
import org.java_websocket.handshake.ServerHandshake;
|
||||
|
||||
import java.net.URI;
|
||||
|
||||
public class WebSocketClient extends org.java_websocket.client.WebSocketClient {
|
||||
|
||||
private Activity currentActivity;
|
||||
private ChatActivity chatActivity;///////////////////
|
||||
// private PrivateMsgFragment privateMsgFragment;////////////////////////
|
||||
// private FriendDao friendDao;
|
||||
private Gson gson = new Gson();
|
||||
|
||||
public static final int MSG_TEXT=1;
|
||||
public static final int MSG_IMAGE=2;
|
||||
public static final int MSG_SYSTEM=3;
|
||||
|
||||
|
||||
public WebSocketClient(URI serverURI){
|
||||
super(serverURI,new Draft_6455());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onOpen(ServerHandshake handshakedata) {
|
||||
Log.d("WS","链接开启");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMessage(String message){
|
||||
try {
|
||||
// friendDao=new FriendDao();
|
||||
Log.d("WS",message);
|
||||
//提取消息
|
||||
Message unReadMsg= gson.fromJson(message, Message.class);
|
||||
String content=(String) unReadMsg.getContent();
|
||||
int messageType=(int)unReadMsg.getMessageType();
|
||||
int receiverId=(int)unReadMsg.getReceiverNetId();
|
||||
int senderId=(int)unReadMsg.getSenderNetId();
|
||||
long createTime=(long) unReadMsg.getCreateTime();
|
||||
Message newMessage=new Message(senderId,receiverId,messageType, content, createTime);
|
||||
//获取当前活动对象
|
||||
currentActivity= ActivityController.getCurrentActivity();
|
||||
// //判断消息发送者是否为本地好友,如果不是本地好友,需要进行好友同步,0表示是系统发送的消息
|
||||
// if (senderId!=0){
|
||||
// Friend friend=friendDao.findByNetId(senderId,receiverId);
|
||||
// if (friend==null){
|
||||
// getNewFriends(senderId,receiverId);
|
||||
// }
|
||||
// }
|
||||
|
||||
//根据消息类型进行判断
|
||||
/****/
|
||||
String currentActivityName=currentActivity.getLocalClassName();
|
||||
if (messageType==MSG_SYSTEM){
|
||||
if (content.equals("offline")){
|
||||
offline();
|
||||
}
|
||||
}else {
|
||||
//如果当前活动为聊天活动则进行数据展示
|
||||
if (currentActivityName.equals("activity.ChatActivity")){
|
||||
updateChatUi(newMessage);
|
||||
//如果当前活动为聊天列表界面,需要对指定的元素进行局部更新,如果没有该用户在聊天列表中,需要添加该好友项
|
||||
// }else if (currentActivityName.equals("activity.ChatListActivity")){
|
||||
// newMessage.save();
|
||||
// updateChatListUi();
|
||||
}else{
|
||||
newMessage.save();
|
||||
notification();
|
||||
}
|
||||
}
|
||||
/****/
|
||||
}catch (Exception e){
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public void offline(){
|
||||
currentActivity.runOnUiThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
Intent intent=new Intent("FORCE_OFFLINE");
|
||||
intent.putExtra("warringMsg","您的账号异地登录,您将被强制下线");
|
||||
currentActivity.sendBroadcast(intent);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void updateChatUi(final Message newMessage){
|
||||
currentActivity.runOnUiThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
//TODO
|
||||
// chatActivity=(ChatActivity) currentActivity;
|
||||
// //如果当前正在聊天的人为消息的发送者,则进行展示,并存为已读消息
|
||||
// if (chatActivity.friendNetId==newMessage.getSenderNetId()){
|
||||
// chatActivity.addMsg(newMessage,true);
|
||||
// }
|
||||
// //如果当前正在聊天的人不是消息发送者,则更新一个未读标记
|
||||
// else {
|
||||
// chatActivity.hasNewMsgView.setVisibility(View.VISIBLE);
|
||||
// newMessage.setRead(false);
|
||||
// newMessage.save();
|
||||
// }
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// public void updateChatListUi(){
|
||||
// currentActivity.runOnUiThread(new Runnable() {
|
||||
// @Override
|
||||
// public void run() {
|
||||
// privateMsgFragment =(ChatListActivity) currentActivity;
|
||||
// chatListActivity.updateUi();
|
||||
// }
|
||||
// });
|
||||
// }
|
||||
public void notification(){
|
||||
currentActivity.runOnUiThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
Toast.makeText(currentActivity,"您有新的消息,请查收",Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClose(int code, String reason, boolean remote) {
|
||||
Log.d("WS","链接关闭");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(Exception ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
|
||||
//好友数据同步
|
||||
private void getNewFriends(final int friendNetId,final int ownerNetId){
|
||||
new Thread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
String url = BaseActivity.SERVER_URL + "/user/getNewFriendById/"+ownerNetId+"/"+friendNetId;
|
||||
String jsonStr= OkHttpUtil.synGet(url);
|
||||
getNewFriendsResponse(jsonStr);
|
||||
}catch (Exception e){
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}).start();
|
||||
}
|
||||
private void getNewFriendsResponse(final String jsonStr){
|
||||
currentActivity.runOnUiThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
//TODO
|
||||
// Map jsonMap= JSON.parseObject(jsonStr);
|
||||
// final String message=(String) jsonMap.get("message");
|
||||
// if (message.equals("success")){
|
||||
// JSONObject newFriend=(JSONObject) jsonMap.get("data");
|
||||
// int netId=newFriend.getIntValue("id");
|
||||
// int ownerNetId=BaseActivity.owner.getNetId();
|
||||
// String name=newFriend.getString("name");
|
||||
// String url=BaseActivity.SERVER_URL+newFriend.getString("imagePath");
|
||||
// String username=newFriend.getString("username");
|
||||
// Friend friend=new Friend(netId,username,name,url,ownerNetId);
|
||||
// friend.save();
|
||||
// Toast.makeText(currentActivity,"你有新的好友与消息",Toast.LENGTH_SHORT).show();
|
||||
// }
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<network-security-config>
|
||||
<base-config cleartextTrafficPermitted="true" />
|
||||
</network-security-config>
|
Loading…
Reference in new issue