Files
GaCyGO-Android/app/src/main/java/com/gacy/android/MainActivity.kt
T

137 lines
5.8 KiB
Kotlin

package com.gacy.android
import android.Manifest
import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context
import android.content.pm.PackageManager
import android.os.Build
import android.os.Bundle
import android.widget.Toast
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.selection.SelectionContainer
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.WindowInsetsControllerCompat
import com.gacy.android.ui.screens.MainScreen
import com.gacy.android.ui.theme.GaCyTheme
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
CrashTracker.breadcrumb(this, "MainActivity: onCreate")
// ซ่อน Status Bar
val windowInsetsController = WindowCompat.getInsetsController(window, window.decorView)
windowInsetsController.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
windowInsetsController.hide(WindowInsetsCompat.Type.statusBars()) // ใช้ .systemBars() ถ้าต้องการซ่อน Navigation Bar ด้านล่างด้วย
enableEdgeToEdge()
requestAppPermissions()
setContent {
GaCyTheme {
var crashReport by remember { mutableStateOf(CrashTracker.getLastCrash(this@MainActivity)) }
MainScreen()
if (crashReport != null) {
AlertDialog(
onDismissRequest = {
CrashTracker.clearLastCrash(this@MainActivity)
crashReport = null
},
title = {
Text(
"⚠️ GaCy Crash Report",
fontWeight = FontWeight.Bold,
color = MaterialTheme.colorScheme.error
)
},
text = {
Column {
Text(
"A fatal error occurred in the previous session:",
fontSize = 13.sp,
color = Color.LightGray
)
Spacer(modifier = Modifier.height(8.dp))
SelectionContainer {
Text(
text = crashReport ?: "",
fontSize = 11.sp,
fontFamily = FontFamily.Monospace,
modifier = Modifier
.fillMaxWidth()
.heightIn(max = 300.dp)
.verticalScroll(rememberScrollState())
.background(Color(0xFF1E1E1E), RoundedCornerShape(8.dp))
.padding(8.dp),
color = Color(0xFFFF8A80)
)
}
}
},
confirmButton = {
Button(
onClick = {
val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as? ClipboardManager
val clip = ClipData.newPlainText("GaCy Crash", crashReport)
clipboard?.setPrimaryClip(clip)
Toast.makeText(this@MainActivity, "Crash report copied!", Toast.LENGTH_SHORT).show()
}
) {
Text("Copy Log")
}
},
dismissButton = {
TextButton(
onClick = {
CrashTracker.clearLastCrash(this@MainActivity)
crashReport = null
}
) {
Text("Dismiss")
}
}
)
}
}
}
}
private fun requestAppPermissions() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
if (ContextCompat.checkSelfPermission(
this,
Manifest.permission.POST_NOTIFICATIONS
) != PackageManager.PERMISSION_GRANTED
) {
ActivityCompat.requestPermissions(
this,
arrayOf(Manifest.permission.POST_NOTIFICATIONS),
101
)
}
}
}
}