登录页有bug 修补中...

master
Toyga 3 years ago
parent e8e7f10a0f
commit a319f90bad

@ -1,16 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.leudaemialikeme">
xmlns:tools="http://schemas.android.com/tools"
package="com.example.leudaemialikeme"
android:networkSecurityConfig="@xml/network_security_config"
android:usesCleartextTraffic="true"
tools:targetApi="n">
<uses-permission android:name="android.permission.INTERNET" />
<application
android:name=".Utils.Data"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:networkSecurityConfig="@xml/network_security_config"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:name=".Utils.Data"
android:theme="@style/Theme.LeudaemiaLikeMe">
<activity android:name=".Activity.LoginActivity"></activity>
<meta-data
android:name="com.google.android.actions"
android:resource="@xml/network_security_config" />
<activity android:name=".Activity.BaseActivity"/>
<activity android:name=".Activity.MainActivity" />
<activity android:name=".Activity.ChatActivity" />
<activity android:name=".Activity.AttentionActivity" />
<activity android:name=".Activity.HistoryActivity" />
@ -28,17 +39,13 @@
<activity android:name=".Activity.SendQuestionActivity" />
<activity android:name=".Activity.APNActivity" />
<activity android:name=".Activity.EventActivity" />
<activity android:name=".Activity.MainActivity">
<activity android:name=".Activity.LoginActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>

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

@ -1,12 +1,10 @@
package com.example.leudaemialikeme.Activity;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import com.example.leudaemialikeme.R;
public class APNActivity extends AppCompatActivity {
public class APNActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {

@ -1,12 +1,10 @@
package com.example.leudaemialikeme.Activity;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import com.example.leudaemialikeme.R;
public class AboutActivity extends AppCompatActivity {
public class AboutActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {

@ -2,7 +2,6 @@ package com.example.leudaemialikeme.Activity;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
@ -13,7 +12,7 @@ import com.example.leudaemialikeme.R;
import java.util.ArrayList;
import java.util.List;
public class AttentionActivity extends AppCompatActivity {
public class AttentionActivity extends BaseActivity {
private List<Attention> attentionList = new ArrayList<>();

@ -0,0 +1,163 @@
package com.example.leudaemialikeme.Activity;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import androidx.appcompat.app.AppCompatActivity;
import com.example.leudaemialikeme.Controller.ActivityController;
import com.example.leudaemialikeme.Model.Owner;
import com.example.leudaemialikeme.Receiver.ForceOfflineReceiver;
import com.example.leudaemialikeme.service.WebSocketClient;
import java.net.URI;
public class BaseActivity extends AppCompatActivity {
public static WebSocketClient wsClient=null;
//SharedPreferences key-value 组件静态声明,则后期也可以使用
public static SharedPreferences pref;
public static SharedPreferences.Editor prefEditor;
//当前用户
public static Owner owner;
//服务器链接
public static String SERVER_IP = "172.30.87.197";
// static {
// try {
// SERVER_IP = InetAddress.getLocalHost().getHostAddress();
// } catch (UnknownHostException e) {
// e.printStackTrace();
// }
// }
public static final String SERVER_PORT="8080";
public static final String SERVER_URL="http://"+SERVER_IP+":"+SERVER_PORT+"/LeudaemiaLikeMe/main-servlet";
public static String WS_URL="";
//WS心跳检测10秒一次
public static final long HEART_BEAT_RATE = 10 * 1000;
public static boolean isNeedReconnect=true;
public static Handler mHandler = new Handler();
//强制下线广播接收器
private ForceOfflineReceiver receiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityController.addActivity(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
ActivityController.removeActivity(this);
}
//注册绑定接收器
@Override
protected void onResume() {
super.onResume();
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction("FORCE_OFFLINE");
receiver=new ForceOfflineReceiver();
registerReceiver(receiver,intentFilter);
}
//解绑接收器
@Override
protected void onPause() {
super.onPause();
if (receiver != null){
unregisterReceiver(receiver);
receiver=null;
}
}
// //设置全屏并隐藏导航栏
// public static void setFullScreen(Activity activity){
// activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
// final View decorView = activity.getWindow().getDecorView();
// final int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_FULLSCREEN;
// decorView.setSystemUiVisibility(uiOptions);
// decorView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {
// @Override
// public void onSystemUiVisibilityChange(int i) {
// if ((i & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
// decorView.setSystemUiVisibility(uiOptions);
// } else {
//
// }
// }
// });
// }
@Override
public void startActivity(Intent intent) {
super.startActivity(intent);
overridePendingTransition(0, 0);
}
@Override
public void finish() {
super.finish();
overridePendingTransition(0, 0);
}
//初始化WS
public void initWebSocket(int ownerNetId){
WS_URL="ws://"+SERVER_IP+":"+SERVER_PORT+"/chatWS/"+ownerNetId;
URI uri=URI.create(WS_URL);
wsClient= new WebSocketClient(uri);
isNeedReconnect=true;
mHandler.postDelayed(heartBeatRunnable, HEART_BEAT_RATE);
try {
wsClient.connectBlocking();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//WS心跳检测
//心跳检测每隔10秒进行一次
public Runnable heartBeatRunnable = new Runnable() {
@Override
public void run() {
Log.e("WS", "心跳包检测连接状态");
if (wsClient != null) {
if (wsClient.isClosed() && isNeedReconnect) {
reconnectWs();
}
} else {
//如果client已为空重新初始化连接
wsClient = null;
initWebSocket(owner.getNetId());
}
//每隔一定的时间,对长连接进行一次心跳检测
mHandler.postDelayed(this, HEART_BEAT_RATE);
}
};
//重新链接
public void reconnectWs() {
mHandler.removeCallbacks(heartBeatRunnable);
new Thread() {
@Override
public void run() {
try {
Log.e("WS", "开启重连");
wsClient.reconnectBlocking();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
}
}

@ -2,11 +2,12 @@ package com.example.leudaemialikeme.Activity;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import com.example.leudaemialikeme.R;
public class ChatActivity extends AppCompatActivity {
public class ChatActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {

@ -1,15 +1,14 @@
package com.example.leudaemialikeme.Activity;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import android.os.Bundle;
import com.example.leudaemialikeme.Fragment.CollectFragment;
import com.example.leudaemialikeme.R;
public class CollectActivity extends AppCompatActivity {
public class CollectActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {

@ -1,11 +1,10 @@
package com.example.leudaemialikeme.Activity;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import com.example.leudaemialikeme.Adapter.QuestionAdapter;
import com.example.leudaemialikeme.Model.Question;
import com.example.leudaemialikeme.R;
@ -13,7 +12,7 @@ import com.example.leudaemialikeme.R;
import java.util.ArrayList;
import java.util.List;
public class ConcernedProblemActivity extends AppCompatActivity {
public class ConcernedProblemActivity extends BaseActivity {
private List<Question> mData = new ArrayList<>();

@ -5,11 +5,9 @@ import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import androidx.appcompat.app.AppCompatActivity;
import com.example.leudaemialikeme.R;
public class DetailActivity extends AppCompatActivity {
public class DetailActivity extends BaseActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);

@ -1,11 +1,10 @@
package com.example.leudaemialikeme.Activity;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import com.example.leudaemialikeme.Adapter.EventAdapter;
import com.example.leudaemialikeme.Model.Event;
import com.example.leudaemialikeme.R;
@ -13,7 +12,7 @@ import com.example.leudaemialikeme.R;
import java.util.ArrayList;
import java.util.List;
public class EventActivity extends AppCompatActivity {
public class EventActivity extends BaseActivity {
private List<Event> mData = new ArrayList<>();
@Override

@ -2,11 +2,9 @@ package com.example.leudaemialikeme.Activity;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import com.example.leudaemialikeme.R;
public class GoAnswerActivity extends AppCompatActivity {
public class GoAnswerActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {

@ -1,15 +1,14 @@
package com.example.leudaemialikeme.Activity;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import android.os.Bundle;
import com.example.leudaemialikeme.Fragment.CollectFragment;
import com.example.leudaemialikeme.R;
public class HistoryActivity extends AppCompatActivity {
public class HistoryActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {

@ -9,18 +9,17 @@ import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.example.leudaemialikeme.R;
import com.example.leudaemialikeme.Model.Recnews;
import com.example.leudaemialikeme.Adapter.InfoAdapter;
import com.example.leudaemialikeme.Model.Recnews;
import com.example.leudaemialikeme.R;
import java.util.ArrayList;
import java.util.List;
public class InfoActivity extends AppCompatActivity {
public class InfoActivity extends BaseActivity {
private List<Recnews> recNews=new ArrayList<>();

@ -1,16 +1,201 @@
package com.example.leudaemialikeme.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.example.leudaemialikeme.Dao.MessageDao;
import com.example.leudaemialikeme.Dao.OwnerDao;
import com.example.leudaemialikeme.Model.Message;
import com.example.leudaemialikeme.Model.Owner;
import com.example.leudaemialikeme.Model.User;
import com.example.leudaemialikeme.R;
import com.example.leudaemialikeme.Utils.OkHttpUtil;
import com.google.gson.Gson;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class LoginActivity extends AppCompatActivity {
public class LoginActivity extends BaseActivity {
private EditText edit_username;
private EditText edit_pwd;
private Button bt_login;
private String username;
private String pwd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
edit_username = findViewById(R.id.edit_username);
edit_pwd = findViewById(R.id.edit_pwd);
bt_login = findViewById(R.id.bt_login);
bt_login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
username = edit_username.getText().toString();
pwd = edit_pwd.getText().toString();
if(!username.equals("")&&!pwd.equals("")){
Map paramMap = new HashMap();
paramMap.put("username",username);
paramMap.put("password",pwd);
loginRequest(paramMap);
}else {
Toast.makeText(LoginActivity.this, "用户名或密码格式错误!", Toast.LENGTH_SHORT).show();
}
}
});
}
private void loginRequest(final Map paramMap){
new Thread(new Runnable() {
@Override
public void run() {
try{
String url = LoginActivity.SERVER_URL+"?action=login";
String jsonStr= OkHttpUtil.synPost(url, paramMap);
loginResponse(jsonStr,(String) paramMap.get("username"));
}catch (Exception e){
e.printStackTrace();
}
}
}).start();
}
private void loginResponse(final String jsonStr,final String username){
runOnUiThread(new Runnable() {
private OwnerDao ownerDao=new OwnerDao();
@Override
public void run() {
if (jsonStr.equals("success")){
Owner dbOwner=ownerDao.findOwnerByUsername(username);
if (dbOwner!=null){
owner = dbOwner;
// ownerInfoSaveToPref(); //记住密码方法
// 初始化WS链接
initWebSocket(owner.getNetId());
getUnReadMsg();
}else{
//如果本地为空则说明是首次登录,则需要发送请求获取用户的个人信息及朋友列表数据存入本地数据库中,再进行存储
firstLoginRequest();
}
}else{
Toast.makeText(LoginActivity.this, jsonStr, Toast.LENGTH_SHORT).show();
}
}
});
}
//首次登录发送请求数据信息
private void firstLoginRequest(){
new Thread(new Runnable() {
@Override
public void run() {
try {
String url = LoginActivity.SERVER_URL + "?action=firstLogin&username="+username;
String jsonStr= OkHttpUtil.synGet(url);
firstLoginResponse(jsonStr);
}catch (Exception e){
e.printStackTrace();
}
}
}).start();
}
private void firstLoginResponse(final String jsonStr){
runOnUiThread(new Runnable() {
private OwnerDao ownerDao=new OwnerDao();
// private FriendDao friendDao=new FriendDao();
@Override
public void run() {
Gson gson = new Gson();
Map jsonMap= gson.fromJson(jsonStr, Map.class);
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");
//
Owner newOwner = new Owner();
newOwner.setUsername(user.getUsername());
newOwner.setPassword(user.getPassword());
newOwner.setNetId(user.getIduser());
// newOwner.setName(netUser.getString("name"));
// newOwner.setImageURL(SERVER_URL+netUser.getString("imagePath"));
ownerDao.insert(newOwner); //插入本地数据库
//
// if (netFriends!=null && netFriends.size()>0){
// for (int i=0;i<netFriends.size();i++){
// JSONObject netFriend=(JSONObject) netFriends.get(i);
// String name=netFriend.getString("name");
// String imageUrl=SERVER_URL+netFriend.getString("imagePath");
// String username=netFriend.getString("username");
// int netId=netFriend.getInteger("id");
// Friend newFriend=new Friend(netId,username,name,imageUrl,newOwner.getNetId());
// friendDao.insert(newFriend);
// }
// }
owner = newOwner;
// ownerInfoSaveToPref();
//初始化WS链接
initWebSocket(owner.getNetId());
getUnReadMsg();
}else{
Toast.makeText(LoginActivity.this, message, Toast.LENGTH_SHORT).show();
}
}
});
}
//登录成功后获取未读消息
private void getUnReadMsg(){
new Thread(new Runnable() {
@Override
public void run() {
try {
String url = LoginActivity.SERVER_URL + "?action=getUnReadMsg&username="+username;
String jsonStr= OkHttpUtil.synGet(url);
getUnReadMsgResponse(jsonStr);
}catch (Exception e){
e.printStackTrace();
}
}
}).start();
}
private void getUnReadMsgResponse(final String jsonStr){
runOnUiThread(new Runnable() {
private MessageDao messageDao=new MessageDao();
@Override
public void run() {
Gson gson = new Gson();
Map jsonMap= gson.fromJson(jsonStr, Map.class);
final String message=(String) jsonMap.get("message");
if (message.equals("success")){
//进行本地消息存储
List msgList = (List)jsonMap.get("msgList");
for (int i=0;i<msgList.size();i++){
Message unReadMsg = (Message) msgList.get(i);
String content=unReadMsg.getContent();
int messageType=unReadMsg.getMessageType();
int receiverId= unReadMsg.getReceiverNetId();
int senderId= unReadMsg.getSenderNetId();
Long createTime = unReadMsg.getCreateTime();
Message newMessage=new Message(senderId,receiverId,messageType,content,createTime);
messageDao.insert(newMessage);
}
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
startActivity(intent);
}
// getNewFriends(owner.getUsername());
}
});
}
}

@ -6,7 +6,6 @@ import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
@ -21,7 +20,7 @@ import com.example.leudaemialikeme.R;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
public class MainActivity extends BaseActivity {
//装载Fragment的集合
private List<Fragment> fragmentList;
//四个tab对应的布局

@ -8,13 +8,11 @@ import android.widget.ImageView;
import android.widget.ListView;
import android.widget.Switch;
import androidx.appcompat.app.AppCompatActivity;
import com.example.leudaemialikeme.R;
import com.example.leudaemialikeme.Adapter.AdapterClock;
import com.example.leudaemialikeme.R;
public class MdctRmdActivity extends AppCompatActivity {
public class MdctRmdActivity extends BaseActivity {
private ListView lv;
private AdapterClock adapter;

@ -1,11 +1,10 @@
package com.example.leudaemialikeme.Activity;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import com.example.leudaemialikeme.Adapter.MyQuestionAdapter;
import com.example.leudaemialikeme.Model.MyQuestion;
import com.example.leudaemialikeme.R;
@ -13,7 +12,7 @@ import com.example.leudaemialikeme.R;
import java.util.ArrayList;
import java.util.List;
public class MyQuestionActivity extends AppCompatActivity {
public class MyQuestionActivity extends BaseActivity {
private List<MyQuestion> mData = new ArrayList<>();
@Override

@ -1,12 +1,10 @@
package com.example.leudaemialikeme.Activity;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import com.example.leudaemialikeme.R;
public class SafetyActivity extends AppCompatActivity {
public class SafetyActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {

@ -5,11 +5,9 @@ import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import androidx.appcompat.app.AppCompatActivity;
import com.example.leudaemialikeme.R;
public class SearchActivity extends AppCompatActivity {
public class SearchActivity extends BaseActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

@ -11,8 +11,6 @@ import android.widget.RadioButton;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.example.leudaemialikeme.Dao.InvitationDao;
import com.example.leudaemialikeme.R;
import com.example.leudaemialikeme.Utils.Data;
@ -20,7 +18,7 @@ import com.example.leudaemialikeme.Utils.Data;
import java.text.SimpleDateFormat;
import java.util.Locale;
public class SendInvitationActivity extends AppCompatActivity {
public class SendInvitationActivity extends BaseActivity {
EditText titleView;
EditText detailView;

@ -10,8 +10,6 @@ import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.example.leudaemialikeme.Dao.QuestionDao;
import com.example.leudaemialikeme.R;
import com.example.leudaemialikeme.Utils.Data;
@ -19,7 +17,7 @@ import com.example.leudaemialikeme.Utils.Data;
import java.text.SimpleDateFormat;
import java.util.Locale;
public class SendQuestionActivity extends AppCompatActivity{
public class SendQuestionActivity extends BaseActivity {
EditText titleText;
EditText detailText;

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

@ -45,7 +45,7 @@ public class MsgAdapter extends RecyclerView.Adapter<MsgAdapter.ViewHolder> {
holder.linear_msg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
////////////////////////////////////////////////////
//TODO 跳转到聊天界面
}
});
return holder;

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

@ -1,60 +1,52 @@
package com.example.leudaemialikeme.Model;
public class User {
private static final long serialVersionUID = 1L;
private int uid;
private int id;
private int iduser;
private String username;
private String name;
private String phone;
private String password;
public int getUid(){
return uid;
}
public void setUid(int uid){
this.uid=uid;
private String phone;
private String sex;
public User() {
super();
}
public void setId(int id){
this.id=id;
public User(int iduser, String username, String password, String phone, String sex) {
super();
this.iduser = iduser;
this.username = username;
this.password = password;
this.phone = phone;
this.sex = sex;
}
public int getId(){
return id;
public int getIduser() {
return iduser;
}
public void setUsername(String username){
this.username=username;
public void setIduser(int iduser) {
this.iduser = iduser;
}
public String getUsername(){
public String getUsername() {
return username;
}
public void setName(String name){
this.name=name;
public void setUsername(String username) {
this.username = username;
}
public String getName(){
return name;
public String getPassword() {
return password;
}
public void setPhone(String phone){
this.phone=phone;
public void setPassword(String password) {
this.password = password;
}
public String getPhone(){
public String getPhone() {
return phone;
}
public void setPassword(String password){
this.password=password;
public void setPhone(String phone) {
this.phone = phone;
}
public String getPassword(){
return password;
public String getSex() {
return sex;
}
public User(int uid,int id,String username,String name, String phone,String password){
this.uid=uid;
this.id=id;
this.username=username;
this.name=name;
this.phone=phone;
this.password=password;
public void setSex(String sex) {
this.sex = sex;
}
}

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

@ -8,21 +8,21 @@
tools:context=".Activity.LoginActivity">
<EditText
android:id="@+id/editTextTextPersonName2"
android:id="@+id/edit_username"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10"
android:hint="账号"/>
<EditText
android:id="@+id/editTextTextPersonName3"
android:id="@+id/edit_pwd"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10"
android:hint="密码" />
<Button
android:id="@+id/button3"
android:id="@+id/bt_login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="登录"/>

@ -15,7 +15,7 @@
android:orientation="horizontal">
<TextView
android:id="@+id/textView52"
android:id="@+id/left_msg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
@ -32,7 +32,7 @@
android:orientation="horizontal">
<TextView
android:id="@+id/textView53"
android:id="@+id/right_msg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
Loading…
Cancel
Save