From a319f90badcf67fe90e195b4deca12e8646ea9cf Mon Sep 17 00:00:00 2001 From: Toyga <330282372@qq.com> Date: Tue, 4 Jan 2022 16:07:29 +0800 Subject: [PATCH] =?UTF-8?q?=E7=99=BB=E5=BD=95=E9=A1=B5=E6=9C=89bug=20?= =?UTF-8?q?=E4=BF=AE=E8=A1=A5=E4=B8=AD...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/src/main/AndroidManifest.xml | 23 ++- .../app/src/main/assets/litepal.xml | 13 ++ .../leudaemialikeme/Activity/APNActivity.java | 4 +- .../Activity/AboutActivity.java | 4 +- .../Activity/AttentionActivity.java | 3 +- .../Activity/BaseActivity.java | 163 +++++++++++++++ .../Activity/ChatActivity.java | 7 +- .../Activity/CollectActivity.java | 7 +- .../Activity/ConcernedProblemActivity.java | 7 +- .../Activity/DetailActivity.java | 4 +- .../Activity/EventActivity.java | 7 +- .../Activity/GoAnswerActivity.java | 4 +- .../Activity/HistoryActivity.java | 7 +- .../Activity/InfoActivity.java | 7 +- .../Activity/LoginActivity.java | 191 +++++++++++++++++- .../Activity/MainActivity.java | 3 +- .../Activity/MdctRmdActivity.java | 6 +- .../Activity/MyQuestionActivity.java | 7 +- .../Activity/SafetyActivity.java | 4 +- .../Activity/SearchActivity.java | 4 +- .../Activity/SendInvitationActivity.java | 4 +- .../Activity/SendQuestionActivity.java | 4 +- .../leudaemialikeme/Adapter/ChatAdapter.java | 84 ++++++++ .../leudaemialikeme/Adapter/MsgAdapter.java | 2 +- .../Controller/ActivityController.java | 31 +++ .../example/leudaemialikeme/Dao/BaseDao.java | 32 +++ .../leudaemialikeme/Dao/MessageDao.java | 109 ++++++++++ .../example/leudaemialikeme/Dao/OwnerDao.java | 29 +++ .../example/leudaemialikeme/Model/Chat.java | 57 ++++++ .../leudaemialikeme/Model/Message.java | 104 ++++++++++ .../example/leudaemialikeme/Model/Owner.java | 49 +++++ .../example/leudaemialikeme/Model/User.java | 72 +++---- .../Receiver/ForceOfflineReceiver.java | 38 ++++ .../example/leudaemialikeme/Utils/DBUtil.java | 52 +++++ .../leudaemialikeme/Utils/OkHttpUtil.java | 85 ++++++++ .../service/WebSocketClient.java | 186 +++++++++++++++++ .../src/main/res/layout/activity_login.xml | 6 +- .../src/main/res/layout/msg_content_item.xml | 4 +- .../main/res/xml/network_security_config.xml | 4 + 39 files changed, 1311 insertions(+), 116 deletions(-) create mode 100644 Code/LeudaemiaLikeMe/app/src/main/assets/litepal.xml create mode 100644 Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/BaseActivity.java create mode 100644 Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Adapter/ChatAdapter.java create mode 100644 Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Controller/ActivityController.java create mode 100644 Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Dao/BaseDao.java create mode 100644 Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Dao/MessageDao.java create mode 100644 Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Dao/OwnerDao.java create mode 100644 Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Model/Chat.java create mode 100644 Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Model/Message.java create mode 100644 Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Model/Owner.java create mode 100644 Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Receiver/ForceOfflineReceiver.java create mode 100644 Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Utils/DBUtil.java create mode 100644 Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Utils/OkHttpUtil.java create mode 100644 Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/service/WebSocketClient.java create mode 100644 Code/LeudaemiaLikeMe/app/src/main/res/xml/network_security_config.xml diff --git a/Code/LeudaemiaLikeMe/app/src/main/AndroidManifest.xml b/Code/LeudaemiaLikeMe/app/src/main/AndroidManifest.xml index ad36ab6..c0277ac 100644 --- a/Code/LeudaemiaLikeMe/app/src/main/AndroidManifest.xml +++ b/Code/LeudaemiaLikeMe/app/src/main/AndroidManifest.xml @@ -1,16 +1,27 @@ + xmlns:tools="http://schemas.android.com/tools" + package="com.example.leudaemialikeme" + android:networkSecurityConfig="@xml/network_security_config" + android:usesCleartextTraffic="true" + tools:targetApi="n"> + + - + + + @@ -28,17 +39,13 @@ - + - - - - \ No newline at end of file diff --git a/Code/LeudaemiaLikeMe/app/src/main/assets/litepal.xml b/Code/LeudaemiaLikeMe/app/src/main/assets/litepal.xml new file mode 100644 index 0000000..6c18032 --- /dev/null +++ b/Code/LeudaemiaLikeMe/app/src/main/assets/litepal.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/APNActivity.java b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/APNActivity.java index e84bd40..a21d518 100644 --- a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/APNActivity.java +++ b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/APNActivity.java @@ -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) { diff --git a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/AboutActivity.java b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/AboutActivity.java index ea5c49a..ee14577 100644 --- a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/AboutActivity.java +++ b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/AboutActivity.java @@ -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) { diff --git a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/AttentionActivity.java b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/AttentionActivity.java index 9457080..d384583 100644 --- a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/AttentionActivity.java +++ b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/AttentionActivity.java @@ -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 attentionList = new ArrayList<>(); 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 new file mode 100644 index 0000000..7958f22 --- /dev/null +++ b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/BaseActivity.java @@ -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(); + } +} \ No newline at end of file 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 0334914..d388afe 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 @@ -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) { diff --git a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/CollectActivity.java b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/CollectActivity.java index 944f9f2..d15e3bc 100644 --- a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/CollectActivity.java +++ b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/CollectActivity.java @@ -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) { diff --git a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/ConcernedProblemActivity.java b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/ConcernedProblemActivity.java index 57a4b98..f8e0a87 100644 --- a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/ConcernedProblemActivity.java +++ b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/ConcernedProblemActivity.java @@ -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 mData = new ArrayList<>(); diff --git a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/DetailActivity.java b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/DetailActivity.java index 0c31225..8c955fd 100644 --- a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/DetailActivity.java +++ b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/DetailActivity.java @@ -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); diff --git a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/EventActivity.java b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/EventActivity.java index 66d55d8..f19f7f7 100644 --- a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/EventActivity.java +++ b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/EventActivity.java @@ -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 mData = new ArrayList<>(); @Override diff --git a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/GoAnswerActivity.java b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/GoAnswerActivity.java index f43b1af..83ca6c4 100644 --- a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/GoAnswerActivity.java +++ b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/GoAnswerActivity.java @@ -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) { diff --git a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/HistoryActivity.java b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/HistoryActivity.java index ff54e6a..ef492e5 100644 --- a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/HistoryActivity.java +++ b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/HistoryActivity.java @@ -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) { diff --git a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/InfoActivity.java b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/InfoActivity.java index 21515d3..f659547 100644 --- a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/InfoActivity.java +++ b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/InfoActivity.java @@ -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=new ArrayList<>(); 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 84c161f..5fe6279 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,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 fragmentList; //四个tab对应的布局 diff --git a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/MdctRmdActivity.java b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/MdctRmdActivity.java index cfa24e2..607503e 100644 --- a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/MdctRmdActivity.java +++ b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/MdctRmdActivity.java @@ -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; diff --git a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/MyQuestionActivity.java b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/MyQuestionActivity.java index f0120bb..5a7d106 100644 --- a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/MyQuestionActivity.java +++ b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/MyQuestionActivity.java @@ -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 mData = new ArrayList<>(); @Override diff --git a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/SafetyActivity.java b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/SafetyActivity.java index 9b28a03..819450a 100644 --- a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/SafetyActivity.java +++ b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/SafetyActivity.java @@ -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) { diff --git a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/SearchActivity.java b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/SearchActivity.java index 0de486f..6f8e3dc 100644 --- a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/SearchActivity.java +++ b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/SearchActivity.java @@ -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); diff --git a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/SendInvitationActivity.java b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/SendInvitationActivity.java index 3b45ffa..ab3d06d 100644 --- a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/SendInvitationActivity.java +++ b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/SendInvitationActivity.java @@ -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; diff --git a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/SendQuestionActivity.java b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/SendQuestionActivity.java index eb03bff..fd2ea61 100644 --- a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/SendQuestionActivity.java +++ b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Activity/SendQuestionActivity.java @@ -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; diff --git a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Adapter/ChatAdapter.java b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Adapter/ChatAdapter.java new file mode 100644 index 0000000..0475413 --- /dev/null +++ b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Adapter/ChatAdapter.java @@ -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 { + private List 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 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 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(); + } +} 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 36b5e23..c738c1f 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 @@ -45,7 +45,7 @@ public class MsgAdapter extends RecyclerView.Adapter { holder.linear_msg.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - //////////////////////////////////////////////////// + //TODO 跳转到聊天界面 } }); return holder; diff --git a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Controller/ActivityController.java b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Controller/ActivityController.java new file mode 100644 index 0000000..a7701d4 --- /dev/null +++ b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Controller/ActivityController.java @@ -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 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); + } +} diff --git a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Dao/BaseDao.java b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Dao/BaseDao.java new file mode 100644 index 0000000..d8098bf --- /dev/null +++ b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Dao/BaseDao.java @@ -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(); + } + } +} diff --git a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Dao/MessageDao.java b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Dao/MessageDao.java new file mode 100644 index 0000000..c6803ea --- /dev/null +++ b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Dao/MessageDao.java @@ -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 messages= DBUtil.cursorToList(cursor,Message.class); + if (messages.size()==0){ + return null; + }else { + return messages.get(0); + } + } + + public ArrayList 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 messages=DBUtil.cursorToList(cursor,Message.class); + if (messages.size()==0){ + return null; + }else { + return messages; + } + } + + public ArrayList 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 messages=DBUtil.cursorToList(cursor,Message.class); + Collections.reverse(messages); + + if (messages.size()==0||messages==null){ + return new ArrayList(); + } + 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 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 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 messages=DBUtil.cursorToList(cursor,Message.class); + Collections.reverse(messages); + + if (messages.size()==0||messages==null){ + return new ArrayList(); + } + 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); + } +} diff --git a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Dao/OwnerDao.java b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Dao/OwnerDao.java new file mode 100644 index 0000000..ad1d9cd --- /dev/null +++ b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Dao/OwnerDao.java @@ -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= (ArrayList) 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= (ArrayList) LitePal.where("username = ?", username).find(Owner.class); + if (owner.size()==0){ + return null; + }else { + return owner.get(0); + } + } +} diff --git a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Model/Chat.java b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Model/Chat.java new file mode 100644 index 0000000..e7c5cf7 --- /dev/null +++ b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Model/Chat.java @@ -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; + } +} diff --git a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Model/Message.java b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Model/Message.java new file mode 100644 index 0000000..21dedfa --- /dev/null +++ b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Model/Message.java @@ -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; + } + + +} diff --git a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Model/Owner.java b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Model/Owner.java new file mode 100644 index 0000000..b76a4a0 --- /dev/null +++ b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Model/Owner.java @@ -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; + } +} diff --git a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Model/User.java b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Model/User.java index 3243d51..e966b97 100644 --- a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Model/User.java +++ b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Model/User.java @@ -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; } - - - } - diff --git a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Receiver/ForceOfflineReceiver.java b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Receiver/ForceOfflineReceiver.java new file mode 100644 index 0000000..ed77b9b --- /dev/null +++ b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Receiver/ForceOfflineReceiver.java @@ -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(); + } +} \ No newline at end of file diff --git a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Utils/DBUtil.java b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Utils/DBUtil.java new file mode 100644 index 0000000..ad1c985 --- /dev/null +++ b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Utils/DBUtil.java @@ -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; + } + } + +} diff --git a/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Utils/OkHttpUtil.java b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Utils/OkHttpUtil.java new file mode 100644 index 0000000..bf5e4e1 --- /dev/null +++ b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/Utils/OkHttpUtil.java @@ -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(); + } + } +} 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 new file mode 100644 index 0000000..921e6e6 --- /dev/null +++ b/Code/LeudaemiaLikeMe/app/src/main/java/com/example/leudaemialikeme/service/WebSocketClient.java @@ -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(); +// } + } + }); + } +} diff --git a/Code/LeudaemiaLikeMe/app/src/main/res/layout/activity_login.xml b/Code/LeudaemiaLikeMe/app/src/main/res/layout/activity_login.xml index e5d4b8b..52f48d9 100644 --- a/Code/LeudaemiaLikeMe/app/src/main/res/layout/activity_login.xml +++ b/Code/LeudaemiaLikeMe/app/src/main/res/layout/activity_login.xml @@ -8,21 +8,21 @@ tools:context=".Activity.LoginActivity">