feat(task): 添加任务列表功能并优化启动流程
- 新增 tesh.sh 脚本用于设备监控和 scrcpy 连接 - 创建 TaskItem 数据模型类 - 实现 TaskListActivity 任务列表界面 - 添加 TaskListVM 视图模型处理数据加载 - 在 WelcomeActivity 中跳转到任务列表页面 - 移除应用中的崩溃处理器初始化 - 添加任务列表背景样式资源文件 - 设计任务列表页面布局和列表项布局 - 更新欢迎页面界面样式和文字内容 - 在 Manifest 中注册任务列表 Activity - 调整应用屏幕尺寸配置为 480x600 - 优化权限配置注释结构
这个提交包含在:
父节点
807634b4c4
当前提交
716c34cc54
@ -6,22 +6,17 @@
|
|||||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||||
<uses-permission
|
<uses-permission
|
||||||
android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
|
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.CAMERA" />
|
||||||
<uses-permission android:name="android.permission.RECORD_AUDIO" />
|
<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.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.SYSTEM_ALERT_WINDOW" />
|
||||||
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
|
<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_WIFI_STATE" />
|
||||||
<uses-permission android:name="android.permission.CHANGE_NETWORK_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" />
|
||||||
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
|
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
|
||||||
<uses-permission
|
<uses-permission
|
||||||
@ -29,27 +24,19 @@
|
|||||||
android:usesPermissionFlags="neverForLocation"
|
android:usesPermissionFlags="neverForLocation"
|
||||||
tools:targetApi="31" />
|
tools:targetApi="31" />
|
||||||
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
|
<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_COARSE_LOCATION" />
|
||||||
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- Android 12 及以上 Wi-Fi P2P 权限 -->
|
||||||
|
|
||||||
<!-- Android 12 及以上 Wi-Fi P2P 权限 -->
|
|
||||||
<uses-permission
|
<uses-permission
|
||||||
android:name="android.permission.NEARBY_WIFI_DEVICES"
|
android:name="android.permission.NEARBY_WIFI_DEVICES"
|
||||||
android:usesPermissionFlags="neverForLocation"
|
android:usesPermissionFlags="neverForLocation"
|
||||||
tools:targetApi="31" />
|
tools:targetApi="31" /> <!-- 功能声明 -->
|
||||||
|
|
||||||
<!-- 功能声明 -->
|
|
||||||
<uses-feature
|
<uses-feature
|
||||||
android:name="android.hardware.wifi.direct"
|
android:name="android.hardware.wifi.direct"
|
||||||
android:required="false" />
|
android:required="false" />
|
||||||
<uses-feature
|
<uses-feature
|
||||||
android:name="android.hardware.camera"
|
android:name="android.hardware.camera"
|
||||||
android:required="false" />
|
android:required="false" /> <!-- 系统级权限 -->
|
||||||
|
|
||||||
<!-- 系统级权限 -->
|
|
||||||
<uses-permission
|
<uses-permission
|
||||||
android:name="android.permission.REBOOT"
|
android:name="android.permission.REBOOT"
|
||||||
tools:ignore="ProtectedPermissions" />
|
tools:ignore="ProtectedPermissions" />
|
||||||
@ -63,7 +50,6 @@
|
|||||||
<uses-permission
|
<uses-permission
|
||||||
android:name="android.permission.ACCESS_BACKGROUND_LOCATION"
|
android:name="android.permission.ACCESS_BACKGROUND_LOCATION"
|
||||||
tools:ignore="BackgroundLocationPolicy" />
|
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.MODIFY_AUDIO_SETTINGS" />
|
||||||
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
|
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
|
||||||
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
||||||
@ -80,8 +66,9 @@
|
|||||||
android:theme="@style/AppTheme"
|
android:theme="@style/AppTheme"
|
||||||
android:usesCleartextTraffic="true"
|
android:usesCleartextTraffic="true"
|
||||||
tools:replace="android:label">
|
tools:replace="android:label">
|
||||||
|
<activity
|
||||||
|
android:name=".ui.TaskListActivity"
|
||||||
|
android:exported="false" />
|
||||||
<activity
|
<activity
|
||||||
android:name=".ui.MainActivity"
|
android:name=".ui.MainActivity"
|
||||||
android:exported="false" />
|
android:exported="false" />
|
||||||
@ -108,10 +95,10 @@
|
|||||||
|
|
||||||
<meta-data
|
<meta-data
|
||||||
android:name="design_width_in_dp"
|
android:name="design_width_in_dp"
|
||||||
android:value="540" />
|
android:value="480" />
|
||||||
<meta-data
|
<meta-data
|
||||||
android:name="design_height_in_dp"
|
android:name="design_height_in_dp"
|
||||||
android:value="960" />
|
android:value="600" />
|
||||||
</application>
|
</application>
|
||||||
|
|
||||||
</manifest>
|
</manifest>
|
||||||
@ -1,10 +1,8 @@
|
|||||||
package com.nova.brain.glass;
|
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.nova.brain.glass.repository.HeaderInterceptor;
|
||||||
|
import com.xuqm.base.App;
|
||||||
|
import com.xuqm.base.di.manager.HttpManager;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author xuqm
|
* @author xuqm
|
||||||
@ -18,7 +16,6 @@ public class MyApplication extends App {
|
|||||||
super.onCreate();
|
super.onCreate();
|
||||||
appComponent = HttpManager.getAppComponent(baseUrl, new HeaderInterceptor(getApplicationContext()));
|
appComponent = HttpManager.getAppComponent(baseUrl, new HeaderInterceptor(getApplicationContext()));
|
||||||
|
|
||||||
CrashHandler.getInstance().init(this);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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
|
package com.nova.brain.glass.ui
|
||||||
|
|
||||||
|
import android.content.Intent
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import com.nova.brain.glass.R
|
import com.nova.brain.glass.R
|
||||||
import com.nova.brain.glass.databinding.ActivityWelcomeBinding
|
import com.nova.brain.glass.databinding.ActivityWelcomeBinding
|
||||||
@ -12,6 +13,7 @@ class WelcomeActivity : BaseActivity<ActivityWelcomeBinding>() {
|
|||||||
|
|
||||||
override fun initView(savedInstanceState: Bundle?) {
|
override fun initView(savedInstanceState: Bundle?) {
|
||||||
super.initView(savedInstanceState)
|
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">
|
<layout xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
android:background="@color/app_color_black"
|
||||||
android:layout_height="match_parent">
|
android:layout_height="match_parent">
|
||||||
<TextView
|
<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_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="welcome"/>
|
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>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
</layout>
|
</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
普通文件
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
|
||||||
正在加载...
在新工单中引用
屏蔽一个用户