137 lines
5.8 KiB
Kotlin
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
|
|
)
|
|
}
|
|
}
|
|
}
|
|
}
|