mirror of
https://github.com/permissionlesstech/bitchat-android.git
synced 2026-07-24 21:45:21 +00:00
98 lines
3.5 KiB
Kotlin
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}")
|
|
}
|
|
}
|
|
}
|