1、添加页面描述及说明
This commit is contained in:
shenzuqiang 2026-03-16 10:32:42 +08:00
parent 1148f91241
commit 589f5f08e5
20 changed files with 79 additions and 29 deletions

View File

@ -5,19 +5,18 @@
<uses-feature <uses-feature
android:name="android.hardware.camera" android:name="android.hardware.camera"
android:required="false" /> android:required="false" />
<!-- 在Android14及以上版本读取SelectedPhotoAccess需要添加READ_MEDIA_VISUAL_USER_SELECTED权限 --> <!-- 在Android14及以上版本读取SelectedPhotoAccess需要添加READ_MEDIA_VISUAL_USER_SELECTED权限 -->
<uses-permission android:name="android.permission.READ_MEDIA_VISUAL_USER_SELECTED" /> <uses-permission android:name="android.permission.READ_MEDIA_VISUAL_USER_SELECTED" />
<!--相机权限,用于打开相机和拍照:如用户反馈等--> <!--相机权限,用于打开相机和拍照:如用户反馈等-->
<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.CAMERA" />
<!-- 写入外部存储权限用于保存拍照后的图片或者下载文件主要兼容Android 13及以下版本 --> <!-- 写入外部存储权限用于保存拍照后的图片或者下载文件主要兼容Android 13及以下版本Android13以上高版本不需要但低版本必须 -->
<uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE" <uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="32" android:maxSdkVersion="32"
tools:ignore="ScopedStorage" /> tools:ignore="ScopedStorage" />
<!-- 读取外部存储权限用于读取相册图片主要兼容Android 13及以下版本 --> <!-- 读取外部存储权限用于读取相册图片主要兼容Android 13及以下版本Android13以上高版本不需要但低版本必须 -->
<uses-permission android:name = "android.permission.READ_EXTERNAL_STORAGE" <uses-permission android:name = "android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32" /> android:maxSdkVersion="32" />
<!-- 读取相册图片权限-Android 13以上版本的权限两种解决方案1、使用Android 照片选择器 (Photo Picker)即PickVisualMedia 2、使用READ_MEDIA_VISUAL_USER_SELECTED权限。这里选择第二种因为需要自定义相册。 --> <!-- 读取相册图片权限-Android 13以上版本的权限两种解决方案1、使用Android 照片选择器 (Photo Picker)即PickVisualMedia 2、使用READ_MEDIA_VISUAL_USER_SELECTED权限。这里选择第二种因为需要自定义相册。 -->
<uses-permission android:name = "android.permission.READ_MEDIA_IMAGES" <uses-permission android:name = "android.permission.READ_MEDIA_IMAGES"
tools:ignore="PhotoAndVideoPolicy" /> tools:ignore="PhotoAndVideoPolicy" />
<!--检测联网方式,在网络异常状态避免数据发送,节省流量和电量--> <!--检测联网方式,在网络异常状态避免数据发送,节省流量和电量-->
@ -34,7 +33,6 @@
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!--Unimp要求--> <!--Unimp要求-->
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
<!-- 安装应用权限 --> <!-- 安装应用权限 -->
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"
tools:ignore="RequestInstallPackagesPolicy" /> tools:ignore="RequestInstallPackagesPolicy" />

View File

@ -106,7 +106,6 @@ class MainActivity : ComponentActivity(), LoadingCallback {
// 启用Edge-to-Edge模式沉浸模式 // 启用Edge-to-Edge模式沉浸模式
enableEdgeToEdge() enableEdgeToEdge()
setContent { setContent {
val coroutineScope = rememberCoroutineScope() val coroutineScope = rememberCoroutineScope()
var showSplash by remember { mutableStateOf(false) } var showSplash by remember { mutableStateOf(false) }

View File

@ -9,13 +9,15 @@ import android.widget.TextView
import androidx.activity.enableEdgeToEdge import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
/**
* 用于隐私政策协议内部浏览的WebActivity
*/
class WebViewActivity : AppCompatActivity() { class WebViewActivity : AppCompatActivity() {
@SuppressLint("SetJavaScriptEnabled") @SuppressLint("SetJavaScriptEnabled")
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
// 启用Edge-to-Edge模式沉浸模式 // 启用Edge-to-Edge模式沉浸模式
enableEdgeToEdge() enableEdgeToEdge()

View File

@ -82,6 +82,10 @@ import com.img.rabbit.utils.WXAuthEvent
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import org.json.JSONObject import org.json.JSONObject
/**
* 登录页
* 包含两种打开方式1直接打开登录页无返回按钮 2从其他页面跳转打开登录页包含返回按钮
*/
@SuppressLint("UnrememberedMutableState") @SuppressLint("UnrememberedMutableState")
@Composable @Composable
@ -183,22 +187,24 @@ fun LoginScreen(navController: NavHostController? = null, generalViewModel: Gene
} }
} }
// LaunchedEffect(networkStatus) { /*
// delay(1000L) LaunchedEffect(networkStatus) {
// showNetworkDisconnected = true delay(1000L)
// } showNetworkDisconnected = true
// if(showNetworkDisconnected){ }
// if(!networkStatus){ if(showNetworkDisconnected){
// NetworkDisconnectedPage(generalViewModel = generalViewModel, onNetworkStatus = {isNetworkAvailable-> if(!networkStatus){
// if(isNetworkAvailable){ NetworkDisconnectedPage(generalViewModel = generalViewModel, onNetworkStatus = {isNetworkAvailable->
// Toast.makeText(context, "网络已连接", Toast.LENGTH_SHORT).show() if(isNetworkAvailable){
// }else{ Toast.makeText(context, "网络已连接", Toast.LENGTH_SHORT).show()
// Toast.makeText(context, "网络已断开", Toast.LENGTH_SHORT).show() }else{
// } Toast.makeText(context, "网络已断开", Toast.LENGTH_SHORT).show()
// generalViewModel.setNetworkStatus(isNetworkAvailable) }
// }) generalViewModel.setNetworkStatus(isNetworkAvailable)
// } })
// } }
}
*/
// 顶部栏 // 顶部栏
TitleBar(navController = navController, paddingValues = it, title = "", showSave = false, showBreak = isVisibilityBreak) TitleBar(navController = navController, paddingValues = it, title = "", showSave = false, showBreak = isVisibilityBreak)

View File

@ -63,6 +63,9 @@ sealed class TabItem(val title: String, val router:String, val normalIconRes: In
object Mine : TabItem("我的", "mine", R.mipmap.ic_mine_normal, R.mipmap.ic_mine_selected, Color(0xFFAAAAAA), Color(0xFF1A1A1A)) object Mine : TabItem("我的", "mine", R.mipmap.ic_mine_normal, R.mipmap.ic_mine_selected, Color(0xFFAAAAAA), Color(0xFF1A1A1A))
} }
/**
* 负责Tab切换和页面切换的NavController
*/
@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") @SuppressLint("UnusedMaterial3ScaffoldPaddingParameter")
@Composable @Composable
fun MainScreen(generalViewModel: GeneralViewModel, loginViewModel: LoginViewModel) { fun MainScreen(generalViewModel: GeneralViewModel, loginViewModel: LoginViewModel) {

View File

@ -35,6 +35,9 @@ import com.img.rabbit.R
import com.img.rabbit.utils.NetworkStatus import com.img.rabbit.utils.NetworkStatus
import com.img.rabbit.viewmodel.GeneralViewModel import com.img.rabbit.viewmodel.GeneralViewModel
/**
* 网络断开页已经不再使用改为Toast提示了
*/
@Composable @Composable
fun NetworkDisconnectedPage(navController: NavHostController? = null, generalViewModel: GeneralViewModel, onNetworkStatus: (Boolean) -> Unit) { fun NetworkDisconnectedPage(navController: NavHostController? = null, generalViewModel: GeneralViewModel, onNetworkStatus: (Boolean) -> Unit) {
val context = LocalContext.current val context = LocalContext.current

View File

@ -74,9 +74,10 @@ import kotlinx.coroutines.launch
import org.json.JSONObject import org.json.JSONObject
import kotlin.collections.chunked import kotlin.collections.chunked
@SuppressLint("UnrememberedMutableState", "MutableCollectionMutableState", /**
"SourceLockedOrientationActivity" * App首页页面
) */
@SuppressLint("UnrememberedMutableState", "MutableCollectionMutableState", "SourceLockedOrientationActivity")
@Composable @Composable
fun HomeScreen( fun HomeScreen(
navController: NavHostController, navController: NavHostController,
@ -204,8 +205,7 @@ fun HomeScreen(
val rows = homeIconConfig?.chunked(columnsCount)?:emptyList() val rows = homeIconConfig?.chunked(columnsCount)?:emptyList()
//模拟器 //模拟器
item { item {
Column( Column {
) {
Column( Column(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
@ -766,7 +766,7 @@ private fun dealUniMpDownloadLaunch(
progressPair: SnapshotStateMap<String, Float>, progressPair: SnapshotStateMap<String, Float>,
reportViewModel: ReportViewModel, reportViewModel: ReportViewModel,
loadingCallback: LoadingCallback?){ loadingCallback: LoadingCallback?){
val TAG = "Rabbit_HomeScreen" val TAG = "Rabbit_HomeScreen_download"
val uniMpId = uniMp.unimp_id val uniMpId = uniMp.unimp_id
// 处理点击事件,微信模拟器 // 处理点击事件,微信模拟器

View File

@ -59,6 +59,9 @@ import com.img.rabbit.viewmodel.MineViewModel
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
/**
* App我的页面
*/
@SuppressLint("UnrememberedMutableState", "CoroutineCreationDuringComposition") @SuppressLint("UnrememberedMutableState", "CoroutineCreationDuringComposition")
@Composable @Composable
fun MineScreen( fun MineScreen(

View File

@ -135,6 +135,9 @@ object ResourceManager {
} }
} }
/**
* 抠图页面
*/
@Composable @Composable
fun CutoutScreen(navController: NavController, viewModel: CutoutViewModel = viewModel()) { fun CutoutScreen(navController: NavController, viewModel: CutoutViewModel = viewModel()) {
val context = LocalContext.current val context = LocalContext.current

View File

@ -44,6 +44,9 @@ import com.img.rabbit.utils.ImageUtils.convertToGallery
import com.img.rabbit.utils.ImageUtils.getBitmapFromUri import com.img.rabbit.utils.ImageUtils.getBitmapFromUri
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
/**
* 格式转换页
*/
@Composable @Composable
fun FormatScreen(navController: NavController) { fun FormatScreen(navController: NavController) {
val context = LocalContext.current val context = LocalContext.current

View File

@ -65,6 +65,9 @@ import io.moyuru.cropify.Cropify
import io.moyuru.cropify.CropifyOption import io.moyuru.cropify.CropifyOption
import io.moyuru.cropify.rememberCropifyState import io.moyuru.cropify.rememberCropifyState
/**
* 长图页
*/
@Composable @Composable
fun LongImageScreen(navController: NavController) { fun LongImageScreen(navController: NavController) {
val context = LocalContext.current val context = LocalContext.current

View File

@ -64,6 +64,9 @@ import com.img.rabbit.utils.ImageUtils
import com.img.rabbit.utils.ImageUtils.saveCanvasToGallery import com.img.rabbit.utils.ImageUtils.saveCanvasToGallery
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
/**
* 改尺寸页
*/
@Composable @Composable
fun ResizeScreen(navController: NavController) { fun ResizeScreen(navController: NavController) {
val context = LocalContext.current val context = LocalContext.current

View File

@ -45,6 +45,9 @@ import com.img.rabbit.pages.toolbar.TitleBar
import com.img.rabbit.viewmodel.FeedbackViewModel import com.img.rabbit.viewmodel.FeedbackViewModel
import okhttp3.RequestBody.Companion.toRequestBody import okhttp3.RequestBody.Companion.toRequestBody
/**
* 反馈页
*/
@Composable @Composable
fun FeedbackScreen(navController: NavHostController, viewModel: FeedbackViewModel = viewModel()) { fun FeedbackScreen(navController: NavHostController, viewModel: FeedbackViewModel = viewModel()) {
val context = LocalContext.current val context = LocalContext.current

View File

@ -48,6 +48,9 @@ import com.img.rabbit.provider.storage.PreferenceUtil
import com.img.rabbit.utils.AppDataStoreUtils import com.img.rabbit.utils.AppDataStoreUtils
import com.img.rabbit.viewmodel.LoginViewModel import com.img.rabbit.viewmodel.LoginViewModel
/**
* 设置页
*/
@SuppressLint("UnrememberedMutableState") @SuppressLint("UnrememberedMutableState")
@Composable @Composable
fun SettingScreen(navController: NavHostController, loginViewModel: LoginViewModel) { fun SettingScreen(navController: NavHostController, loginViewModel: LoginViewModel) {

View File

@ -39,6 +39,9 @@ import com.img.rabbit.config.Constants.privacyUrl
import com.img.rabbit.pages.toolbar.TitleBar import com.img.rabbit.pages.toolbar.TitleBar
import com.img.rabbit.utils.UrlLinkUtils.openAgreement import com.img.rabbit.utils.UrlLinkUtils.openAgreement
/**
* 关于我们页
*/
@Composable @Composable
fun AboutScreen(navController: NavHostController) { fun AboutScreen(navController: NavHostController) {
Scaffold{ Scaffold{

View File

@ -53,6 +53,9 @@ import com.img.rabbit.utils.LoginBindEvent
import com.img.rabbit.viewmodel.AccountBindViewModel import com.img.rabbit.viewmodel.AccountBindViewModel
import com.img.rabbit.viewmodel.BindViewModel import com.img.rabbit.viewmodel.BindViewModel
/**
* 账号绑定页
*/
@SuppressLint("UnrememberedMutableState") @SuppressLint("UnrememberedMutableState")
@Composable @Composable
fun AccountBindScreen(navController: NavHostController, viewModel: AccountBindViewModel = viewModel()) { fun AccountBindScreen(navController: NavHostController, viewModel: AccountBindViewModel = viewModel()) {

View File

@ -53,6 +53,9 @@ import com.img.rabbit.viewmodel.AccountManagerViewModel
import com.img.rabbit.viewmodel.LoginViewModel import com.img.rabbit.viewmodel.LoginViewModel
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
/**
* 账号管理页(切换或添加账号)
*/
@Composable @Composable
fun AccountManagerScreen(navController: NavHostController, viewModel: AccountManagerViewModel = viewModel()) { fun AccountManagerScreen(navController: NavHostController, viewModel: AccountManagerViewModel = viewModel()) {
var showDialogStatus by remember { mutableStateOf(false) } var showDialogStatus by remember { mutableStateOf(false) }

View File

@ -79,6 +79,9 @@ import com.img.rabbit.viewmodel.GeneralViewModel
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import org.json.JSONObject import org.json.JSONObject
/**
* 账号绑定页绑定手机号或微信类似 登录页
*/
@SuppressLint("UnrememberedMutableState") @SuppressLint("UnrememberedMutableState")
@Composable @Composable
fun BindScreen(navController: NavHostController, viewModel: BindViewModel = viewModel(), generalViewModel: GeneralViewModel, bindType: Int) { fun BindScreen(navController: NavHostController, viewModel: BindViewModel = viewModel(), generalViewModel: GeneralViewModel, bindType: Int) {

View File

@ -48,6 +48,9 @@ import com.img.rabbit.components.CenterToast
import com.img.rabbit.pages.toolbar.TitleBar import com.img.rabbit.pages.toolbar.TitleBar
import com.img.rabbit.viewmodel.DeleteAccountViewModel import com.img.rabbit.viewmodel.DeleteAccountViewModel
/**
* 注销删除账号页
*/
@Composable @Composable
fun DeleteAccountScreen(navController: NavHostController,viewModel: DeleteAccountViewModel = viewModel()) { fun DeleteAccountScreen(navController: NavHostController,viewModel: DeleteAccountViewModel = viewModel()) {
val inputTextValue = "我自愿注销本账号" val inputTextValue = "我自愿注销本账号"

View File

@ -31,6 +31,9 @@ import androidx.navigation.NavController
import com.img.rabbit.R import com.img.rabbit.R
import com.img.rabbit.pages.toolbar.TitleBar import com.img.rabbit.pages.toolbar.TitleBar
/**
* 拍照指南页
*/
@Composable @Composable
fun CameraGuideScreen(navController: NavController) { fun CameraGuideScreen(navController: NavController) {
Scaffold { Scaffold {