Files
bitchat-android/app/src/main/java/com/bitchat/android/MainActivity.kt
T
2025-07-08 20:37:46 +02:00

98 lines
3.5 KiB
Kotlin

package com.bitchat.android
import android.Manifest
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.result.contract.ActivityResultContracts
import androidx.activity.viewModels
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Surface
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import com.bitchat.android.ui.ChatScreen
import com.bitchat.android.ui.ChatViewModel
import com.bitchat.android.ui.theme.BitchatTheme
class MainActivity : ComponentActivity() {
private val chatViewModel: ChatViewModel by viewModels()
private val permissionLauncher = registerForActivityResult(
ActivityResultContracts.RequestMultiplePermissions()
) { permissions ->
val allPermissionsGranted = permissions.values.all { it }
if (allPermissionsGranted) {
// Permissions granted, the mesh service should start automatically
} else {
// Handle permission denial
finish()
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Request necessary permissions
requestPermissions()
setContent {
BitchatTheme {
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background
) {
ChatScreen(viewModel = chatViewModel)
}
}
}
}
private fun requestPermissions() {
val permissions = mutableListOf<String>()
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) {
permissions.addAll(listOf(
Manifest.permission.BLUETOOTH_ADVERTISE,
Manifest.permission.BLUETOOTH_CONNECT,
Manifest.permission.BLUETOOTH_SCAN
))
} else {
permissions.addAll(listOf(
Manifest.permission.BLUETOOTH,
Manifest.permission.BLUETOOTH_ADMIN
))
}
permissions.addAll(listOf(
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION
))
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.TIRAMISU) {
permissions.add(Manifest.permission.POST_NOTIFICATIONS)
}
permissionLauncher.launch(permissions.toTypedArray())
}
override fun onDestroy() {
super.onDestroy()
// FIXED: Ensure Bluetooth resources are cleaned up when the activity is destroyed
// This addresses the issue where stale Bluetooth advertisements interfere with
// restart discovery times. This is more reliable than relying solely on
// ChatViewModel.onCleared() which may not be called when the app is swiped away.
try {
chatViewModel.meshService.stopServices()
} catch (e: Exception) {
// Log error, but don't crash the app on exit
android.util.Log.w("MainActivity", "Error stopping mesh services in onDestroy: ${e.message}")
}
}
}