diff --git a/Code/LeudaemiaLikeMe/app/src/main/AndroidManifest.xml b/Code/LeudaemiaLikeMe/app/src/main/AndroidManifest.xml index c0277ac..0150d1d 100644 --- a/Code/LeudaemiaLikeMe/app/src/main/AndroidManifest.xml +++ b/Code/LeudaemiaLikeMe/app/src/main/AndroidManifest.xml @@ -7,9 +7,10 @@ tools:targetApi="n"> + - + + diff --git a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/BaseActivity.java b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/BaseActivity.java index 7958f22..8d66ad5 100644 --- a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/BaseActivity.java +++ b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/BaseActivity.java @@ -31,7 +31,7 @@ public class BaseActivity extends AppCompatActivity { public static Owner owner; //服务器链接 - public static String SERVER_IP = "172.30.87.197"; + public static String SERVER_IP = "192.168.43.206"; // static { // try { @@ -122,6 +122,7 @@ public class BaseActivity extends AppCompatActivity { mHandler.postDelayed(heartBeatRunnable, HEART_BEAT_RATE); try { wsClient.connectBlocking(); + Log.d("ws:","连接成功"); } catch (InterruptedException e) { e.printStackTrace(); } diff --git a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/ChatActivity.java b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/ChatActivity.java index d388afe..0212b3d 100644 --- a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/ChatActivity.java +++ b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/ChatActivity.java @@ -1,17 +1,121 @@ package com.example.leudaemialikeme.Activity; +import android.content.Intent; import android.os.Bundle; +import android.view.KeyEvent; +import android.view.View; +import android.view.inputmethod.EditorInfo; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ImageButton; +import android.widget.TextView; -import com.example.leudaemialikeme.R; - -public class ChatActivity extends BaseActivity { +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import com.example.leudaemialikeme.Adapter.ChatAdapter; +import com.example.leudaemialikeme.Dao.FriendDao; +import com.example.leudaemialikeme.Dao.MessageDao; +import com.example.leudaemialikeme.Model.Friend; +import com.example.leudaemialikeme.Model.Message; +import com.example.leudaemialikeme.Model.MessageItemView; +import com.example.leudaemialikeme.R; +import com.google.gson.Gson; +import java.util.ArrayList; +public class ChatActivity extends BaseActivity { + private MessageDao messageDao = new MessageDao(); + private FriendDao friendDao = new FriendDao(); + private ImageButton bt_chat_to_chat_list; + private RecyclerView msg_recycler_view; + private TextView text_chat_name; + private EditText edit_content; + private Button bt_send_msg; + public int friendNetId; + private Friend currentFriend; + private ArrayList messageList = new ArrayList(); + private MessageItemView msgItemView; + private ChatAdapter chatAdapter; + private Gson gson = new Gson(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_chat); + bt_chat_to_chat_list = findViewById(R.id.bt_chat_to_chat_list); + msg_recycler_view = findViewById(R.id.msg_recycler_view); + text_chat_name = findViewById(R.id.text_chat_name); + edit_content = findViewById(R.id.edit_content); + bt_send_msg = findViewById(R.id.bt_send_msg); + + initData(); + text_chat_name.setText(currentFriend.getUsername()); + + LinearLayoutManager layoutManager = new LinearLayoutManager(this); + msg_recycler_view.setLayoutManager(layoutManager); + chatAdapter = new ChatAdapter(msgItemView); + msg_recycler_view.setAdapter(chatAdapter); + msg_recycler_view.scrollToPosition(messageList.size() - 1); + edit_content.setImeOptions(EditorInfo.IME_ACTION_SEND); + edit_content.setInputType(EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE); + edit_content.setMaxLines(2); + edit_content.setSingleLine(false); + edit_content.setOnEditorActionListener(new TextView.OnEditorActionListener() { + @Override + public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { + if (actionId == EditorInfo.IME_ACTION_SEND + || actionId == EditorInfo.IME_ACTION_DONE + || (event != null && KeyEvent.KEYCODE_ENTER == event.getKeyCode() && KeyEvent.ACTION_DOWN == event.getAction())) { + String content=edit_content.getText().toString(); + if (!content.equals("")){ + Message message =new Message(owner.getNetId(),currentFriend.getNetId(),content); + addMsg(message,1); + edit_content.setText(""); + wsClient.send(gson.toJson(message)); + } + } + return false; + } + }); + bt_send_msg.setOnClickListener(new View.OnClickListener(){ + + @Override + public void onClick(View v) { + String content=edit_content.getText().toString(); + if (!content.equals("")){ + Message message =new Message(owner.getNetId(),currentFriend.getNetId(),content); + addMsg(message,1); + edit_content.setText(""); + wsClient.send(gson.toJson(message)); + } + } + }); + bt_chat_to_chat_list.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + } + + private void initData() { + //从intent中取出currentNetId并查出对象 + Intent intent = getIntent(); + friendNetId = intent.getIntExtra("friendNetId", -1); + currentFriend = friendDao.findByNetId(friendNetId, owner.getNetId()); + //从数据库中查找聊天记录-默认最近20条记录 + messageList = messageDao.findNearlyMessage(friendNetId, owner.getNetId()); + //组装成MessageItemViw + msgItemView = new MessageItemView(currentFriend, owner, messageList); + } + + //消息添加方法 + public void addMsg(Message message, int isRead) { + msgItemView.messages.add(message); + chatAdapter.notifyItemInserted(messageList.size() - 1); + msg_recycler_view.scrollToPosition(messageList.size() - 1); + message.setFlag(isRead); + message.save(); } } \ No newline at end of file diff --git a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/LoginActivity.java b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/LoginActivity.java index 5fe6279..0f4e08b 100644 --- a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/LoginActivity.java +++ b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/LoginActivity.java @@ -1,6 +1,7 @@ package com.example.leudaemialikeme.Activity; import android.content.Intent; +import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.view.View; import android.widget.Button; @@ -15,6 +16,9 @@ import com.example.leudaemialikeme.Model.User; import com.example.leudaemialikeme.R; import com.example.leudaemialikeme.Utils.OkHttpUtil; import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + +import org.litepal.LitePal; import java.util.HashMap; import java.util.List; @@ -31,6 +35,9 @@ public class LoginActivity extends BaseActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); + //获取数据库 + SQLiteDatabase db = LitePal.getDatabase(); + edit_username = findViewById(R.id.edit_username); edit_pwd = findViewById(R.id.edit_pwd); bt_login = findViewById(R.id.bt_login); @@ -112,14 +119,14 @@ public class LoginActivity extends BaseActivity { @Override public void run() { Gson gson = new Gson(); - Map jsonMap= gson.fromJson(jsonStr, Map.class); + Map jsonMap= gson.fromJson(jsonStr, new TypeToken >() {}.getType()); final String message=(String) jsonMap.get("message"); if (message.equals("success")){ //进行本地数据存储,本地数据库不存储密码,防止泄露,需要补全imageURL路径 // JSONObject data=(JSONObject) jsonMap.get("data"); // JSONObject netUser=(JSONObject) data.get("owner"); // JSONArray netFriends=(JSONArray) data.get("friends"); - User user = (User)jsonMap.get("user"); + User user = gson.fromJson(jsonMap.get("user"), User.class); // Owner newOwner = new Owner(); newOwner.setUsername(user.getUsername()); @@ -174,11 +181,11 @@ public class LoginActivity extends BaseActivity { @Override public void run() { Gson gson = new Gson(); - Map jsonMap= gson.fromJson(jsonStr, Map.class); + Map jsonMap= gson.fromJson(jsonStr, new TypeToken >() {}.getType()); final String message=(String) jsonMap.get("message"); if (message.equals("success")){ //进行本地消息存储 - List msgList = (List)jsonMap.get("msgList"); + List msgList = gson.fromJson(jsonMap.get("msgList"), new TypeToken >() {}.getType()); for (int i=0;i { - private List messageList = new ArrayList<>(); + private List messageList = new ArrayList(); private Owner owner; + private Friend friend; static class ViewHolder extends RecyclerView.ViewHolder{ LinearLayout msg_content_left; @@ -45,13 +48,12 @@ public class ChatAdapter extends RecyclerView.Adapter { } } - public ChatAdapter(List messageList, Owner owner){ - this.messageList = messageList; - this.owner = owner; + public ChatAdapter(MessageItemView messageItemView){ + this.messageList = messageItemView.messages; + this.owner = messageItemView.owner; + this.friend = messageItemView.friend; } - - @NonNull @Override public ChatAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { diff --git a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Adapter/MsgAdapter.java b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Adapter/MsgAdapter.java index c738c1f..ac2544c 100644 --- a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Adapter/MsgAdapter.java +++ b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Adapter/MsgAdapter.java @@ -1,5 +1,6 @@ package com.example.leudaemialikeme.Adapter; +import android.content.Intent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -10,31 +11,39 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; -import com.example.leudaemialikeme.Model.Msg; +import com.example.leudaemialikeme.Activity.BaseActivity; +import com.example.leudaemialikeme.Activity.ChatActivity; +import com.example.leudaemialikeme.Dao.MessageDao; +import com.example.leudaemialikeme.Model.Chat; import com.example.leudaemialikeme.R; import java.util.List; public class MsgAdapter extends RecyclerView.Adapter { - private List msgList; + private List chatList; + private MessageDao messageDao = new MessageDao(); static class ViewHolder extends RecyclerView.ViewHolder{ ImageView portrait; TextView nickname; TextView introduction; LinearLayout linear_msg; + ImageView point; + TextView chat_friend_id; public ViewHolder(View view){ super(view); portrait = (ImageView)view.findViewById(R.id.img_portrait); nickname = (TextView)view.findViewById(R.id.text_nickname); introduction = (TextView)view.findViewById(R.id.text_introduction); linear_msg = (LinearLayout)view.findViewById(R.id.linear_msg); + point = (ImageView)view.findViewById(R.id.img_unread); + chat_friend_id = (TextView)view.findViewById(R.id.chat_friend_id); } } - public MsgAdapter(List msgList) { - this.msgList = msgList; + public MsgAdapter(List chatList) { + this.chatList = chatList; } @NonNull @@ -42,27 +51,41 @@ public class MsgAdapter extends RecyclerView.Adapter { public MsgAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.pivate_msg_item,parent,false); MsgAdapter.ViewHolder holder=new MsgAdapter.ViewHolder(view); - holder.linear_msg.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - //TODO 跳转到聊天界面 - } - }); +// holder.linear_msg.setOnClickListener(new View.OnClickListener() { +// @Override +// public void onClick(View view) { +// +// Intent intent = new Intent(view.getContext(), ChatActivity.class); +// intent.putExtra("friendId", fdddddddd); +// } +// }); return holder; } @Override public void onBindViewHolder(@NonNull MsgAdapter.ViewHolder holder, int position) { - Msg msg = msgList.get(position); - holder.portrait.setImageResource(msg.getPortraitID()); - holder.introduction.setText(String.valueOf(msg.getIntroduction())); - holder.nickname.setText(msg.getNickname()); - + Chat chat = chatList.get(position); + holder.introduction.setText(String.valueOf(chat.getLastMessage())); + holder.nickname.setText(chat.getFriendName()); + holder.chat_friend_id.setText(String.valueOf(chat.getFriendId())); + if(chat.getFlag()==1){ + holder.point.setVisibility(View.GONE); + } + holder.itemView.setOnClickListener(new View.OnClickListener(){ + @Override + public void onClick(View v) { + messageDao.changeMsgStatus(Integer.parseInt(holder.chat_friend_id.getText().toString()), BaseActivity.owner.getNetId()); + Intent intent = new Intent(v.getContext(), ChatActivity.class); + intent.putExtra("friendNetId",holder.chat_friend_id.getText().toString()); + v.getContext().startActivity(intent); +// checkFriendRequest(params); + } + }); } @Override public int getItemCount() { - return msgList.size(); + return chatList.size(); } } diff --git a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Dao/FriendDao.java b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Dao/FriendDao.java new file mode 100644 index 0000000..fd9080d --- /dev/null +++ b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Dao/FriendDao.java @@ -0,0 +1,43 @@ +package com.example.leudaemialikeme.Dao; + +import com.example.leudaemialikeme.Model.Friend; + +import org.litepal.LitePal; + +import java.util.ArrayList; + +public class FriendDao extends BaseDao{ + + public ArrayList findFriendListByOwnerNetId(int ownerNetId){ + ArrayList friendList=(ArrayList)LitePal.where("ownerNetId = ?", String.valueOf(ownerNetId)).find(Friend.class); + return friendList; + } + + public ArrayList findChatFriendList(int ownerNetId){ + ArrayList friendList=(ArrayList)LitePal.where("ownerNetId = ? AND isChat = ?", String.valueOf(ownerNetId),"1").find(Friend.class); + return friendList; + } + + public Friend findByNetId(int netId,int ownerNetId){ + ArrayList friendList=(ArrayList)LitePal.where("netId = ? and ownerNetId = ?", String.valueOf(netId),String.valueOf(ownerNetId)).find(Friend.class); + if (friendList.size()==0){ + return null; + } + return friendList.get(0); + } + + public void changeChatStatus(Friend friend, int netId, int ownerNetId){ + friend.updateAll("netId = ? and ownerNetId = ?",String.valueOf(netId),String.valueOf(ownerNetId)); + } + +// public ArrayList findByKeyword(String keyword,int ownerNetId){ +// String keywordCop="%"+keyword+"%"; +// ArrayList friends=(ArrayList) LitePal.where("name like ? AND isfriend=1 AND ownerNetId=?",keywordCop,String.valueOf(ownerNetId)).find(Friend.class); +// return friends; +// } + +// public ArrayList findNewFriendList(int ownerNetId){ +// ArrayList friendList=(ArrayList)LitePal.where("ownerNetId = ? AND isfriend=0", String.valueOf(ownerNetId)).find(Friend.class); +// return friendList; +// } +} diff --git a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Fragment/MessageChannelFragment.java b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Fragment/MessageChannelFragment.java index 52f2784..a0f0a63 100644 --- a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Fragment/MessageChannelFragment.java +++ b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Fragment/MessageChannelFragment.java @@ -10,9 +10,11 @@ import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import com.example.leudaemialikeme.Activity.BaseActivity; import com.example.leudaemialikeme.Adapter.MsgAdapter; -import com.example.leudaemialikeme.Model.Msg; +import com.example.leudaemialikeme.Model.Chat; import com.example.leudaemialikeme.R; +import com.example.leudaemialikeme.service.ChatService; import java.util.ArrayList; import java.util.List; @@ -21,7 +23,8 @@ public class MessageChannelFragment extends Fragment { private static final String ARG_CATEGORY_TITLE = "category_title"; private String messageCategoryTitle = "Default"; private TextView mTitleField; - private List msgList = new ArrayList(); + private List chatList = new ArrayList(); + private RecyclerView recyclerView; public MessageChannelFragment() { // Required empty public constructor @@ -51,11 +54,12 @@ public class MessageChannelFragment extends Fragment { View view; if (messageCategoryTitle.equals(" 私信 ")) { view = inflater.inflate(R.layout.fragment_private_msg,container,false); - RecyclerView recyclerView = (RecyclerView)view.findViewById(R.id.list_private_msg); + recyclerView = view.findViewById(R.id.list_private_msg); + System.out.println("oncreateview:"+recyclerView); LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity()); recyclerView.setLayoutManager(layoutManager); getMsgList(); - MsgAdapter msgAdapter = new MsgAdapter(msgList); + MsgAdapter msgAdapter = new MsgAdapter(chatList); recyclerView.setAdapter(msgAdapter); } else if (messageCategoryTitle.equals(" 评论 ")) { @@ -73,7 +77,24 @@ public class MessageChannelFragment extends Fragment { } private void getMsgList(){ - Msg msg = new Msg(R.drawable.img_user1, "张三", " "); - msgList.add(msg); + ChatService chatService = new ChatService(); + chatList = chatService.findChatList(BaseActivity.owner.getNetId()); + } +// @Override +// public void onResume() { +// System.out.println("-----------------------"); +// super.onResume(); +// System.out.println("-----------------------"); +// getMsgList(); +// MsgAdapter adapter = new MsgAdapter(chatList); +// System.out.println("onresume:" + recyclerView); +// recyclerView.setAdapter(adapter); +// recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); +// } + public void updateUi(){ + getMsgList(); + MsgAdapter adapter = new MsgAdapter(chatList); + recyclerView.setAdapter(adapter); + recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); } } diff --git a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Model/Friend.java b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Model/Friend.java new file mode 100644 index 0000000..4adeca7 --- /dev/null +++ b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Model/Friend.java @@ -0,0 +1,66 @@ +package com.example.leudaemialikeme.Model; + +import org.litepal.crud.LitePalSupport; + +public class Friend extends LitePalSupport { + private int id; + private String username; + private int netId; + private int ownerNetId; + private Boolean isChat; + + public Friend(){ + super(); + } + public Friend(int netId, String username){ + this.netId = netId; + this.username = username; + this.isChat=false; + } + public Friend(int netId, String username, int ownerNetId){ + this.netId = netId; //聊天人的ID + this.username = username; //聊天人的用户名 + this.ownerNetId = ownerNetId; //本机用户的ID + this.isChat=false; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public int getNetId() { + return netId; + } + + public void setNetId(int netId) { + this.netId = netId; + } + + public int getOwnerNetId() { + return ownerNetId; + } + + public void setOwnerNetId(int ownerNetId) { + this.ownerNetId = ownerNetId; + } + + public Boolean getChat() { + return isChat; + } + + public void setChat(Boolean chat) { + isChat = chat; + } +} diff --git a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Model/MessageItemView.java b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Model/MessageItemView.java new file mode 100644 index 0000000..1cbfff1 --- /dev/null +++ b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Model/MessageItemView.java @@ -0,0 +1,15 @@ +package com.example.leudaemialikeme.Model; + +import java.util.ArrayList; + +public class MessageItemView { + public Friend friend; + public Owner owner; + public ArrayList messages; + + public MessageItemView(Friend friend,Owner owner,ArrayList messages){ + this.friend=friend; + this.owner=owner; + this.messages=messages; + } +} diff --git a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Utils/TimeUtil.java b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Utils/TimeUtil.java new file mode 100644 index 0000000..889842b --- /dev/null +++ b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Utils/TimeUtil.java @@ -0,0 +1,29 @@ +package com.example.leudaemialikeme.Utils; + +import java.sql.Timestamp; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +public class TimeUtil { + public static String pattern="yyyy-MM-dd HH:mm"; + + public static String timeToString(Timestamp timestamp){ + SimpleDateFormat format = new SimpleDateFormat(pattern); + return format.format(timestamp); + } + + public static Timestamp stringToTime(String string){ + return Timestamp.valueOf(string); + } + + public static Date stringToDate(String string) throws ParseException { + SimpleDateFormat format=new SimpleDateFormat(pattern); + return format.parse(string); + } + + public static String dateToString(Date date){ + SimpleDateFormat format=new SimpleDateFormat(pattern); + return format.format(date); + } +} diff --git a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/service/ChatService.java b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/service/ChatService.java new file mode 100644 index 0000000..afcdcc0 --- /dev/null +++ b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/service/ChatService.java @@ -0,0 +1,66 @@ +package com.example.leudaemialikeme.service; + +import com.example.leudaemialikeme.Dao.FriendDao; +import com.example.leudaemialikeme.Dao.MessageDao; +import com.example.leudaemialikeme.Model.Chat; +import com.example.leudaemialikeme.Model.Friend; +import com.example.leudaemialikeme.Model.Message; +import com.example.leudaemialikeme.Utils.TimeUtil; + +import java.util.ArrayList; +import java.util.Date; + +public class ChatService { + private FriendDao friendDao; + private MessageDao messageDao; + + public ChatService(){ + this.friendDao=new FriendDao(); + this.messageDao=new MessageDao(); + } + + //接收消息后进行发送者的判断,如果该消息不是本地同步的好友发送的,则先将消息保存,然后发送好友同步请求,然后再进行聊天列表的展示 + //这里需要先进行未读消息的朋友判断,改变isChat状态,然后再进行展示 + public ArrayList findChatList(int ownerNetId){ + + ArrayList isChatFriends=friendDao.findChatFriendList(ownerNetId); + + ArrayList unReadMsgs=messageDao.findUnReadMessage(ownerNetId); + if (unReadMsgs!=null){ + for (Message message:unReadMsgs){ + Friend friend=friendDao.findByNetId(message.getSenderNetId(),ownerNetId); + if (friend!=null && friend.getChat()==false){ + friend.setChat(true); + friend.update(friend.getId()); + isChatFriends.add(friend); + } + } + } + + ArrayList chats = new ArrayList<>(); +// if (isChatFriends.size()==0){ +// return null; +// } + for (Friend friend : isChatFriends){ + Message message = messageDao.findLastMessage(friend.getNetId(),ownerNetId); + Chat chat; + if (message == null){ + chat = new Chat(friend.getNetId(),friend.getUsername(),"",1,"" ); + }else{ + String time= TimeUtil.dateToString(new Date(message.getCreateTime())); + /****/ + String lastMessage=""; + if (message.getMessageType()==1){ + lastMessage=message.getContent(); + }else { + lastMessage="[图片]"; + } + /****/ + chat = new Chat(friend.getNetId(),friend.getUsername(),lastMessage,message.getFlag(),time); + } + chats.add(chat); + } + + return chats; + } +} diff --git a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/service/WebSocketClient.java b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/service/WebSocketClient.java index 921e6e6..8ea8c9f 100644 --- a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/service/WebSocketClient.java +++ b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/service/WebSocketClient.java @@ -2,14 +2,18 @@ package com.example.leudaemialikeme.service; import android.app.Activity; import android.content.Intent; +import android.os.Build; import android.util.Log; import android.widget.Toast; -import com.example.leudaemialikeme.Activity.BaseActivity; +import androidx.annotation.RequiresApi; + import com.example.leudaemialikeme.Activity.ChatActivity; +import com.example.leudaemialikeme.Activity.MainActivity; import com.example.leudaemialikeme.Controller.ActivityController; +import com.example.leudaemialikeme.Fragment.MessageChannelFragment; import com.example.leudaemialikeme.Model.Message; -import com.example.leudaemialikeme.Utils.OkHttpUtil; +import com.example.leudaemialikeme.R; import com.google.gson.Gson; import org.java_websocket.drafts.Draft_6455; @@ -28,6 +32,7 @@ public class WebSocketClient extends org.java_websocket.client.WebSocketClient { public static final int MSG_TEXT=1; public static final int MSG_IMAGE=2; public static final int MSG_SYSTEM=3; + private MainActivity mainActivity; public WebSocketClient(URI serverURI){ @@ -39,6 +44,7 @@ public class WebSocketClient extends org.java_websocket.client.WebSocketClient { Log.d("WS","链接开启"); } + @RequiresApi(api = Build.VERSION_CODES.O) @Override public void onMessage(String message){ try { @@ -73,10 +79,10 @@ public class WebSocketClient extends org.java_websocket.client.WebSocketClient { //如果当前活动为聊天活动则进行数据展示 if (currentActivityName.equals("activity.ChatActivity")){ updateChatUi(newMessage); - //如果当前活动为聊天列表界面,需要对指定的元素进行局部更新,如果没有该用户在聊天列表中,需要添加该好友项 -// }else if (currentActivityName.equals("activity.ChatListActivity")){ -// newMessage.save(); -// updateChatListUi(); +// 如果当前活动为聊天列表界面,需要对指定的元素进行局部更新,如果没有该用户在聊天列表中,需要添加该好友项 + }else if (currentActivity.findViewById(R.id.chat_list_layout)!=null){ + newMessage.save(); + updateChatListUi(); }else{ newMessage.save(); notification(); @@ -104,30 +110,31 @@ public class WebSocketClient extends org.java_websocket.client.WebSocketClient { @Override public void run() { //TODO -// chatActivity=(ChatActivity) currentActivity; -// //如果当前正在聊天的人为消息的发送者,则进行展示,并存为已读消息 -// if (chatActivity.friendNetId==newMessage.getSenderNetId()){ -// chatActivity.addMsg(newMessage,true); -// } -// //如果当前正在聊天的人不是消息发送者,则更新一个未读标记 -// else { + chatActivity=(ChatActivity) currentActivity; + //如果当前正在聊天的人为消息的发送者,则进行展示,并存为已读消息 + if (chatActivity.friendNetId==newMessage.getSenderNetId()){ + chatActivity.addMsg(newMessage,1); + } + //如果当前正在聊天的人不是消息发送者,则更新一个未读标记 + else { // chatActivity.hasNewMsgView.setVisibility(View.VISIBLE); -// newMessage.setRead(false); -// newMessage.save(); -// } + newMessage.setFlag(0); + newMessage.save(); + } } }); } -// public void updateChatListUi(){ -// currentActivity.runOnUiThread(new Runnable() { -// @Override -// public void run() { -// privateMsgFragment =(ChatListActivity) currentActivity; -// chatListActivity.updateUi(); -// } -// }); -// } + public void updateChatListUi(){ + currentActivity.runOnUiThread(new Runnable() { + @Override + public void run() { + mainActivity = (MainActivity) currentActivity; + MessageChannelFragment msgcf = (MessageChannelFragment) mainActivity.getSupportFragmentManager().findFragmentById(R.id.fragment_message_channel); + msgcf.updateUi(); + } + }); + } public void notification(){ currentActivity.runOnUiThread(new Runnable() { @Override @@ -147,26 +154,26 @@ public class WebSocketClient extends org.java_websocket.client.WebSocketClient { 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 +// //好友数据同步 +// 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() { +// // Map jsonMap= JSON.parseObject(jsonStr); // final String message=(String) jsonMap.get("message"); // if (message.equals("success")){ @@ -180,7 +187,7 @@ public class WebSocketClient extends org.java_websocket.client.WebSocketClient { // friend.save(); // Toast.makeText(currentActivity,"你有新的好友与消息",Toast.LENGTH_SHORT).show(); // } - } - }); - } +// } +// }); +// } } diff --git a/Code/LeudaemiaLikeMe/app/src/main/res/layout/activity_chat.xml b/Code/LeudaemiaLikeMe/app/src/main/res/layout/activity_chat.xml index 6618510..0b41bcd 100644 --- a/Code/LeudaemiaLikeMe/app/src/main/res/layout/activity_chat.xml +++ b/Code/LeudaemiaLikeMe/app/src/main/res/layout/activity_chat.xml @@ -15,14 +15,14 @@ android:layout_marginBottom="10dp">