🐛 Fixes auth activity doesn't load URL and token

This commit is contained in:
2026-04-17 15:52:55 +02:00
parent 7194b95182
commit 3885474e97
2 changed files with 114 additions and 92 deletions
@@ -87,8 +87,14 @@ class AuthActivity : ComponentActivity() {
return regex.matches(serverUrl) return regex.matches(serverUrl)
} }
LaunchedEffect(Unit) {
serverUrl = apiDataHolder.serverUrl
token = apiDataHolder.token
isServerUrlOk = prefs.getBoolean(context.getString(R.string.server_url_okay_key), false)
isTokenOk = prefs.getBoolean(context.getString(R.string.token_okay_key), false)
}
LaunchedEffect(serverUrl) { LaunchedEffect(serverUrl) {
println("SERVER URL CHANGED")
apiDataHolder.serverUrl = serverUrl apiDataHolder.serverUrl = serverUrl
prefs.edit { prefs.edit {
putString( putString(
@@ -107,7 +113,8 @@ class AuthActivity : ComponentActivity() {
isServerUrlOk = try { isServerUrlOk = try {
API.doesServerRespond() API.doesServerRespond()
} catch (_: Exception) { } catch (e: Exception) {
Log.e("AuthActivity", "Checking server response failed", e)
false false
} }
@@ -30,7 +30,11 @@ import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.material3.rememberDrawerState import androidx.compose.material3.rememberDrawerState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
@@ -41,6 +45,8 @@ import kotlinx.coroutines.launch
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
class MainActivity : ComponentActivity() { class MainActivity : ComponentActivity() {
private var reload: (() -> Unit)? = null
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
enableEdgeToEdge() enableEdgeToEdge()
@@ -58,105 +64,113 @@ class MainActivity : ComponentActivity() {
val apiDataHolder = APIDataHolder.getInstance() val apiDataHolder = APIDataHolder.getInstance()
apiDataHolder.initializeFromPrefs(context, prefs) apiDataHolder.initializeFromPrefs(context, prefs)
ModalNavigationDrawer( // TODO: fix reloading UI
drawerState = drawerState, var uiNeedsReload by remember { mutableStateOf(false) }
drawerContent = { reload = fun() { uiNeedsReload = true }
ModalDrawerSheet {
Column(
modifier = Modifier
.padding(horizontal = 16.dp)
.verticalScroll(rememberScrollState())
) {
Spacer(modifier = Modifier.height(24.dp))
Text(
stringResource(R.string.app_name),
modifier = Modifier.padding(16.dp),
style = MaterialTheme.typography.titleLarge
)
HorizontalDivider()
if (apiDataHolder.isOk) { if (!uiNeedsReload) {
ModalNavigationDrawer(
drawerState = drawerState,
drawerContent = {
ModalDrawerSheet {
Column(
modifier = Modifier
.padding(horizontal = 16.dp)
.verticalScroll(rememberScrollState())
) {
Spacer(modifier = Modifier.height(24.dp))
Text( Text(
stringResource(R.string.actions), stringResource(R.string.app_name),
modifier = Modifier.padding(16.dp), modifier = Modifier.padding(16.dp),
style = MaterialTheme.typography.titleMedium style = MaterialTheme.typography.titleLarge
)
NavigationDrawerItem(
label = { Text("Item 1") },
selected = false,
onClick = { /* Handle click */ }
)
NavigationDrawerItem(
label = { Text("Item 2") },
selected = false,
onClick = { /* Handle click */ }
)
} else {
Text(
stringResource(R.string.not_signed_in),
modifier = Modifier.padding(16.dp),
style = MaterialTheme.typography.titleMedium
) )
HorizontalDivider()
if (apiDataHolder.isOk) {
Text(
stringResource(R.string.actions),
modifier = Modifier.padding(16.dp),
style = MaterialTheme.typography.titleMedium
)
NavigationDrawerItem(
label = { Text("Item 1") },
selected = false,
onClick = { /* Handle click */ }
)
NavigationDrawerItem(
label = { Text("Item 2") },
selected = false,
onClick = { /* Handle click */ }
)
} else {
Text(
stringResource(R.string.not_signed_in),
modifier = Modifier.padding(16.dp),
style = MaterialTheme.typography.titleMedium
)
}
} }
} }
}
},
) {
Scaffold(
topBar = {
TopAppBar(
colors = TopAppBarDefaults.topAppBarColors(
titleContentColor = MaterialTheme.colorScheme.primary
),
title = {
Text(stringResource(R.string.app_name))
},
navigationIcon = {
IconButton(onClick = {
scope.launch {
if (drawerState.isClosed) {
drawerState.open()
} else {
drawerState.close()
}
}
}) {
Icon(
imageVector = Icons.Outlined.Menu,
contentDescription = stringResource(R.string.show_menu)
)
}
},
actions = {
IconButton(onClick = {
val intent =
Intent(this@MainActivity, AuthActivity::class.java)
startActivity(intent)
overridePendingTransition(
R.anim.slide_in_right,
R.anim.slide_out_left
)
}) {
Icon(
imageVector = Icons.Outlined.AccountCircle,
contentDescription = stringResource(R.string.auth_icon_desc)
)
}
}
)
}, },
modifier = Modifier.fillMaxSize() ) {
) { innerPadding -> Scaffold(
Column( topBar = {
horizontalAlignment = Alignment.CenterHorizontally, TopAppBar(
verticalArrangement = Arrangement.Center, colors = TopAppBarDefaults.topAppBarColors(
modifier = Modifier titleContentColor = MaterialTheme.colorScheme.primary
.padding(innerPadding) ),
.fillMaxSize() title = {
) { Text(stringResource(R.string.app_name))
Text(stringResource(R.string.app_name)) },
navigationIcon = {
IconButton(onClick = {
scope.launch {
if (drawerState.isClosed) {
drawerState.open()
} else {
drawerState.close()
}
}
}) {
Icon(
imageVector = Icons.Outlined.Menu,
contentDescription = stringResource(R.string.show_menu)
)
}
},
actions = {
IconButton(onClick = {
val intent =
Intent(this@MainActivity, AuthActivity::class.java)
startActivity(intent)
overridePendingTransition(
R.anim.slide_in_right,
R.anim.slide_out_left
)
}) {
Icon(
imageVector = Icons.Outlined.AccountCircle,
contentDescription = stringResource(R.string.auth_icon_desc)
)
}
}
)
},
modifier = Modifier.fillMaxSize()
) { innerPadding ->
Column(
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center,
modifier = Modifier
.padding(innerPadding)
.fillMaxSize()
) {
Text(stringResource(R.string.app_name))
}
} }
} }
} else {
uiNeedsReload = false
} }
} }
} }
@@ -164,5 +178,6 @@ class MainActivity : ComponentActivity() {
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
this.reload?.run {}
} }
} }