2025-11-26 02:30:03 +00:00
|
|
|
|
package com.example.smarthome
|
|
|
|
|
|
|
|
|
|
|
|
import android.graphics.drawable.Drawable
|
|
|
|
|
|
import android.os.Bundle
|
|
|
|
|
|
import androidx.activity.ComponentActivity
|
|
|
|
|
|
import com.example.smarthome.ui.theme.SmartHomeTheme
|
|
|
|
|
|
import androidx.compose.runtime.Composable
|
|
|
|
|
|
import androidx.compose.ui.graphics.Color
|
|
|
|
|
|
import androidx.compose.ui.platform.ViewCompositionStrategy
|
|
|
|
|
|
import eightbitlab.com.blurview.BlurTarget
|
|
|
|
|
|
import eightbitlab.com.blurview.BlurView
|
|
|
|
|
|
import androidx.compose.material3.Surface
|
|
|
|
|
|
import androidx.compose.foundation.layout.fillMaxSize
|
|
|
|
|
|
import androidx.compose.ui.Modifier
|
|
|
|
|
|
import androidx.core.view.WindowCompat
|
|
|
|
|
|
import androidx.compose.runtime.getValue
|
|
|
|
|
|
import androidx.compose.runtime.mutableStateOf
|
|
|
|
|
|
import androidx.compose.runtime.remember
|
|
|
|
|
|
import androidx.compose.runtime.setValue
|
|
|
|
|
|
import androidx.compose.foundation.layout.Box
|
|
|
|
|
|
import androidx.compose.ui.unit.dp
|
|
|
|
|
|
import com.example.smarthome.ui.MainScaffold
|
2025-11-28 05:21:09 +00:00
|
|
|
|
import com.example.smarthome.ui.LoginScreen
|
2025-11-26 02:30:03 +00:00
|
|
|
|
import androidx.compose.ui.platform.ComposeView
|
2025-11-26 03:23:00 +00:00
|
|
|
|
import androidx.compose.foundation.Image
|
|
|
|
|
|
import androidx.compose.ui.res.painterResource
|
|
|
|
|
|
import androidx.compose.ui.layout.ContentScale
|
|
|
|
|
|
import androidx.compose.foundation.background
|
|
|
|
|
|
import androidx.compose.foundation.layout.systemBarsPadding
|
2025-11-27 08:00:44 +00:00
|
|
|
|
import androidx.compose.runtime.collectAsState
|
|
|
|
|
|
import com.example.smarthome.data.BackgroundManager
|
2025-11-27 08:16:34 +00:00
|
|
|
|
import com.example.smarthome.data.LanguageManager
|
2025-11-28 05:21:09 +00:00
|
|
|
|
import com.example.smarthome.data.UserManager
|
2025-11-26 02:30:03 +00:00
|
|
|
|
|
|
|
|
|
|
class MainActivity : ComponentActivity() {
|
|
|
|
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
|
|
|
|
|
super.onCreate(savedInstanceState)
|
2025-11-26 03:23:00 +00:00
|
|
|
|
|
2025-11-27 08:16:34 +00:00
|
|
|
|
// 初始化语言管理器
|
|
|
|
|
|
LanguageManager.init(this)
|
2025-11-28 05:21:09 +00:00
|
|
|
|
// 初始化用户管理器
|
|
|
|
|
|
UserManager.init(this)
|
2025-11-27 08:16:34 +00:00
|
|
|
|
|
2025-11-26 03:23:00 +00:00
|
|
|
|
// 隐藏状态栏和导航栏
|
|
|
|
|
|
hideStatusBar()
|
2025-11-26 02:30:03 +00:00
|
|
|
|
|
|
|
|
|
|
setContentView(R.layout.activity_main)
|
|
|
|
|
|
val composeView = findViewById<ComposeView>(R.id.composeView)
|
|
|
|
|
|
composeView.setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed)
|
|
|
|
|
|
composeView.setContent {
|
|
|
|
|
|
SmartHomeTheme {
|
2025-11-26 03:23:00 +00:00
|
|
|
|
AppRoot()
|
2025-11-26 02:30:03 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
val decorView = window.decorView
|
|
|
|
|
|
val blurTarget = findViewById<BlurTarget>(R.id.blurTarget)
|
|
|
|
|
|
val blurView = findViewById<BlurView>(R.id.blurView)
|
|
|
|
|
|
val windowBackground: Drawable? = decorView.background
|
|
|
|
|
|
blurView.setupWith(blurTarget)
|
|
|
|
|
|
.setFrameClearDrawable(windowBackground)
|
|
|
|
|
|
.setBlurRadius(20f)
|
|
|
|
|
|
|
|
|
|
|
|
}
|
2025-11-26 03:23:00 +00:00
|
|
|
|
private fun hideStatusBar() {
|
|
|
|
|
|
// 设置全屏模式,让内容延伸到系统栏区域
|
|
|
|
|
|
WindowCompat.setDecorFitsSystemWindows(window, false)
|
|
|
|
|
|
|
|
|
|
|
|
// 设置全屏标志
|
|
|
|
|
|
window.setFlags(
|
|
|
|
|
|
android.view.WindowManager.LayoutParams.FLAG_FULLSCREEN,
|
|
|
|
|
|
android.view.WindowManager.LayoutParams.FLAG_FULLSCREEN
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
// 设置状态栏和导航栏为透明
|
|
|
|
|
|
window.statusBarColor = android.graphics.Color.TRANSPARENT
|
|
|
|
|
|
window.navigationBarColor = android.graphics.Color.TRANSPARENT
|
|
|
|
|
|
|
|
|
|
|
|
// 隐藏状态栏和导航栏
|
|
|
|
|
|
window.decorView.systemUiVisibility = (
|
|
|
|
|
|
android.view.View.SYSTEM_UI_FLAG_FULLSCREEN
|
|
|
|
|
|
or android.view.View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
|
|
|
|
|
|
or android.view.View.SYSTEM_UI_FLAG_LAYOUT_STABLE
|
|
|
|
|
|
or android.view.View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
|
|
|
|
|
|
or android.view.View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
|
|
|
|
|
|
or android.view.View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
// 支持刘海屏设备
|
|
|
|
|
|
val lp = window.attributes
|
|
|
|
|
|
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.P) {
|
|
|
|
|
|
lp.layoutInDisplayCutoutMode = android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
|
|
|
|
|
|
}
|
|
|
|
|
|
window.attributes = lp
|
|
|
|
|
|
}
|
2025-11-26 02:30:03 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Composable
|
|
|
|
|
|
fun AppRoot() {
|
|
|
|
|
|
val context = androidx.compose.ui.platform.LocalContext.current
|
2025-11-28 05:21:09 +00:00
|
|
|
|
|
|
|
|
|
|
// 监听登录状态
|
|
|
|
|
|
val isLoggedIn by UserManager.isLoggedIn.collectAsState()
|
|
|
|
|
|
|
|
|
|
|
|
if (!isLoggedIn) {
|
|
|
|
|
|
// 未登录,显示登录页面
|
|
|
|
|
|
LoginScreen(
|
|
|
|
|
|
onLoginSuccess = {
|
|
|
|
|
|
// 登录成功后会自动更新isLoggedIn状态
|
|
|
|
|
|
}
|
|
|
|
|
|
)
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// 已登录,显示主界面
|
|
|
|
|
|
MainContent()
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Composable
|
|
|
|
|
|
fun MainContent() {
|
|
|
|
|
|
val context = androidx.compose.ui.platform.LocalContext.current
|
2025-11-26 02:30:03 +00:00
|
|
|
|
val sharedPreferences = remember {
|
|
|
|
|
|
context.getSharedPreferences("smart_home_prefs", android.content.Context.MODE_PRIVATE)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 从SharedPreferences加载房间列表
|
|
|
|
|
|
val defaultRooms = listOf("总览", "客厅", "厨房", "卧室", "影音室", "游戏房")
|
|
|
|
|
|
val savedRooms = remember {
|
|
|
|
|
|
val saved = sharedPreferences.getString("rooms", null)
|
|
|
|
|
|
if (saved != null) {
|
|
|
|
|
|
saved.split(",").filter { it.isNotBlank() }
|
|
|
|
|
|
} else {
|
|
|
|
|
|
defaultRooms
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var selectedRoom by remember { mutableStateOf(0) }
|
|
|
|
|
|
var selectedNavItem by remember { mutableStateOf(0) } // 0=控制台, 5=设置
|
|
|
|
|
|
var rooms by remember { mutableStateOf(savedRooms) }
|
|
|
|
|
|
|
|
|
|
|
|
// 保存房间列表到SharedPreferences
|
|
|
|
|
|
fun saveRooms(roomList: List<String>) {
|
|
|
|
|
|
sharedPreferences.edit().putString("rooms", roomList.joinToString(",")).apply()
|
|
|
|
|
|
rooms = roomList
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-27 08:00:44 +00:00
|
|
|
|
// 初始化背景管理器并获取当前选中的背景
|
|
|
|
|
|
androidx.compose.runtime.LaunchedEffect(Unit) {
|
|
|
|
|
|
BackgroundManager.init(context)
|
|
|
|
|
|
}
|
|
|
|
|
|
val selectedBgId by BackgroundManager.selectedBackground.collectAsState()
|
|
|
|
|
|
val currentBg = BackgroundManager.backgrounds.getOrNull(selectedBgId)
|
|
|
|
|
|
val backgroundRes = currentBg?.resourceId ?: R.drawable.background1
|
|
|
|
|
|
// 根据背景类型调整遮罩透明度:暗色背景减少遮罩,亮色背景增加遮罩
|
|
|
|
|
|
val overlayAlpha = if (currentBg?.isDark == true) 0x11 else 0x88
|
|
|
|
|
|
|
2025-11-26 02:30:03 +00:00
|
|
|
|
Box(modifier = Modifier.fillMaxSize()) {
|
2025-11-26 03:23:00 +00:00
|
|
|
|
// 背景图片 - 填充整个屏幕包括系统栏,使用FillBounds确保完全填充
|
|
|
|
|
|
Image(
|
2025-11-27 08:00:44 +00:00
|
|
|
|
painter = painterResource(id = backgroundRes),
|
2025-11-26 03:23:00 +00:00
|
|
|
|
contentDescription = null,
|
|
|
|
|
|
modifier = Modifier.fillMaxSize(),
|
|
|
|
|
|
contentScale = ContentScale.FillBounds,
|
|
|
|
|
|
alpha = 0.8f
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
// 半透明遮罩层 - 填充整个屏幕包括系统栏
|
|
|
|
|
|
Box(
|
|
|
|
|
|
modifier = Modifier
|
|
|
|
|
|
.fillMaxSize()
|
2025-11-27 08:00:44 +00:00
|
|
|
|
.background(Color(overlayAlpha shl 24 or 0x121212))
|
2025-11-26 03:23:00 +00:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
// 主内容 - 添加系统栏内边距
|
|
|
|
|
|
Box(modifier = Modifier.fillMaxSize().systemBarsPadding()) {
|
|
|
|
|
|
MainScaffold(
|
2025-11-26 02:30:03 +00:00
|
|
|
|
selectedRoom = selectedRoom,
|
|
|
|
|
|
onRoomSelect = { selectedRoom = it },
|
|
|
|
|
|
selectedNavItem = selectedNavItem,
|
|
|
|
|
|
onNavItemSelect = { selectedNavItem = it },
|
|
|
|
|
|
rooms = rooms,
|
|
|
|
|
|
onAddRoom = { newRoomName ->
|
|
|
|
|
|
saveRooms(rooms + newRoomName)
|
|
|
|
|
|
},
|
|
|
|
|
|
onDeleteRoom = { index ->
|
|
|
|
|
|
if (rooms.size > 1) { // 至少保留一个房间
|
|
|
|
|
|
saveRooms(rooms.filterIndexed { i, _ -> i != index })
|
|
|
|
|
|
if (selectedRoom >= rooms.size - 1) {
|
|
|
|
|
|
selectedRoom = (rooms.size - 2).coerceAtLeast(0)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
)
|
2025-11-26 03:23:00 +00:00
|
|
|
|
}
|
2025-11-26 02:30:03 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|