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

- 新增 tesh.sh 脚本用于设备监控和 scrcpy 连接
- 创建 TaskItem 数据模型类
- 实现 TaskListActivity 任务列表界面
- 添加 TaskListVM 视图模型处理数据加载
- 在 WelcomeActivity 中跳转到任务列表页面
- 移除应用中的崩溃处理器初始化
- 添加任务列表背景样式资源文件
- 设计任务列表页面布局和列表项布局
- 更新欢迎页面界面样式和文字内容
- 在 Manifest 中注册任务列表 Activity
- 调整应用屏幕尺寸配置为 480x600
- 优化权限配置注释结构
这个提交包含在:
徐勤民 2026-04-14 12:49:14 +08:00
父节点 807634b4c4
当前提交 716c34cc54
共有 11 个文件被更改,包括 191 次插入40 次删除

查看文件

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

查看文件

@ -1,10 +1,8 @@
package com.nova.brain.glass;
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;
import com.xuqm.base.App;
import com.xuqm.base.di.manager.HttpManager;
/**
* @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

查看文件

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

查看文件

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

查看文件

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

查看文件

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

查看文件

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

查看文件

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

查看文件

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

查看文件

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