Przeglądaj źródła

[+] 新增自启动功能

clark 9 miesięcy temu
rodzic
commit
7cc7650625

+ 29 - 5
app/src/main/java/com/moodtalk/android/account/api/AccountServiceManager.java

@@ -3,6 +3,8 @@ package com.moodtalk.android.account.api;
 
 import android.content.Intent;
 
+import androidx.lifecycle.Observer;
+
 import com.moodtalk.android.MoodTalkApplication;
 import com.moodtalk.android.account.api.response.PrimaryDataDTO;
 import com.moodtalk.android.account.api.response.SecondDataDTO;
@@ -16,8 +18,11 @@ import com.moodtalk.android.common.listener.HttpResponseListener;
 import com.moodtalk.android.common.listener.SimpleHttpRequestListener;
 import com.moodtalk.android.common.util.AppTools;
 import com.moodtalk.android.emoticon.database.EmoticonDatabase;
+import com.moodtalk.android.friend.constant.FriendRequestState;
 import com.moodtalk.android.friend.database.FriendDatabase;
+import com.moodtalk.android.friend.database.FriendRequestDatabase;
 import com.moodtalk.android.friend.entity.Friend;
+import com.moodtalk.android.friend.entity.FriendRequest;
 import com.moodtalk.android.group.database.GroupDatabase;
 import com.moodtalk.android.message.api.MessageServiceManager;
 import com.moodtalk.android.message.database.ChatSessionDatabase;
@@ -28,6 +33,8 @@ import com.moodtalk.android.note.api.NoteServiceManager;
 import com.moodtalk.android.note.database.NoteDatabase;
 import com.moodtalk.android.organization.database.OrganizationDatabase;
 
+import java.util.List;
+
 public class AccountServiceManager extends BaseServiceManager {
 
 
@@ -55,13 +62,16 @@ public class AccountServiceManager extends BaseServiceManager {
         accountService.updateGender(gender).enqueue(new MainThreadCallback<>(responseListener));
     }
 
-    public static void loadPrimaryData() {
+    /**
+     * 每次冷启动,加载好友列表数据
+     */
+    public static void loadPrimaryData(Observer<Void> responseListener) {
 
-        long uid = Global.getUid();
+//        long uid = Global.getUid();
 
-        if (Global.isPrimaryDataLoadFinished(uid)){
-            return;
-        }
+//        if (Global.isPrimaryDataLoadFinished(uid)){
+//            return;
+//        }
 
         accountService.getPrimaryData().enqueue(new WorkerThreadCallback<>(new SimpleHttpRequestListener<PrimaryDataDTO>() {
             @Override
@@ -73,6 +83,9 @@ public class AccountServiceManager extends BaseServiceManager {
 
                 MessageServiceManager.loadPatchMessages();
 
+                syncFriendRequestsOnAppStart();
+
+                responseListener.onChanged(null);
             }
         }));
 
@@ -156,4 +169,15 @@ public class AccountServiceManager extends BaseServiceManager {
         MoodTalkApplication.sendLocalBroadcast(new Intent(IntentAction.ACTION_RECENT_REFRESH_LIST));
     }
 
+    // 在App启动时调用
+    public static void syncFriendRequestsOnAppStart() {
+        List<FriendRequest> pendingRequests = FriendRequestDatabase.findUnrunList(); // 查询state=0的请求
+        for (FriendRequest request : pendingRequests) {
+            long uid = request.getUid();
+            if (FriendDatabase.isFriend(uid)) {
+                FriendRequestDatabase.updateState(uid, FriendRequestState.ACCEPT); // 更新为Accept
+            }
+        }
+    }
+
 }

+ 4 - 0
app/src/main/java/com/moodtalk/android/friend/database/FriendRequestDatabase.java

@@ -23,6 +23,10 @@ public class FriendRequestDatabase {
         return friendRequestRepository.findList();
     }
 
+    public static List<FriendRequest> findUnrunList() {
+        return friendRequestRepository.findUnrunList(FriendRequestState.NORMAL);
+    }
+
     public static void add(FriendRequest request){
         friendRequestRepository.add(request);
     }

+ 5 - 2
app/src/main/java/com/moodtalk/android/friend/database/dao/FriendRequestRepository.java

@@ -28,10 +28,13 @@ public interface FriendRequestRepository {
     @Query("delete from t_moodtalk_friend_request where uid = :uid")
     void deleteAll(long uid);
 
-
-    @Query("update t_moodtalk_friend_request set state = :state where id = :id")
+    @Query("update t_moodtalk_friend_request set state = :state where uid = :id")
     void updateState(long id,byte state);
 
+    @Query("select * from t_moodtalk_friend_request  where state = :state")
+    List<FriendRequest> findUnrunList(byte state);
+
+
     @Insert(onConflict = OnConflictStrategy.REPLACE)
     void add(FriendRequest request);
 }

+ 4 - 0
app/src/main/java/com/moodtalk/android/friend/entity/FriendRequest.java

@@ -42,4 +42,8 @@ public class FriendRequest implements Serializable {
         return false;
     }
 
+    public long getUid()
+    {
+        return uid;
+    }
 }

+ 5 - 3
app/src/main/java/com/moodtalk/android/home/fragment/ContactsFragment.java

@@ -74,9 +74,11 @@ public class ContactsFragment extends MessagingFragment<FragmentHomeContactsBind
 
         OrganizationDatabase.observeChange(this, this::showOrganizationView);
 
-        FriendRequestDatabase.observeNewCount(this, this::showNewFriendBadgeNumber);
-
-        AccountServiceManager.loadPrimaryData();
+        AccountServiceManager.loadPrimaryData(unused -> {
+            requireActivity().runOnUiThread(() ->
+                    FriendRequestDatabase.observeNewCount(getViewLifecycleOwner(), this::showNewFriendBadgeNumber)
+            );
+        });
 
         AccountServiceManager.loadSecondData();
     }

+ 4 - 4
app/src/main/java/com/moodtalk/android/home/ui/HomeActivity.java

@@ -27,9 +27,8 @@ import com.moodtalk.android.group.ui.CreateGroupActivity;
 import com.moodtalk.android.home.fragment.ContactsFragment;
 import com.moodtalk.android.home.fragment.ConversationFragment;
 import com.moodtalk.android.message.database.ChatSessionDatabase;
-import com.moodtalk.android.start.AutoStartHelper;
-import com.moodtalk.android.start.AutoStartManager;
 import com.moodtalk.android.start.HeartbeatManager;
+import com.moodtalk.android.start.KeepAliveManager;
 import com.moodtalk.android.webrtc.ui.LivekitMeetingHomeActivity;
 import com.moodtalk.messaging.PushManager;
 
@@ -49,9 +48,10 @@ public class HomeActivity extends MessagingActivity<ActivityHomeBinding> impleme
     @Override
     public void initComponents()
     {
+        // 判断是否是第一次启动应用
         HeartbeatManager.checkIfStaleThenPrompt(this);
-
-
+        // 启动心跳服务
+        KeepAliveManager.startKeepAlive(getApplicationContext());
 
         setStatusBarColor(android.R.color.transparent);
 

+ 1 - 2
app/src/main/java/com/moodtalk/android/start/AutoStartHelper.java

@@ -115,7 +115,7 @@ public class AutoStartHelper
                 message = "请在“耗电管理”中为" + appName + "开启【自启动、关联启动】权限,保证后台运行。";
                 break;
             case "VIVO":
-                message = "请在“后台高耗电管理”中允许" + appName + "【自启动、关联启动】,确保服务正常。";
+                message = "请在“权限-查看所有权限”中允许" + appName + "【自启动、关联启动】,确保服务正常。";
                 break;
             case "MEIZU":
                 message = "请在“权限管理”中允许" + appName + "【自启动、关联启动】,避免服务被关闭。";
@@ -134,7 +134,6 @@ public class AutoStartHelper
                 .setPositiveButton("去设置", (dialog, which) ->
                         PushInitializer.init(context)
                 )
-                .setNegativeButton("取消", null)
                 .show();
     }
 }

+ 5 - 3
app/src/main/java/com/moodtalk/android/start/HeartbeatManager.java

@@ -1,7 +1,6 @@
 package com.moodtalk.android.start;
 
 import android.app.Activity;
-import android.app.AlertDialog;
 import android.content.Context;
 import android.content.SharedPreferences;
 import android.os.Handler;
@@ -15,9 +14,9 @@ public class HeartbeatManager {
     private static final String PREF_NAME = "heartbeat_prefs";
     private static final String KEY_LAST_TIMESTAMP = "last_heartbeat";
     private static final String KEY_LAST_POPUP_TIME = "last_popup_time";
-    private static final long INTERVAL_WRITE = 5 * 60 * 1000L; // 5分钟
+    private static final long INTERVAL_WRITE = 10 * 60 * 1000L; // 5分钟
     private static final long TIMEOUT_THRESHOLD = 3 * 60 * 60 * 1000L; // 3小时
-    private static final long POPUP_INTERVAL_LIMIT = 24 * 60 * 60 * 1000L; // 每天最多弹一次
+    private static final long POPUP_INTERVAL_LIMIT = 6 * 60 * 60 * 1000L; // 6小时最多弹一次
 
     private static final Handler handler = new Handler(Looper.getMainLooper());
     private static Runnable heartbeatTask;
@@ -48,6 +47,9 @@ public class HeartbeatManager {
     }
 
     public static void checkIfStaleThenPrompt(Activity activity) {
+
+        AutoStartHelper.showDialog(activity,activity.getString(R.string.app_name));
+
         SharedPreferences sp = activity.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
         long last = sp.getLong(KEY_LAST_TIMESTAMP, 0);
         long now = System.currentTimeMillis();

+ 0 - 3
app/src/main/java/com/moodtalk/android/start/PushInitializer.java

@@ -10,9 +10,6 @@ public class PushInitializer
         // 1. 权限引导(通知权限 + 电池优化 + 自启动)
         PermissionHelper.guideAllPermissions(activity);
 
-
-        // 3. 启动保活机制(前台服务)
-        KeepAliveManager.startKeepAlive(activity.getApplicationContext());
     }
 
 }

+ 6 - 4
app/src/main/java/com/moodtalk/messaging/PushService.java

@@ -16,9 +16,11 @@ import android.net.Network;
 import android.os.Build;
 import android.os.Handler;
 import android.os.IBinder;
+import android.os.Looper;
 import android.util.Log;
 
 import androidx.annotation.NonNull;
+import androidx.core.content.ContextCompat;
 
 import com.moodtalk.android.start.HeartbeatManager;
 import com.moodtalk.messaging.constant.BundleKey;
@@ -52,7 +54,7 @@ public class PushService extends Service {
 
         keepAliveReceiver = new KeepAliveBroadcastReceiver();
 
-        this.registerReceiver(keepAliveReceiver, keepAliveReceiver.getIntentFilter());
+        ContextCompat.registerReceiver(this, keepAliveReceiver, keepAliveReceiver.getIntentFilter(), ContextCompat.RECEIVER_NOT_EXPORTED);
 
         connectivityManager = getSystemService(ConnectivityManager.class);
 
@@ -73,14 +75,14 @@ public class PushService extends Service {
         }
     };
 
-    private final Handler connectHandler = new Handler() {
+    private final Handler connectHandler = new Handler(Looper.getMainLooper()) {
         @Override
         public void handleMessage(@NonNull android.os.Message message) {
             prepareConnect();
         }
     };
 
-    private final Handler notificationHandler = new Handler() {
+    private final Handler notificationHandler = new Handler(Looper.getMainLooper()) {
         @Override
         public void handleMessage(@NonNull android.os.Message message) {
             if (!CacheManager.getBoolean(PushService.this,CacheManager.KEY_NTC_SWITCH)){
@@ -94,7 +96,7 @@ public class PushService extends Service {
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
             return super.registerReceiver(keepAliveReceiver, keepAliveReceiver.getIntentFilter(),Context.RECEIVER_EXPORTED);
         }else {
-            return super.registerReceiver(keepAliveReceiver, keepAliveReceiver.getIntentFilter());
+            return ContextCompat.registerReceiver(this, keepAliveReceiver, keepAliveReceiver.getIntentFilter(), ContextCompat.RECEIVER_NOT_EXPORTED);
         }
     }