登录页完成,私聊界面完成,websocket连接失败,修补中....

master
Toyga 4 years ago
parent a319f90bad
commit 99460aefeb

@ -7,9 +7,10 @@
tools:targetApi="n"> tools:targetApi="n">
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<application <application
android:name=".Utils.Data" android:name="org.litepal.LitePalApplication"
android:allowBackup="true" android:allowBackup="true"
android:icon="@mipmap/ic_launcher" android:icon="@mipmap/ic_launcher"
android:label="@string/app_name" android:label="@string/app_name"

@ -3,10 +3,11 @@
<dbname value="leukemia" /> <dbname value="leukemia" />
<version value="1" /> <version value="2" />
<list> <list>
<mapping class="com.example.leudaemialikeme.Model.Owner"/> <mapping class="com.example.leudaemialikeme.Model.Owner"/>
<mapping class="com.example.leudaemialikeme.Model.Friend"/>
<mapping class="com.example.leudaemialikeme.Model.Message"/> <mapping class="com.example.leudaemialikeme.Model.Message"/>
</list> </list>

@ -31,7 +31,7 @@ public class BaseActivity extends AppCompatActivity {
public static Owner owner; public static Owner owner;
//服务器链接 //服务器链接
public static String SERVER_IP = "172.30.87.197"; public static String SERVER_IP = "192.168.43.206";
// static { // static {
// try { // try {
@ -122,6 +122,7 @@ public class BaseActivity extends AppCompatActivity {
mHandler.postDelayed(heartBeatRunnable, HEART_BEAT_RATE); mHandler.postDelayed(heartBeatRunnable, HEART_BEAT_RATE);
try { try {
wsClient.connectBlocking(); wsClient.connectBlocking();
Log.d("ws:","连接成功");
} catch (InterruptedException e) { } catch (InterruptedException e) {
e.printStackTrace(); e.printStackTrace();
} }

@ -1,17 +1,121 @@
package com.example.leudaemialikeme.Activity; package com.example.leudaemialikeme.Activity;
import android.content.Intent;
import android.os.Bundle; 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; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
public class ChatActivity extends BaseActivity {
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<Message> messageList = new ArrayList<Message>();
private MessageItemView msgItemView;
private ChatAdapter chatAdapter;
private Gson gson = new Gson();
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat); 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();
} }
} }

@ -1,6 +1,7 @@
package com.example.leudaemialikeme.Activity; package com.example.leudaemialikeme.Activity;
import android.content.Intent; import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle; import android.os.Bundle;
import android.view.View; import android.view.View;
import android.widget.Button; import android.widget.Button;
@ -15,6 +16,9 @@ import com.example.leudaemialikeme.Model.User;
import com.example.leudaemialikeme.R; import com.example.leudaemialikeme.R;
import com.example.leudaemialikeme.Utils.OkHttpUtil; import com.example.leudaemialikeme.Utils.OkHttpUtil;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import org.litepal.LitePal;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
@ -31,6 +35,9 @@ public class LoginActivity extends BaseActivity {
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login); setContentView(R.layout.activity_login);
//获取数据库
SQLiteDatabase db = LitePal.getDatabase();
edit_username = findViewById(R.id.edit_username); edit_username = findViewById(R.id.edit_username);
edit_pwd = findViewById(R.id.edit_pwd); edit_pwd = findViewById(R.id.edit_pwd);
bt_login = findViewById(R.id.bt_login); bt_login = findViewById(R.id.bt_login);
@ -112,14 +119,14 @@ public class LoginActivity extends BaseActivity {
@Override @Override
public void run() { public void run() {
Gson gson = new Gson(); Gson gson = new Gson();
Map jsonMap= gson.fromJson(jsonStr, Map.class); Map<String, String> jsonMap= gson.fromJson(jsonStr, new TypeToken <Map<String, String>>() {}.getType());
final String message=(String) jsonMap.get("message"); final String message=(String) jsonMap.get("message");
if (message.equals("success")){ if (message.equals("success")){
//进行本地数据存储,本地数据库不存储密码防止泄露需要补全imageURL路径 //进行本地数据存储,本地数据库不存储密码防止泄露需要补全imageURL路径
// JSONObject data=(JSONObject) jsonMap.get("data"); // JSONObject data=(JSONObject) jsonMap.get("data");
// JSONObject netUser=(JSONObject) data.get("owner"); // JSONObject netUser=(JSONObject) data.get("owner");
// JSONArray netFriends=(JSONArray) data.get("friends"); // 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(); Owner newOwner = new Owner();
newOwner.setUsername(user.getUsername()); newOwner.setUsername(user.getUsername());
@ -174,11 +181,11 @@ public class LoginActivity extends BaseActivity {
@Override @Override
public void run() { public void run() {
Gson gson = new Gson(); Gson gson = new Gson();
Map jsonMap= gson.fromJson(jsonStr, Map.class); Map<String, String> jsonMap= gson.fromJson(jsonStr, new TypeToken <Map<String, String>>() {}.getType());
final String message=(String) jsonMap.get("message"); final String message=(String) jsonMap.get("message");
if (message.equals("success")){ if (message.equals("success")){
//进行本地消息存储 //进行本地消息存储
List msgList = (List)jsonMap.get("msgList"); List<Message> msgList = gson.fromJson(jsonMap.get("msgList"), new TypeToken <List<Message>>() {}.getType());
for (int i=0;i<msgList.size();i++){ for (int i=0;i<msgList.size();i++){
Message unReadMsg = (Message) msgList.get(i); Message unReadMsg = (Message) msgList.get(i);
String content=unReadMsg.getContent(); String content=unReadMsg.getContent();
@ -191,6 +198,7 @@ public class LoginActivity extends BaseActivity {
} }
Intent intent = new Intent(LoginActivity.this, MainActivity.class); Intent intent = new Intent(LoginActivity.this, MainActivity.class);
startActivity(intent); startActivity(intent);
finish();
} }
// getNewFriends(owner.getUsername()); // getNewFriends(owner.getUsername());

@ -10,7 +10,6 @@ import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction; import androidx.fragment.app.FragmentTransaction;
import com.example.leudaemialikeme.Dao.QuestionDao;
import com.example.leudaemialikeme.Fragment.CommunityFragment; import com.example.leudaemialikeme.Fragment.CommunityFragment;
import com.example.leudaemialikeme.Fragment.IndexFragment; import com.example.leudaemialikeme.Fragment.IndexFragment;
import com.example.leudaemialikeme.Fragment.MessageFragment; import com.example.leudaemialikeme.Fragment.MessageFragment;
@ -84,17 +83,17 @@ public class MainActivity extends BaseActivity {
.commit(); .commit();
} }
new Thread(new Runnable() { // new Thread(new Runnable() {
@Override // @Override
public void run() { // public void run() {
QuestionDao userDao=new QuestionDao(); // QuestionDao userDao=new QuestionDao();
try { // try {
userDao.qSelect(); // userDao.qSelect();
} catch (Exception e) { // } catch (Exception e) {
e.printStackTrace(); // e.printStackTrace();
} // }
} // }
}).start(); // }).start();
} }
private void initFirstRun(int i) { private void initFirstRun(int i) {

@ -9,7 +9,9 @@ import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.example.leudaemialikeme.Model.Friend;
import com.example.leudaemialikeme.Model.Message; import com.example.leudaemialikeme.Model.Message;
import com.example.leudaemialikeme.Model.MessageItemView;
import com.example.leudaemialikeme.Model.Owner; import com.example.leudaemialikeme.Model.Owner;
import com.example.leudaemialikeme.R; import com.example.leudaemialikeme.R;
@ -17,8 +19,9 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
public class ChatAdapter extends RecyclerView.Adapter<ChatAdapter.ViewHolder> { public class ChatAdapter extends RecyclerView.Adapter<ChatAdapter.ViewHolder> {
private List<Message> messageList = new ArrayList<>(); private List<Message> messageList = new ArrayList<Message>();
private Owner owner; private Owner owner;
private Friend friend;
static class ViewHolder extends RecyclerView.ViewHolder{ static class ViewHolder extends RecyclerView.ViewHolder{
LinearLayout msg_content_left; LinearLayout msg_content_left;
@ -45,13 +48,12 @@ public class ChatAdapter extends RecyclerView.Adapter<ChatAdapter.ViewHolder> {
} }
} }
public ChatAdapter(List<Message> messageList, Owner owner){ public ChatAdapter(MessageItemView messageItemView){
this.messageList = messageList; this.messageList = messageItemView.messages;
this.owner = owner; this.owner = messageItemView.owner;
this.friend = messageItemView.friend;
} }
@NonNull @NonNull
@Override @Override
public ChatAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { public ChatAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

@ -1,5 +1,6 @@
package com.example.leudaemialikeme.Adapter; package com.example.leudaemialikeme.Adapter;
import android.content.Intent;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@ -10,31 +11,39 @@ import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView; 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 com.example.leudaemialikeme.R;
import java.util.List; import java.util.List;
public class MsgAdapter extends RecyclerView.Adapter<MsgAdapter.ViewHolder> { public class MsgAdapter extends RecyclerView.Adapter<MsgAdapter.ViewHolder> {
private List<Msg> msgList; private List<Chat> chatList;
private MessageDao messageDao = new MessageDao();
static class ViewHolder extends RecyclerView.ViewHolder{ static class ViewHolder extends RecyclerView.ViewHolder{
ImageView portrait; ImageView portrait;
TextView nickname; TextView nickname;
TextView introduction; TextView introduction;
LinearLayout linear_msg; LinearLayout linear_msg;
ImageView point;
TextView chat_friend_id;
public ViewHolder(View view){ public ViewHolder(View view){
super(view); super(view);
portrait = (ImageView)view.findViewById(R.id.img_portrait); portrait = (ImageView)view.findViewById(R.id.img_portrait);
nickname = (TextView)view.findViewById(R.id.text_nickname); nickname = (TextView)view.findViewById(R.id.text_nickname);
introduction = (TextView)view.findViewById(R.id.text_introduction); introduction = (TextView)view.findViewById(R.id.text_introduction);
linear_msg = (LinearLayout)view.findViewById(R.id.linear_msg); 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<Msg> msgList) { public MsgAdapter(List<Chat> chatList) {
this.msgList = msgList; this.chatList = chatList;
} }
@NonNull @NonNull
@ -42,27 +51,41 @@ public class MsgAdapter extends RecyclerView.Adapter<MsgAdapter.ViewHolder> {
public MsgAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { public MsgAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.pivate_msg_item,parent,false); View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.pivate_msg_item,parent,false);
MsgAdapter.ViewHolder holder=new MsgAdapter.ViewHolder(view); MsgAdapter.ViewHolder holder=new MsgAdapter.ViewHolder(view);
holder.linear_msg.setOnClickListener(new View.OnClickListener() { // holder.linear_msg.setOnClickListener(new View.OnClickListener() {
@Override // @Override
public void onClick(View view) { // public void onClick(View view) {
//TODO 跳转到聊天界面 //
} // Intent intent = new Intent(view.getContext(), ChatActivity.class);
}); // intent.putExtra("friendId", fdddddddd);
// }
// });
return holder; return holder;
} }
@Override @Override
public void onBindViewHolder(@NonNull MsgAdapter.ViewHolder holder, int position) { public void onBindViewHolder(@NonNull MsgAdapter.ViewHolder holder, int position) {
Msg msg = msgList.get(position); Chat chat = chatList.get(position);
holder.portrait.setImageResource(msg.getPortraitID()); holder.introduction.setText(String.valueOf(chat.getLastMessage()));
holder.introduction.setText(String.valueOf(msg.getIntroduction())); holder.nickname.setText(chat.getFriendName());
holder.nickname.setText(msg.getNickname()); 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 @Override
public int getItemCount() { public int getItemCount() {
return msgList.size(); return chatList.size();
} }
} }

@ -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<Friend> findFriendListByOwnerNetId(int ownerNetId){
ArrayList<Friend> friendList=(ArrayList<Friend>)LitePal.where("ownerNetId = ?", String.valueOf(ownerNetId)).find(Friend.class);
return friendList;
}
public ArrayList<Friend> findChatFriendList(int ownerNetId){
ArrayList<Friend> friendList=(ArrayList<Friend>)LitePal.where("ownerNetId = ? AND isChat = ?", String.valueOf(ownerNetId),"1").find(Friend.class);
return friendList;
}
public Friend findByNetId(int netId,int ownerNetId){
ArrayList<Friend> friendList=(ArrayList<Friend>)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<Friend> findByKeyword(String keyword,int ownerNetId){
// String keywordCop="%"+keyword+"%";
// ArrayList<Friend> friends=(ArrayList<Friend>) LitePal.where("name like ? AND isfriend=1 AND ownerNetId=?",keywordCop,String.valueOf(ownerNetId)).find(Friend.class);
// return friends;
// }
// public ArrayList<Friend> findNewFriendList(int ownerNetId){
// ArrayList<Friend> friendList=(ArrayList<Friend>)LitePal.where("ownerNetId = ? AND isfriend=0", String.valueOf(ownerNetId)).find(Friend.class);
// return friendList;
// }
}

@ -10,9 +10,11 @@ import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.example.leudaemialikeme.Activity.BaseActivity;
import com.example.leudaemialikeme.Adapter.MsgAdapter; 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.R;
import com.example.leudaemialikeme.service.ChatService;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -21,7 +23,8 @@ public class MessageChannelFragment extends Fragment {
private static final String ARG_CATEGORY_TITLE = "category_title"; private static final String ARG_CATEGORY_TITLE = "category_title";
private String messageCategoryTitle = "Default"; private String messageCategoryTitle = "Default";
private TextView mTitleField; private TextView mTitleField;
private List<Msg> msgList = new ArrayList<Msg>(); private List<Chat> chatList = new ArrayList<Chat>();
private RecyclerView recyclerView;
public MessageChannelFragment() { public MessageChannelFragment() {
// Required empty public constructor // Required empty public constructor
@ -51,11 +54,12 @@ public class MessageChannelFragment extends Fragment {
View view; View view;
if (messageCategoryTitle.equals(" 私信 ")) { if (messageCategoryTitle.equals(" 私信 ")) {
view = inflater.inflate(R.layout.fragment_private_msg,container,false); 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()); LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(layoutManager); recyclerView.setLayoutManager(layoutManager);
getMsgList(); getMsgList();
MsgAdapter msgAdapter = new MsgAdapter(msgList); MsgAdapter msgAdapter = new MsgAdapter(chatList);
recyclerView.setAdapter(msgAdapter); recyclerView.setAdapter(msgAdapter);
} else if (messageCategoryTitle.equals(" 评论 ")) { } else if (messageCategoryTitle.equals(" 评论 ")) {
@ -73,7 +77,24 @@ public class MessageChannelFragment extends Fragment {
} }
private void getMsgList(){ private void getMsgList(){
Msg msg = new Msg(R.drawable.img_user1, "张三", " "); ChatService chatService = new ChatService();
msgList.add(msg); 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()));
} }
} }

@ -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;
}
}

@ -0,0 +1,15 @@
package com.example.leudaemialikeme.Model;
import java.util.ArrayList;
public class MessageItemView {
public Friend friend;
public Owner owner;
public ArrayList<Message> messages;
public MessageItemView(Friend friend,Owner owner,ArrayList<Message> messages){
this.friend=friend;
this.owner=owner;
this.messages=messages;
}
}

@ -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);
}
}

@ -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<Chat> findChatList(int ownerNetId){
ArrayList<Friend> isChatFriends=friendDao.findChatFriendList(ownerNetId);
ArrayList<Message> 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<Chat> 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;
}
}

@ -2,14 +2,18 @@ package com.example.leudaemialikeme.service;
import android.app.Activity; import android.app.Activity;
import android.content.Intent; import android.content.Intent;
import android.os.Build;
import android.util.Log; import android.util.Log;
import android.widget.Toast; 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.ChatActivity;
import com.example.leudaemialikeme.Activity.MainActivity;
import com.example.leudaemialikeme.Controller.ActivityController; import com.example.leudaemialikeme.Controller.ActivityController;
import com.example.leudaemialikeme.Fragment.MessageChannelFragment;
import com.example.leudaemialikeme.Model.Message; import com.example.leudaemialikeme.Model.Message;
import com.example.leudaemialikeme.Utils.OkHttpUtil; import com.example.leudaemialikeme.R;
import com.google.gson.Gson; import com.google.gson.Gson;
import org.java_websocket.drafts.Draft_6455; 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_TEXT=1;
public static final int MSG_IMAGE=2; public static final int MSG_IMAGE=2;
public static final int MSG_SYSTEM=3; public static final int MSG_SYSTEM=3;
private MainActivity mainActivity;
public WebSocketClient(URI serverURI){ public WebSocketClient(URI serverURI){
@ -39,6 +44,7 @@ public class WebSocketClient extends org.java_websocket.client.WebSocketClient {
Log.d("WS","链接开启"); Log.d("WS","链接开启");
} }
@RequiresApi(api = Build.VERSION_CODES.O)
@Override @Override
public void onMessage(String message){ public void onMessage(String message){
try { try {
@ -74,9 +80,9 @@ public class WebSocketClient extends org.java_websocket.client.WebSocketClient {
if (currentActivityName.equals("activity.ChatActivity")){ if (currentActivityName.equals("activity.ChatActivity")){
updateChatUi(newMessage); updateChatUi(newMessage);
// 如果当前活动为聊天列表界面,需要对指定的元素进行局部更新,如果没有该用户在聊天列表中,需要添加该好友项 // 如果当前活动为聊天列表界面,需要对指定的元素进行局部更新,如果没有该用户在聊天列表中,需要添加该好友项
// }else if (currentActivityName.equals("activity.ChatListActivity")){ }else if (currentActivity.findViewById(R.id.chat_list_layout)!=null){
// newMessage.save(); newMessage.save();
// updateChatListUi(); updateChatListUi();
}else{ }else{
newMessage.save(); newMessage.save();
notification(); notification();
@ -104,30 +110,31 @@ public class WebSocketClient extends org.java_websocket.client.WebSocketClient {
@Override @Override
public void run() { public void run() {
//TODO //TODO
// chatActivity=(ChatActivity) currentActivity; chatActivity=(ChatActivity) currentActivity;
// //如果当前正在聊天的人为消息的发送者,则进行展示,并存为已读消息 //如果当前正在聊天的人为消息的发送者,则进行展示,并存为已读消息
// if (chatActivity.friendNetId==newMessage.getSenderNetId()){ if (chatActivity.friendNetId==newMessage.getSenderNetId()){
// chatActivity.addMsg(newMessage,true); chatActivity.addMsg(newMessage,1);
// } }
// //如果当前正在聊天的人不是消息发送者,则更新一个未读标记 //如果当前正在聊天的人不是消息发送者,则更新一个未读标记
// else { else {
// chatActivity.hasNewMsgView.setVisibility(View.VISIBLE); // chatActivity.hasNewMsgView.setVisibility(View.VISIBLE);
// newMessage.setRead(false); newMessage.setFlag(0);
// newMessage.save(); newMessage.save();
// } }
} }
}); });
} }
// public void updateChatListUi(){ public void updateChatListUi(){
// currentActivity.runOnUiThread(new Runnable() { currentActivity.runOnUiThread(new Runnable() {
// @Override @Override
// public void run() { public void run() {
// privateMsgFragment =(ChatListActivity) currentActivity; mainActivity = (MainActivity) currentActivity;
// chatListActivity.updateUi(); MessageChannelFragment msgcf = (MessageChannelFragment) mainActivity.getSupportFragmentManager().findFragmentById(R.id.fragment_message_channel);
// } msgcf.updateUi();
// }); }
// } });
}
public void notification(){ public void notification(){
currentActivity.runOnUiThread(new Runnable() { currentActivity.runOnUiThread(new Runnable() {
@Override @Override
@ -147,26 +154,26 @@ public class WebSocketClient extends org.java_websocket.client.WebSocketClient {
ex.printStackTrace(); ex.printStackTrace();
} }
//好友数据同步 // //好友数据同步
private void getNewFriends(final int friendNetId,final int ownerNetId){ // private void getNewFriends(final int friendNetId,final int ownerNetId){
new Thread(new Runnable() { // new Thread(new Runnable() {
@Override // @Override
public void run() { // public void run() {
try { // try {
String url = BaseActivity.SERVER_URL + "/user/getNewFriendById/"+ownerNetId+"/"+friendNetId; // String url = BaseActivity.SERVER_URL + "/user/getNewFriendById/"+ownerNetId+"/"+friendNetId;
String jsonStr= OkHttpUtil.synGet(url); // String jsonStr= OkHttpUtil.synGet(url);
getNewFriendsResponse(jsonStr); // getNewFriendsResponse(jsonStr);
}catch (Exception e){ // }catch (Exception e){
e.printStackTrace(); // e.printStackTrace();
} // }
} // }
}).start(); // }).start();
} // }
private void getNewFriendsResponse(final String jsonStr){ // private void getNewFriendsResponse(final String jsonStr){
currentActivity.runOnUiThread(new Runnable() { // currentActivity.runOnUiThread(new Runnable() {
@Override // @Override
public void run() { // public void run() {
//TODO //
// Map jsonMap= JSON.parseObject(jsonStr); // Map jsonMap= JSON.parseObject(jsonStr);
// final String message=(String) jsonMap.get("message"); // final String message=(String) jsonMap.get("message");
// if (message.equals("success")){ // if (message.equals("success")){
@ -180,7 +187,7 @@ public class WebSocketClient extends org.java_websocket.client.WebSocketClient {
// friend.save(); // friend.save();
// Toast.makeText(currentActivity,"你有新的好友与消息",Toast.LENGTH_SHORT).show(); // Toast.makeText(currentActivity,"你有新的好友与消息",Toast.LENGTH_SHORT).show();
// } // }
} // }
}); // });
} // }
} }

@ -15,14 +15,14 @@
android:layout_marginBottom="10dp"> android:layout_marginBottom="10dp">
<ImageButton <ImageButton
android:id="@+id/imageButton4" android:id="@+id/bt_chat_to_chat_list"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:srcCompat="@mipmap/left_back" app:srcCompat="@mipmap/left_back"
android:background="@color/white"/> android:background="@color/white"/>
<TextView <TextView
android:id="@+id/textView16" android:id="@+id/text_chat_name"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_weight="1" android:layout_weight="1"
@ -53,7 +53,7 @@
android:maxLength="3"/> android:maxLength="3"/>
<Button <Button
android:id="@+id/bt_send" android:id="@+id/bt_send_msg"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1" android:layout_weight="1"

@ -2,6 +2,7 @@
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:layout_height="match_parent" android:layout_height="match_parent"
android:id="@+id/fragment_message_channel"
tools:context="com.example.leudaemialikeme.Fragment.MessageChannelFragment"> tools:context="com.example.leudaemialikeme.Fragment.MessageChannelFragment">
<!-- TODO: Update blank fragment layout --> <!-- TODO: Update blank fragment layout -->

@ -3,7 +3,8 @@
android:orientation="vertical" android:layout_width="match_parent" android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_margin="20dp" android:layout_margin="20dp"
android:background="#ffffff"> android:background="#ffffff"
android:id="@+id/chat_list_layout">
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/list_private_msg" android:id="@+id/list_private_msg"

@ -19,7 +19,7 @@
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout
android:layout_width="353dp" android:layout_width="300dp"
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical"> android:orientation="vertical">
<TextView <TextView
@ -34,6 +34,19 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:singleLine="true" android:singleLine="true"
android:text="" /> android:text="" />
<TextView
android:id="@+id/chat_friend_id"
android:layout_width="0dp"
android:layout_height="0dp"
android:textSize="0dp"/>
</LinearLayout> </LinearLayout>
<ImageView
android:id="@+id/img_unread"
android:layout_width="28dp"
android:layout_height="37dp"
android:src="@mipmap/point"
/>
</LinearLayout> </LinearLayout>

Binary file not shown.

After

Width:  |  Height:  |  Size: 231 B

Loading…
Cancel
Save