parent
1148f91241
commit
589f5f08e5
|
|
@ -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" />
|
||||||
|
|
|
||||||
|
|
@ -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) }
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
// 处理点击事件,微信模拟器
|
// 处理点击事件,微信模拟器
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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{
|
||||||
|
|
|
||||||
|
|
@ -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()) {
|
||||||
|
|
|
||||||
|
|
@ -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) }
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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 = "我自愿注销本账号"
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue