Sfoglia il codice sorgente

1.新增自动唤醒和自动更新控制
2.新增服务器和管理员密码配置

JaycePC 6 mesi fa
parent
commit
6834d2e2c5

+ 0 - 1
app/build.gradle

@@ -71,5 +71,4 @@ dependencies {
     implementation("com.squareup.okhttp3:logging-interceptor:4.12.0")
     //noinspection UseTomlInstead,GradleDependency
     implementation "androidx.work:work-runtime:2.9.1"
-
 }

+ 3 - 2
app/src/main/AndroidManifest.xml

@@ -25,7 +25,7 @@
         android:theme="@style/Theme.Update"
         tools:targetApi="31">
         <receiver
-            android:name=".broadcast.ProcessReceiver"
+            android:name=".receiver.ProcessReceiver"
             android:exported="true"
             tools:ignore="ExportedReceiver">
             <intent-filter>
@@ -35,7 +35,8 @@
 
         <service
             android:name=".service.TaskService"
-            android:exported="true" />
+            android:exported="true"
+            tools:ignore="ExportedService" />
 
         <activity
             android:name=".SettingActivity"

+ 21 - 2
app/src/main/java/xn/update/MainActivity.java

@@ -4,6 +4,7 @@ import android.annotation.SuppressLint;
 import android.os.Bundle;
 import android.text.TextUtils;
 import android.util.Log;
+import android.widget.EditText;
 
 import androidx.activity.EdgeToEdge;
 import androidx.annotation.NonNull;
@@ -23,6 +24,7 @@ import com.blankj.utilcode.util.LogUtils;
 import com.blankj.utilcode.util.NetworkUtils;
 import com.blankj.utilcode.util.SPUtils;
 import com.blankj.utilcode.util.ThreadUtils;
+import com.blankj.utilcode.util.ToastUtils;
 import com.hikvision.dmb.display.InfoDisplayApi;
 import com.hikvision.dmb.network.InfoNetworkApi;
 import com.hikvision.dmb.system.InfoSystemApi;
@@ -40,7 +42,9 @@ import java.util.concurrent.ThreadLocalRandom;
 import java.util.concurrent.TimeUnit;
 
 import okhttp3.Response;
+import xn.update.constant.AppConstant;
 import xn.update.databinding.ActivityMainBinding;
+import xn.update.evnet.UpdateUiEvent;
 import xn.update.http.HttpTool;
 import xn.update.works.TaskWork;
 
@@ -58,6 +62,10 @@ public class MainActivity extends AppCompatActivity {
         // 启动保活worker
         PeriodicWorkRequest taskRequest = new PeriodicWorkRequest.Builder(TaskWork.class, 15, TimeUnit.MINUTES).build();
         WorkManager.getInstance(getApplicationContext()).enqueueUniquePeriodicWork("Task", ExistingPeriodicWorkPolicy.CANCEL_AND_REENQUEUE, taskRequest);
+        // 自动更新应用
+        SPUtils.getInstance().put(AppConstant.AUTO_UPDATE, true);
+        // 自动拉起主应用
+        SPUtils.getInstance().put(AppConstant.AUTO_MASTER, true);
 
         InfoSystemApi.openAdb();
         InfoDisplayApi.setStatusBarEnable(false);
@@ -80,12 +88,23 @@ public class MainActivity extends AppCompatActivity {
     protected void onPostCreate(@Nullable Bundle savedInstanceState) {
         super.onPostCreate(savedInstanceState);
         binding.versionNameTV.setText(AppUtils.getAppVersionName());
-        inputConfirmPopupView = new XPopup.Builder(this).asInputConfirm("Tips", "请输入管理员密码",
-                text -> ActivityUtils.startActivity(SettingActivity.class));
+        inputConfirmPopupView = new XPopup.Builder(this).autoDismiss(false).asInputConfirm("Tips", "请输入管理员密码",
+                text -> {
+                    if (text.equals(SPUtils.getInstance().getString(AppConstant.ADMIN_PASSWORD, "admin@098&"))) {
+                        ActivityUtils.startActivity(SettingActivity.class);
+                        inputConfirmPopupView.dismiss();
+                    } else {
+                        ToastUtils.showLong("密码不正确,请重新输入!");
+                    }
+                });
         binding.logoIV.setOnLongClickListener(v -> {
             if (AppUtils.isAppDebug()) {
                 ActivityUtils.startActivity(SettingActivity.class);
             } else {
+                EditText editText = inputConfirmPopupView.getEditText();
+                if (null != editText) {
+                    editText.setText("");
+                }
                 inputConfirmPopupView.show();
             }
             return true;

+ 49 - 8
app/src/main/java/xn/update/SettingActivity.java

@@ -5,6 +5,7 @@ import android.content.Intent;
 import android.os.AsyncTask;
 import android.os.Bundle;
 import android.provider.Settings;
+import android.text.Editable;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.View;
@@ -36,6 +37,7 @@ import com.hikvision.dmb.time.InfoTimeApi;
 import com.hikvision.dmb.util.InfoUtilApi;
 import com.lxj.xpopupext.popup.TimePickerPopup;
 
+import xn.update.constant.AppConstant;
 import xn.update.databinding.ActivitySettingBinding;
 
 @SuppressLint("SetTextI18n")
@@ -71,11 +73,15 @@ public class SettingActivity extends AppCompatActivity {
             // 启动文件管理
             binding.fileBrowserBT.setOnClickListener(v -> Tool.INSTANCE.openFileBrowser());
             // 重启设备
-            binding.rebootBT.setOnClickListener(v -> {
-                        InfoSystemApi.reboot();
-                        SPUtils.getInstance().put("isDebug", false);
-                    }
-            );
+            binding.rebootBT.setOnClickListener(v -> InfoSystemApi.reboot());
+            // 自动拉起主应用
+            binding.autoMasterSwitch.setChecked(SPUtils.getInstance().getBoolean(AppConstant.AUTO_MASTER, true));
+            binding.autoMasterSwitch.setOnCheckedChangeListener((buttonView, isChecked)
+                    -> SPUtils.getInstance().put(AppConstant.AUTO_MASTER, isChecked));
+            // 自动更新主应用
+            binding.autoUpdateSwitch.setChecked(SPUtils.getInstance().getBoolean(AppConstant.AUTO_UPDATE, true));
+            binding.autoUpdateSwitch.setOnCheckedChangeListener((buttonView, isChecked)
+                    -> SPUtils.getInstance().put(AppConstant.AUTO_UPDATE, isChecked));
             // 系统设置
             binding.settingBT.setOnClickListener(v -> {
                 Tool.INSTANCE.openSetting();
@@ -91,14 +97,49 @@ public class SettingActivity extends AppCompatActivity {
             // 内存
             MemoryInfo memoryInfo = InfoSystemApi.getMemoryUsage();
             binding.memoryBT.setText("内存:" + memoryInfo.describe);
+            // http地址
+            binding.httpUriET.setText(Tool.INSTANCE.getBaseUrl().toString());
+            // 测试地址输入
+            binding.httpUriTestBT.setOnClickListener(v -> binding.httpUriET.setText("http://192.168.1.8/api/"));
+            // 西农地址输入
+            binding.httpUriXnBT.setOnClickListener(v -> binding.httpUriET.setText("http://172.16.0.65/api/"));
+            // 管理员密码
+            binding.oldPasswordET.setText(SPUtils.getInstance().getString(AppConstant.ADMIN_PASSWORD, "admin@098&"));
             // 保存
             binding.save.setOnClickListener(v -> save());
+            // 保存并启动主应用
+            binding.saveAndStartMasterApp.setOnClickListener(v -> {
+                if (save()) {
+                    startMasterApp();
+                }
+            });
         }));
     }
 
-    private void save() {
-        finish();
-        SPUtils.getInstance().put("isDebug", false);
+    private boolean save() {
+        try {
+            Editable httpUriETText = binding.httpUriET.getText();
+            if (null == httpUriETText || TextUtils.isEmpty(httpUriETText)) {
+                binding.httpUriET.setError("请输入Http服务地址");
+                return false;
+            }
+            Editable oldPasswordETText = binding.oldPasswordET.getText();
+            if (null == oldPasswordETText || TextUtils.isEmpty(oldPasswordETText)) {
+                binding.oldPasswordET.setError("请输入管理员密码");
+                return false;
+            }
+            SPUtils.getInstance().put(AppConstant.BASE_URL, httpUriETText.toString());
+            SPUtils.getInstance().put(AppConstant.ADMIN_PASSWORD, oldPasswordETText.toString());
+            finish();
+            return true;
+        } catch (Exception e) {
+            ToastUtils.showLong("参数异常无法保存,请核对参数!");
+            LogUtils.e(Log.getStackTraceString(e));
+        }
+        return false;
+    }
+
+    private void startMasterApp() {
         Tool.INSTANCE.openApp("com.dlc.xn.eboard");
     }
 }

+ 3 - 5
app/src/main/java/xn/update/Tool.java

@@ -11,6 +11,7 @@ import com.blankj.utilcode.util.ShellUtils;
 import com.hikvision.dmb.system.InfoSystemApi;
 
 import okhttp3.HttpUrl;
+import xn.update.constant.AppConstant;
 import xn.update.service.TaskService;
 
 public enum Tool {
@@ -60,11 +61,7 @@ public enum Tool {
     }
 
     public HttpUrl getBaseUrl() {
-        if (AppUtils.isAppDebug()) {
-            return HttpUrl.get("http://192.168.1.8/api/");
-        } else {
-            return HttpUrl.get("http://172.16.0.65/api/");
-        }
+        return HttpUrl.get(SPUtils.getInstance().getString(AppConstant.BASE_URL, "http://172.16.0.65/api/"));
     }
 
     public String checkUrl(String url) {
@@ -79,4 +76,5 @@ public enum Tool {
             return url;
         }
     }
+
 }

+ 0 - 19
app/src/main/java/xn/update/broadcast/ProcessReceiver.java

@@ -1,19 +0,0 @@
-package xn.update.broadcast;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-
-import com.blankj.utilcode.util.AppUtils;
-import com.blankj.utilcode.util.LogUtils;
-import com.blankj.utilcode.util.SPUtils;
-
-public class ProcessReceiver extends BroadcastReceiver {
-    @Override
-    public void onReceive(Context context, Intent intent) {
-        // 其他应用发送过来的信息
-        if (!AppUtils.getAppPackageName().equals(intent.getPackage())) {
-            SPUtils.getInstance().put("isDebug", intent.getBooleanExtra("isDebug", false));
-        }
-    }
-}

+ 24 - 0
app/src/main/java/xn/update/constant/AppConstant.java

@@ -0,0 +1,24 @@
+package xn.update.constant;
+
+public final class AppConstant {
+    private AppConstant() {
+    }
+
+    /**
+     * 自动更新应用
+     */
+    public static final String AUTO_UPDATE = "auto_update";
+    /**
+     * 自动拉起主应用
+     */
+    public static final String AUTO_MASTER = "auto_master";
+    /**
+     * BaseUrl
+     */
+    public static final String BASE_URL = "base_url";
+
+    /**
+     * 管理员密码
+     */
+    public static final String ADMIN_PASSWORD = "admin_password";
+}

+ 4 - 0
app/src/main/java/xn/update/evnet/UpdateUiEvent.java

@@ -0,0 +1,4 @@
+package xn.update.evnet;
+
+public class UpdateUiEvent {
+}

+ 1 - 0
app/src/main/java/xn/update/http/HttpTool.java

@@ -15,6 +15,7 @@ public enum HttpTool {
     public Response terminalAuth() throws IOException, JSONException {
         JSONObject jsonObject = new JSONObject();
         jsonObject.put("deviceCode", Tool.INSTANCE.getSerialNumber());
+        jsonObject.put("code", "aio_infobord");
         return OkHttpUtils.INSTANCE.postSync(Tool.INSTANCE.getBaseUrl() + "terminal/authorize", jsonObject.toString());
     }
 

+ 25 - 0
app/src/main/java/xn/update/receiver/ProcessReceiver.java

@@ -0,0 +1,25 @@
+package xn.update.receiver;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.text.TextUtils;
+
+import com.blankj.utilcode.util.AppUtils;
+import com.blankj.utilcode.util.LogUtils;
+import com.blankj.utilcode.util.SPUtils;
+
+import xn.update.constant.AppConstant;
+
+public class ProcessReceiver extends BroadcastReceiver {
+    @Override
+    public void onReceive(Context context, Intent intent) {
+        String aPackage = intent.getPackage();
+        // 其他应用发送过来的信息
+        if (null != aPackage && !TextUtils.isEmpty(aPackage) && !AppUtils.getAppPackageName().equals(aPackage)) {
+            boolean autoMaster = intent.getBooleanExtra("auto_master", false);
+            LogUtils.d("其它应用更新", autoMaster);
+            SPUtils.getInstance().put(AppConstant.AUTO_MASTER, autoMaster);
+        }
+    }
+}

+ 5 - 4
app/src/main/java/xn/update/broadcast/TimeTickReceiver.java

@@ -1,4 +1,4 @@
-package xn.update.broadcast;
+package xn.update.receiver;
 
 import android.annotation.SuppressLint;
 import android.app.DownloadManager;
@@ -19,6 +19,7 @@ import com.blankj.utilcode.util.LogUtils;
 import com.blankj.utilcode.util.SPUtils;
 import com.blankj.utilcode.util.ShellUtils;
 import com.blankj.utilcode.util.ThreadUtils;
+import com.blankj.utilcode.util.ToastUtils;
 
 import org.json.JSONException;
 
@@ -30,6 +31,7 @@ import java.util.List;
 
 import okhttp3.Response;
 import xn.update.Tool;
+import xn.update.constant.AppConstant;
 import xn.update.http.HttpTool;
 import xn.update.http.bean.response.UpdateTask;
 
@@ -52,7 +54,7 @@ public class TimeTickReceiver extends BroadcastReceiver {
         context.sendBroadcast(newIntent);
         LogUtils.d("分钟", isRunning, ActivityUtils.getActivityList());
         // 空闲中
-        if (!isRunning) {
+        if (!isRunning && SPUtils.getInstance().getBoolean(AppConstant.AUTO_UPDATE, true)) {
             if (null == downloadManager) {
                 downloadManager = (DownloadManager) context.getApplicationContext().getSystemService(Context.DOWNLOAD_SERVICE);
                 downloadApkReceiver = new BroadcastReceiver() {
@@ -142,10 +144,9 @@ public class TimeTickReceiver extends BroadcastReceiver {
                 public void onSuccess(Boolean result) {
                 }
             });
-
         }
 
-        if (!SPUtils.getInstance().getBoolean("isDebug")) {
+        if (SPUtils.getInstance().getBoolean(AppConstant.AUTO_MASTER, true)) {
             ThreadUtils.executeByCached(new ThreadUtils.SimpleTask<Object>() {
                 @Override
                 public Object doInBackground() throws Throwable {

+ 1 - 1
app/src/main/java/xn/update/service/TaskService.java

@@ -15,7 +15,7 @@ import androidx.core.app.NotificationCompat;
 import com.blankj.utilcode.util.LogUtils;
 
 import xn.update.R;
-import xn.update.broadcast.TimeTickReceiver;
+import xn.update.receiver.TimeTickReceiver;
 
 public class TaskService extends Service {
 

+ 158 - 35
app/src/main/res/layout/activity_setting.xml

@@ -23,7 +23,7 @@
 
 
         <androidx.appcompat.widget.AppCompatButton
-            android:id="@+id/save"
+            android:id="@+id/save_and_start_master_app"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_alignParentEnd="true"
@@ -32,6 +32,16 @@
             android:drawableStart="@drawable/ic_save"
             android:text="保存并启动主应用" />
 
+        <androidx.appcompat.widget.AppCompatButton
+            android:id="@+id/save"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_centerVertical="true"
+            android:layout_marginEnd="5dp"
+            android:layout_toStartOf="@id/save_and_start_master_app"
+            android:drawableStart="@drawable/ic_save"
+            android:text="保存" />
+
     </RelativeLayout>
 
     <androidx.core.widget.NestedScrollView
@@ -151,40 +161,6 @@
                         android:text="文件管理" />
                 </androidx.cardview.widget.CardView>
 
-
-                <androidx.cardview.widget.CardView
-                    android:layout_width="wrap_content"
-                    android:layout_height="50dp"
-                    android:layout_margin="5dp">
-
-
-                    <androidx.appcompat.widget.SwitchCompat
-                        android:id="@+id/status_switch"
-                        android:layout_width="wrap_content"
-                        android:layout_height="match_parent"
-                        android:layout_gravity="center"
-                        android:paddingHorizontal="10dp"
-                        android:text="状态栏"
-                        app:switchPadding="10dp" />
-
-                </androidx.cardview.widget.CardView>
-
-                <androidx.cardview.widget.CardView
-                    android:layout_width="wrap_content"
-                    android:layout_height="50dp"
-                    android:layout_margin="5dp">
-
-                    <androidx.appcompat.widget.SwitchCompat
-                        android:id="@+id/nav_switch"
-                        android:layout_width="wrap_content"
-                        android:layout_height="match_parent"
-                        android:layout_gravity="center"
-                        android:paddingHorizontal="10dp"
-                        android:text="导航栏"
-                        app:switchPadding="10dp" />
-
-                </androidx.cardview.widget.CardView>
-
                 <androidx.cardview.widget.CardView
                     android:layout_width="wrap_content"
                     android:layout_height="50dp"
@@ -249,8 +225,155 @@
                         android:text="内存" />
                 </androidx.cardview.widget.CardView>
 
+                <androidx.cardview.widget.CardView
+                    android:layout_width="wrap_content"
+                    android:layout_height="50dp"
+                    android:layout_margin="5dp">
+
+
+                    <androidx.appcompat.widget.SwitchCompat
+                        android:id="@+id/status_switch"
+                        android:layout_width="wrap_content"
+                        android:layout_height="match_parent"
+                        android:layout_gravity="center"
+                        android:paddingHorizontal="10dp"
+                        android:text="状态栏"
+                        app:switchPadding="10dp" />
+
+                </androidx.cardview.widget.CardView>
+
+                <androidx.cardview.widget.CardView
+                    android:layout_width="wrap_content"
+                    android:layout_height="50dp"
+                    android:layout_margin="5dp">
+
+                    <androidx.appcompat.widget.SwitchCompat
+                        android:id="@+id/nav_switch"
+                        android:layout_width="wrap_content"
+                        android:layout_height="match_parent"
+                        android:layout_gravity="center"
+                        android:paddingHorizontal="10dp"
+                        android:text="导航栏"
+                        app:switchPadding="10dp" />
+
+                </androidx.cardview.widget.CardView>
+
+                <androidx.cardview.widget.CardView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_margin="5dp">
+
+                    <androidx.appcompat.widget.SwitchCompat
+                        android:id="@+id/auto_master_switch"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_gravity="center"
+                        android:paddingHorizontal="10dp"
+                        android:text="自动唤醒主应用"
+                        app:switchPadding="10dp" />
+
+                </androidx.cardview.widget.CardView>
+
+                <androidx.cardview.widget.CardView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_margin="5dp">
+
+                    <androidx.appcompat.widget.SwitchCompat
+                        android:id="@+id/auto_update_switch"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_gravity="center"
+                        android:paddingHorizontal="10dp"
+                        android:text="自动更新"
+                        app:switchPadding="10dp" />
+
+                </androidx.cardview.widget.CardView>
+
             </com.google.android.flexbox.FlexboxLayout>
 
+            <androidx.cardview.widget.CardView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginHorizontal="15dp">
+
+                <LinearLayout
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:orientation="vertical"
+                    android:paddingHorizontal="10dp"
+                    android:paddingVertical="5dp">
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:text="Http服务配置"
+                        android:textSize="16sp"
+                        android:textStyle="bold" />
+
+                    <LinearLayout
+                        android:layout_width="wrap_content"
+                        android:layout_height="45dp"
+                        android:layout_marginTop="5dp"
+                        android:background="@drawable/shape_rect"
+                        android:orientation="horizontal">
+
+                        <androidx.appcompat.widget.AppCompatEditText
+                            android:id="@+id/http_uri_ET"
+                            android:layout_width="wrap_content"
+                            android:layout_height="match_parent"
+                            android:clickable="false"
+                            android:drawableStart="@drawable/ic_http"
+                            android:drawablePadding="20dp"
+                            android:gravity="start"
+                            android:hint="http://192.168.1.8/api/"
+                            android:paddingEnd="20dp"
+                            android:text="" />
+
+                        <androidx.appcompat.widget.AppCompatButton
+                            android:id="@+id/http_uri_test_BT"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="测试地址" />
+                        <androidx.appcompat.widget.AppCompatButton
+                            android:id="@+id/http_uri_xn_BT"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="西农地址" />
+                    </LinearLayout>
+
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="10dp"
+                        android:text="管理员密码"
+                        android:textSize="16sp"
+                        android:textStyle="bold" />
+
+                    <LinearLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="45dp"
+                        android:layout_marginTop="5dp"
+                        android:background="@drawable/shape_rect"
+                        android:orientation="horizontal">
+
+                        <androidx.appcompat.widget.AppCompatEditText
+                            android:id="@+id/old_password_ET"
+                            android:layout_width="match_parent"
+                            android:layout_height="match_parent"
+                            android:drawableStart="@drawable/ic_mqtt_password"
+                            android:drawablePadding="20dp"
+                            android:hint="密码"
+                            android:maxLength="11"
+                            android:maxLines="1"
+                            android:paddingEnd="20dp" />
+
+                    </LinearLayout>
+
+                </LinearLayout>
+
+            </androidx.cardview.widget.CardView>
         </LinearLayout>
 
     </androidx.core.widget.NestedScrollView>

+ 1 - 1
app/src/main/res/values/strings.xml

@@ -1,5 +1,5 @@
 <resources>
-    <string name="app_name">update</string>
+    <string name="app_name">西农信息牌更新</string>
 
     <string-array name="http_schema">
         <item>http</item>