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() 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}") } } }