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

136 lines
5.8 KiB
Kotlin
Raw Normal View History

package com.gacy.android
import android.Manifest
2026-11-02 02:39:37 +07:00
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
2026-11-02 02:39:37 +07:00
import android.widget.Toast
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
2026-11-02 02:39:37 +07:00
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
2026-11-02 02:39:37 +07:00
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)
2026-11-02 02:39:37 +07:00
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 {
2026-11-02 02:39:37 +07:00
var crashReport by remember { mutableStateOf(CrashTracker.getLastCrash(this@MainActivity)) }
MainScreen()
2026-11-02 02:39:37 +07:00
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
)
}
}
}
}