Parcourir la source

feat(task): 添加任务列表功能并优化启动流程

- 新增 tesh.sh 脚本用于设备监控和 scrcpy 连接
- 创建 TaskItem 数据模型类
- 实现 TaskListActivity 任务列表界面
- 添加 TaskListVM 视图模型处理数据加载
- 在 WelcomeActivity 中跳转到任务列表页面
- 移除应用中的崩溃处理器初始化
- 添加任务列表背景样式资源文件
- 设计任务列表页面布局和列表项布局
- 更新欢迎页面界面样式和文字内容
- 在 Manifest 中注册任务列表 Activity
- 调整应用屏幕尺寸配置为 480x600
- 优化权限配置注释结构
徐勤民 il y a 3 jours
Parent
commit
716c34cc54

+ 13 - 26
app/src/main/AndroidManifest.xml

@@ -6,22 +6,17 @@
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
     <uses-permission
         android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
-        tools:ignore="AllFilesAccessPolicy,ScopedStorage" />
-
-    <!-- 媒体权限 -->
+        tools:ignore="AllFilesAccessPolicy,ScopedStorage" /> <!-- 媒体权限 -->
     <uses-permission android:name="android.permission.CAMERA" />
     <uses-permission android:name="android.permission.RECORD_AUDIO" />
-    <uses-permission android:name="android.permission.VIBRATE" />
-
-    <!-- 网络权限 -->
+    <uses-permission android:name="android.permission.VIBRATE" /> <!-- 网络权限 -->
     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
+    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
     <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
-    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
-
-    <!-- 蓝牙权限 -->
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 蓝牙权限 -->
     <uses-permission android:name="android.permission.BLUETOOTH" />
     <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
     <uses-permission
@@ -29,27 +24,19 @@
         android:usesPermissionFlags="neverForLocation"
         tools:targetApi="31" />
     <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
-    <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
-
-    <!-- 位置权限 -->
+    <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" /> <!-- 位置权限 -->
     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
-    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
-
-    <!-- Android 12 及以上 Wi-Fi P2P 权限 -->
+    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- Android 12 及以上 Wi-Fi P2P 权限 -->
     <uses-permission
         android:name="android.permission.NEARBY_WIFI_DEVICES"
         android:usesPermissionFlags="neverForLocation"
-        tools:targetApi="31" />
-
-    <!-- 功能声明 -->
+        tools:targetApi="31" /> <!-- 功能声明 -->
     <uses-feature
         android:name="android.hardware.wifi.direct"
         android:required="false" />
     <uses-feature
         android:name="android.hardware.camera"
-        android:required="false" />
-
-    <!-- 系统级权限 -->
+        android:required="false" /> <!-- 系统级权限 -->
     <uses-permission
         android:name="android.permission.REBOOT"
         tools:ignore="ProtectedPermissions" />
@@ -63,7 +50,6 @@
     <uses-permission
         android:name="android.permission.ACCESS_BACKGROUND_LOCATION"
         tools:ignore="BackgroundLocationPolicy" />
-    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
     <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
     <uses-permission android:name="android.permission.WRITE_SETTINGS" />
     <uses-permission android:name="android.permission.WAKE_LOCK" />
@@ -80,8 +66,9 @@
         android:theme="@style/AppTheme"
         android:usesCleartextTraffic="true"
         tools:replace="android:label">
-
-
+        <activity
+            android:name=".ui.TaskListActivity"
+            android:exported="false" />
         <activity
             android:name=".ui.MainActivity"
             android:exported="false" />
@@ -108,10 +95,10 @@
 
         <meta-data
             android:name="design_width_in_dp"
-            android:value="540" />
+            android:value="480" />
         <meta-data
             android:name="design_height_in_dp"
-            android:value="960" />
+            android:value="600" />
     </application>
 
 </manifest>

+ 2 - 5
app/src/main/java/com/nova/brain/glass/MyApplication.java

@@ -1,10 +1,8 @@
 package com.nova.brain.glass;
 
+import com.nova.brain.glass.repository.HeaderInterceptor;
 import com.xuqm.base.App;
-import com.xuqm.base.di.component.AppComponent;
 import com.xuqm.base.di.manager.HttpManager;
-import com.nova.brain.glass.common.CrashHandler;
-import com.nova.brain.glass.repository.HeaderInterceptor;
 
 /**
  * @author xuqm
@@ -18,8 +16,7 @@ public class MyApplication extends App {
         super.onCreate();
         appComponent = HttpManager.getAppComponent(baseUrl, new HeaderInterceptor(getApplicationContext()));
 
-        CrashHandler.getInstance().init(this);
-        
+
     }
 
     @Override

+ 7 - 0
app/src/main/java/com/nova/brain/glass/model/TaskItem.kt

@@ -0,0 +1,7 @@
+package com.nova.brain.glass.model
+
+import com.xuqm.base.adapter.BaseItem
+
+data class TaskItem(val id: String): BaseItem() {
+    var selected: Boolean = false
+}

+ 31 - 0
app/src/main/java/com/nova/brain/glass/ui/TaskListActivity.kt

@@ -0,0 +1,31 @@
+package com.nova.brain.glass.ui
+
+import android.view.View
+import com.nova.brain.glass.R
+import com.nova.brain.glass.databinding.ActivityTaskListBinding
+import com.nova.brain.glass.model.TaskItem
+import com.nova.brain.glass.viewmodel.TaskListVM
+import com.xuqm.base.adapter.BasePagedAdapter
+import com.xuqm.base.adapter.CommonPagedAdapter
+import com.xuqm.base.adapter.ViewHolder
+import com.xuqm.base.adapter.callback.AdapterClickListener
+import com.xuqm.base.common.ToolsHelper
+import com.xuqm.base.ui.BaseListFormLayoutActivity
+
+class TaskListActivity :
+    BaseListFormLayoutActivity<TaskItem, TaskListVM, ActivityTaskListBinding>() {
+    override fun getLayoutId(): Int = R.layout.activity_task_list
+    override fun fullscreen(): Boolean = true
+    private val adapter = object : CommonPagedAdapter<TaskItem>(R.layout.item_task_list) {
+        override fun convert(holder: ViewHolder, item: TaskItem, position: Int) {
+            holder
+                .setText(R.id.tv_title, "${position}.张三提交的出差预算申请审核任务,从上海到北京,3月23开始3月24结束,预算金额¥1800元。【已逾期】")
+                .setClickListener(R.id.tv_title
+                ) {
+                    ToolsHelper.showMessage("点击了${position}")
+                }
+        }
+    }
+
+    override fun adapter(): BasePagedAdapter<TaskItem> = adapter
+}

+ 2 - 0
app/src/main/java/com/nova/brain/glass/ui/WelcomeActivity.kt

@@ -1,5 +1,6 @@
 package com.nova.brain.glass.ui
 
+import android.content.Intent
 import android.os.Bundle
 import com.nova.brain.glass.R
 import com.nova.brain.glass.databinding.ActivityWelcomeBinding
@@ -12,6 +13,7 @@ class WelcomeActivity : BaseActivity<ActivityWelcomeBinding>() {
 
     override fun initView(savedInstanceState: Bundle?) {
         super.initView(savedInstanceState)
+        startActivity(Intent(this, TaskListActivity::class.java))
     }
 
 

+ 18 - 0
app/src/main/java/com/nova/brain/glass/viewmodel/TaskListVM.kt

@@ -0,0 +1,18 @@
+package com.nova.brain.glass.viewmodel
+
+import com.nova.brain.glass.model.TaskItem
+import com.xuqm.base.viewmodel.BaseListViewModel
+import com.xuqm.base.viewmodel.callback.Response
+
+class TaskListVM: BaseListViewModel<TaskItem>() {
+    override fun loadData(
+        page: Int,
+        onResponse: Response<TaskItem>
+    ) {
+        onResponse.onResponse(arrayListOf<TaskItem>().apply {
+            for (i in 0..10) {
+                add(TaskItem(i.toString()))
+            }
+        })
+    }
+}

+ 5 - 0
app/src/main/res/drawable/bg_task_list.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+<item android:state_focused="true" android:drawable="@drawable/bg_task_title_selected"/>
+<item android:state_focused="false" android:drawable="@drawable/bg_task_title_normal"/>
+</selector>

+ 48 - 0
app/src/main/res/layout/activity_task_list.xml

@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:id="@+id/main"
+        android:layout_width="match_parent"
+        android:background="@color/app_color_black"
+        android:layout_height="match_parent">
+
+        <TextView
+            android:id="@+id/tvTaskHeader"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:text="查询到您当前有5条任务,信息如下:"
+            android:textColor="#ff40FF5E"
+            android:textSize="20sp"
+            android:textFontWeight="500"
+            android:fontFamily="HarmonyOS Sans"
+            android:gravity="start|top"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
+            android:id="@+id/baseRefreshLayout"
+            android:layout_width="0dp"
+            android:layout_marginTop="16dp"
+            android:layout_height="300dp"
+            app:layout_constraintTop_toBottomOf="@id/tvTaskHeader"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintEnd_toEndOf="parent">
+
+            <com.xuqm.base.view.EmptyView
+                android:id="@+id/baseEmptyView"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent">
+
+                <androidx.recyclerview.widget.RecyclerView
+                    android:id="@+id/baseRecyclerView"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:overScrollMode="never" />
+            </com.xuqm.base.view.EmptyView>
+        </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+</layout>

+ 18 - 8
app/src/main/res/layout/activity_welcome.xml

@@ -2,14 +2,24 @@
 <layout xmlns:app="http://schemas.android.com/apk/res-auto">
     <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
         android:layout_width="match_parent"
+        android:background="@color/app_color_black"
         android:layout_height="match_parent">
-<TextView
-    app:layout_constraintTop_toTopOf="parent"
-    app:layout_constraintStart_toStartOf="parent"
-    app:layout_constraintEnd_toEndOf="parent"
-    app:layout_constraintBottom_toBottomOf="parent"
-    android:layout_width="wrap_content"
-    android:layout_height="wrap_content"
-    android:text="welcome"/>
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:background="@color/app_color_black"
+            android:layout_alignParentTop="true"
+            android:textColor="#ff3FFF5F"
+            android:textSize="19sp"
+            android:text="您可以说:Nova,我的任务有哪些?"
+            android:fontFamily="Source Han Sans"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            android:gravity="left|top"
+            android:alpha="1"
+            />
+
     </androidx.constraintlayout.widget.ConstraintLayout>
 </layout>

+ 15 - 0
app/src/main/res/layout/item_task_list.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/tv_title"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:layout_alignParentTop="true"
+    android:alpha="1"
+    android:background="@drawable/bg_task_list"
+    android:fontFamily="HarmonyOS Sans SC"
+    android:gravity="left|top"
+    android:lineSpacingExtra="4.8sp"
+    android:padding="8dp"
+    android:textColor="#ff40FF5E"
+    android:textFontWeight="500"
+    android:textSize="16sp" />

+ 31 - 0
tesh.sh

@@ -0,0 +1,31 @@
+#!/bin/bash
+# scrcpy_auto.sh
+# 简化的系统监控脚本
+
+# 颜色定义
+RED='\033[0;31m'
+YELLOW='\033[1;33m'
+GREEN='\033[0;32m'
+BLUE='\033[0;34m'
+CYAN='\033[0;36m'
+PURPLE='\033[0;35m'
+NC='\033[0m'
+BOLD='\033[1m'
+
+# 开始时间
+START_TIME=$(date +%s)
+# 计数器
+COUNTER=0
+
+DEVICE=$(adb devices | grep -E '^190[0-9a-zA-Z]+\s+device' | head -1 | awk '{print $1}')
+
+if [ -z "$DEVICE" ]; then
+    echo -e "${RED}错误: 未找到连接的设备${NC}"
+    exit 1 # 退出整个脚本
+fi
+
+
+  echo -e "${GREEN}     监控设备: $DEVICE${NC}     "
+  echo -e "${YELLOW}${BOLD}======================================="
+
+scrcpy -s $DEVICE