From 645e3768cee95eeb6903de1b1c2d2b44a9e07bfe Mon Sep 17 00:00:00 2001 From: Stefano Pigozzi Date: Fri, 1 Dec 2023 02:56:07 +0100 Subject: [PATCH] Refactor and cleanup things --- app/src/main/AndroidManifest.xml | 4 ++ .../eu/steffo/twom/create/CreateActivity.kt | 5 +++ .../twom/login/LoginActivityScaffold.kt | 37 +++++----------- .../steffo/twom/login/LoginActivityTopBar.kt | 32 ++++++++++++++ .../java/eu/steffo/twom/main/MainActivity.kt | 22 +++++++++- ...on.kt => MainActivityAccountIconButton.kt} | 33 +++++++++----- .../steffo/twom/main/MainActivityContent.kt | 24 ++++++++++ .../steffo/twom/main/MainActivityCreateFAB.kt | 41 ++++++++++++++++++ ...nControl.kt => MainActivityNotLoggedIn.kt} | 13 ++---- ...ListControl.kt => MainActivityRoomList.kt} | 6 +-- .../steffo/twom/main/MainActivityScaffold.kt | 36 +++++---------- .../eu/steffo/twom/main/MainActivityTopBar.kt | 33 ++++++++++++++ .../java/eu/steffo/twom/main/RoomListItem.kt | 4 +- .../eu/steffo/twom/matrix/DefaultAvatar.kt | 17 -------- .../java/eu/steffo/twom/matrix/TwoMMatrix.kt | 27 ------------ .../twom/matrix/avatar/AvatarFromDefault.kt | 36 +++++++++++++++ .../{Avatar.kt => avatar/AvatarFromURL.kt} | 9 ++-- .../AvatarFromUserId.kt} | 11 +++-- .../java/eu/steffo/twom/room/RoomActivity.kt | 1 - .../java/eu/steffo/twom/theme/TwoMTheme.kt | 23 +++++----- app/src/main/res/drawable/avatar_default.png | Bin 44093 -> 0 bytes app/src/main/res/values/strings.xml | 13 +++--- app/src/main/res/values/themes.xml | 5 ++- 23 files changed, 281 insertions(+), 151 deletions(-) create mode 100644 app/src/main/java/eu/steffo/twom/create/CreateActivity.kt create mode 100644 app/src/main/java/eu/steffo/twom/login/LoginActivityTopBar.kt rename app/src/main/java/eu/steffo/twom/main/{ProfileIconButton.kt => MainActivityAccountIconButton.kt} (67%) create mode 100644 app/src/main/java/eu/steffo/twom/main/MainActivityContent.kt create mode 100644 app/src/main/java/eu/steffo/twom/main/MainActivityCreateFAB.kt rename app/src/main/java/eu/steffo/twom/main/{MainActivityNotLoggedInControl.kt => MainActivityNotLoggedIn.kt} (59%) rename app/src/main/java/eu/steffo/twom/main/{MainActivityRoomListControl.kt => MainActivityRoomList.kt} (92%) create mode 100644 app/src/main/java/eu/steffo/twom/main/MainActivityTopBar.kt delete mode 100644 app/src/main/java/eu/steffo/twom/matrix/DefaultAvatar.kt create mode 100644 app/src/main/java/eu/steffo/twom/matrix/avatar/AvatarFromDefault.kt rename app/src/main/java/eu/steffo/twom/matrix/{Avatar.kt => avatar/AvatarFromURL.kt} (92%) rename app/src/main/java/eu/steffo/twom/matrix/{UserAvatar.kt => avatar/AvatarFromUserId.kt} (85%) delete mode 100644 app/src/main/res/drawable/avatar_default.png diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d61fd79..847bd61 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -49,6 +49,10 @@ android:name=".room.RoomActivity" android:theme="@style/Theme.TwoM" /> + + \ No newline at end of file diff --git a/app/src/main/java/eu/steffo/twom/create/CreateActivity.kt b/app/src/main/java/eu/steffo/twom/create/CreateActivity.kt new file mode 100644 index 0000000..7cafddc --- /dev/null +++ b/app/src/main/java/eu/steffo/twom/create/CreateActivity.kt @@ -0,0 +1,5 @@ +package eu.steffo.twom.create + +import androidx.activity.ComponentActivity + +class CreateActivity : ComponentActivity() \ No newline at end of file diff --git a/app/src/main/java/eu/steffo/twom/login/LoginActivityScaffold.kt b/app/src/main/java/eu/steffo/twom/login/LoginActivityScaffold.kt index d2c74e3..140da35 100644 --- a/app/src/main/java/eu/steffo/twom/login/LoginActivityScaffold.kt +++ b/app/src/main/java/eu/steffo/twom/login/LoginActivityScaffold.kt @@ -1,24 +1,14 @@ package eu.steffo.twom.login import androidx.compose.foundation.layout.padding -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.ArrowBack -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton import androidx.compose.material3.Scaffold -import androidx.compose.material3.Text -import androidx.compose.material3.TopAppBar import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.tooling.preview.Preview -import eu.steffo.twom.R import eu.steffo.twom.theme.TwoMTheme import org.matrix.android.sdk.api.session.Session -@OptIn(ExperimentalMaterial3Api::class) @Composable @Preview fun LoginActivityScaffold( @@ -28,23 +18,16 @@ fun LoginActivityScaffold( TwoMTheme { Scaffold( topBar = { - TopAppBar ( - navigationIcon = { - IconButton(onClick = onBack) { - Icon( - imageVector = Icons.Filled.ArrowBack, - contentDescription = LocalContext.current.getString(R.string.back) - ) - } - }, - title = { Text(LocalContext.current.getString(R.string.login_title)) } + LoginActivityTopBar( + onBack = onBack, ) - } - ) { - LoginActivityControl( - modifier = Modifier.padding(it), - onLogin = onLogin - ) - } + }, + content = { + LoginActivityControl( + modifier = Modifier.padding(it), + onLogin = onLogin + ) + }, + ) } } \ No newline at end of file diff --git a/app/src/main/java/eu/steffo/twom/login/LoginActivityTopBar.kt b/app/src/main/java/eu/steffo/twom/login/LoginActivityTopBar.kt new file mode 100644 index 0000000..4921f0f --- /dev/null +++ b/app/src/main/java/eu/steffo/twom/login/LoginActivityTopBar.kt @@ -0,0 +1,32 @@ +package eu.steffo.twom.login + +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.ArrowBack +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.runtime.Composable +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.tooling.preview.Preview +import eu.steffo.twom.R + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +@Preview +fun LoginActivityTopBar( + onBack: () -> Unit = {}, +) { + TopAppBar( + navigationIcon = { + IconButton(onClick = onBack) { + Icon( + imageVector = Icons.Filled.ArrowBack, + contentDescription = LocalContext.current.getString(R.string.back) + ) + } + }, + title = { Text(LocalContext.current.getString(R.string.login_title)) } + ) +} \ No newline at end of file diff --git a/app/src/main/java/eu/steffo/twom/main/MainActivity.kt b/app/src/main/java/eu/steffo/twom/main/MainActivity.kt index ec50553..adb0b68 100644 --- a/app/src/main/java/eu/steffo/twom/main/MainActivity.kt +++ b/app/src/main/java/eu/steffo/twom/main/MainActivity.kt @@ -9,6 +9,7 @@ import androidx.activity.result.ActivityResult import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts import androidx.lifecycle.lifecycleScope +import eu.steffo.twom.create.CreateActivity import eu.steffo.twom.login.LoginActivity import eu.steffo.twom.matrix.TwoMMatrix import eu.steffo.twom.room.RoomActivity @@ -19,6 +20,7 @@ import org.matrix.android.sdk.api.session.Session class MainActivity : ComponentActivity() { private lateinit var loginLauncher: ActivityResultLauncher private lateinit var roomLauncher: ActivityResultLauncher + private lateinit var createLauncher: ActivityResultLauncher private var session: Session? = null @@ -26,7 +28,6 @@ class MainActivity : ComponentActivity() { super.onCreate(savedInstanceState) TwoMMatrix.ensureMatrix(applicationContext) - TwoMMatrix.ensureDefaultAvatar(applicationContext) fetchLastSession() openSession() @@ -43,6 +44,12 @@ class MainActivity : ComponentActivity() { this::onRoom ) + createLauncher = + registerForActivityResult( + ActivityResultContracts.StartActivityForResult(), + this::onCreate + ) + resetContent() } @@ -115,13 +122,23 @@ class MainActivity : ComponentActivity() { Log.d("Main", "Clicked a room, launching room activity...") val intent = Intent(applicationContext, RoomActivity::class.java) intent.putExtra(RoomActivity.ROOM_ID_EXTRA, roomId) - loginLauncher.launch(intent) + roomLauncher.launch(intent) } private fun onRoom(result: ActivityResult) { Log.d("Main", "Received result from room activity: $result") } + private fun onClickCreate() { + Log.d("Main", "Clicked the New button, launching create activity...") + val intent = Intent(applicationContext, CreateActivity::class.java) + loginLauncher.launch(intent) + } + + private fun onCreate(result: ActivityResult) { + Log.d("Main", "Received result from create activity: $result") + } + private fun resetContent() { Log.d("Main", "Recomposing...") setContent { @@ -129,6 +146,7 @@ class MainActivity : ComponentActivity() { onClickLogin = this::onClickLogin, onClickLogout = this::onClickLogout, onClickRoom = this::onClickRoom, + onClickCreate = this::onClickCreate, session = session, ) } diff --git a/app/src/main/java/eu/steffo/twom/main/ProfileIconButton.kt b/app/src/main/java/eu/steffo/twom/main/MainActivityAccountIconButton.kt similarity index 67% rename from app/src/main/java/eu/steffo/twom/main/ProfileIconButton.kt rename to app/src/main/java/eu/steffo/twom/main/MainActivityAccountIconButton.kt index 3b1446d..4cfdef9 100644 --- a/app/src/main/java/eu/steffo/twom/main/ProfileIconButton.kt +++ b/app/src/main/java/eu/steffo/twom/main/MainActivityAccountIconButton.kt @@ -19,31 +19,31 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import eu.steffo.twom.R import eu.steffo.twom.matrix.LocalSession -import eu.steffo.twom.matrix.UserAvatar +import eu.steffo.twom.matrix.avatar.AvatarFromUserId @Composable @Preview(showBackground = true) -fun ProfileIconButton( +fun MainActivityAccountIconButton( modifier: Modifier = Modifier, + onClickLogin: () -> Unit = {}, onClickLogout: () -> Unit = {}, ) { val session = LocalSession.current var expanded by remember { mutableStateOf(false) } - Box { + Box(modifier) { IconButton( - enabled = (session != null), onClick = { expanded = true }, ) { if (session == null) { Icon( imageVector = Icons.Filled.AccountCircle, - contentDescription = LocalContext.current.getString(R.string.account_label), + contentDescription = LocalContext.current.getString(R.string.main_account_label), ) } else { - UserAvatar( + AvatarFromUserId( userId = session.myUserId, - contentDescription = LocalContext.current.getString(R.string.account_label), + contentDescription = LocalContext.current.getString(R.string.main_account_label), ) } } @@ -51,12 +51,25 @@ fun ProfileIconButton( expanded = expanded, onDismissRequest = { expanded = false }, ) { - if (session != null) { + if (session == null) { DropdownMenuItem( text = { - Text(stringResource(id = R.string.profile_logout_text)) + Text(stringResource(id = R.string.main_account_login_text)) }, - onClick = onClickLogout + onClick = { + expanded = false + onClickLogin() + } + ) + } else { + DropdownMenuItem( + text = { + Text(stringResource(id = R.string.main_account_logout_text)) + }, + onClick = { + expanded = false + onClickLogout() + } ) } } diff --git a/app/src/main/java/eu/steffo/twom/main/MainActivityContent.kt b/app/src/main/java/eu/steffo/twom/main/MainActivityContent.kt new file mode 100644 index 0000000..3e1260e --- /dev/null +++ b/app/src/main/java/eu/steffo/twom/main/MainActivityContent.kt @@ -0,0 +1,24 @@ +package eu.steffo.twom.main + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import eu.steffo.twom.matrix.LocalSession + +@Composable +fun MainActivityContent( + modifier: Modifier = Modifier, + onClickRoom: (roomId: String) -> Unit = {}, +) { + val session = LocalSession.current + + if (session == null) { + MainActivityNotLoggedIn( + modifier = modifier, + ) + } else { + MainActivityRoomList( + modifier = modifier, + onClickRoom = onClickRoom, + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/eu/steffo/twom/main/MainActivityCreateFAB.kt b/app/src/main/java/eu/steffo/twom/main/MainActivityCreateFAB.kt new file mode 100644 index 0000000..fc45876 --- /dev/null +++ b/app/src/main/java/eu/steffo/twom/main/MainActivityCreateFAB.kt @@ -0,0 +1,41 @@ +package eu.steffo.twom.main + +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Add +import androidx.compose.material3.ExtendedFloatingActionButton +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalView +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import eu.steffo.twom.R +import eu.steffo.twom.matrix.LocalSession + +@Composable +@Preview +fun MainActivityCreateFAB( + modifier: Modifier = Modifier, + onClickCreate: () -> Unit = {}, +) { + val session = LocalSession.current + + val shouldDisplay = (session != null || LocalView.current.isInEditMode) + + if (shouldDisplay) { + ExtendedFloatingActionButton( + modifier = modifier, + onClick = onClickCreate, + icon = { + Icon( + Icons.Filled.Add, + contentDescription = null + ) + }, + text = { + Text(stringResource(R.string.main_efab_create_text)) + } + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/eu/steffo/twom/main/MainActivityNotLoggedInControl.kt b/app/src/main/java/eu/steffo/twom/main/MainActivityNotLoggedIn.kt similarity index 59% rename from app/src/main/java/eu/steffo/twom/main/MainActivityNotLoggedInControl.kt rename to app/src/main/java/eu/steffo/twom/main/MainActivityNotLoggedIn.kt index ae3d520..25dc2b4 100644 --- a/app/src/main/java/eu/steffo/twom/main/MainActivityNotLoggedInControl.kt +++ b/app/src/main/java/eu/steffo/twom/main/MainActivityNotLoggedIn.kt @@ -2,8 +2,6 @@ package eu.steffo.twom.main import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.material3.Button import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier @@ -14,21 +12,16 @@ import eu.steffo.twom.theme.TwoMPadding @Composable @Preview(showBackground = true) -fun MatrixActivityNotLoggedInControl( +fun MainActivityNotLoggedIn( modifier: Modifier = Modifier, onClickLogin: () -> Unit = {}, ) { Column(modifier) { Row(TwoMPadding.base) { - Text(LocalContext.current.getString(R.string.notloggedin_text)) + Text(LocalContext.current.getString(R.string.main_notloggedin_text_1)) } Row(TwoMPadding.base) { - Button( - modifier = Modifier.fillMaxWidth(), - onClick = onClickLogin, - ) { - Text(LocalContext.current.getString(R.string.notloggedin_login_text)) - } + Text(LocalContext.current.getString(R.string.main_notloggedin_text_2)) } } } \ No newline at end of file diff --git a/app/src/main/java/eu/steffo/twom/main/MainActivityRoomListControl.kt b/app/src/main/java/eu/steffo/twom/main/MainActivityRoomList.kt similarity index 92% rename from app/src/main/java/eu/steffo/twom/main/MainActivityRoomListControl.kt rename to app/src/main/java/eu/steffo/twom/main/MainActivityRoomList.kt index 41b956e..81b897c 100644 --- a/app/src/main/java/eu/steffo/twom/main/MainActivityRoomListControl.kt +++ b/app/src/main/java/eu/steffo/twom/main/MainActivityRoomList.kt @@ -11,7 +11,6 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource -import androidx.compose.ui.tooling.preview.Preview import eu.steffo.twom.R import eu.steffo.twom.matrix.LocalSession import eu.steffo.twom.theme.TwoMPadding @@ -19,8 +18,7 @@ import org.matrix.android.sdk.api.session.room.model.RoomSummary import org.matrix.android.sdk.api.session.room.roomSummaryQueryParams @Composable -@Preview -fun MainActivityRoomListControl( +fun MainActivityRoomList( modifier: Modifier = Modifier, onClickRoom: (roomId: String) -> Unit = {}, ) { @@ -47,7 +45,7 @@ fun MainActivityRoomListControl( } else if (roomSummaries!!.isEmpty()) { Text( modifier = TwoMPadding.base, - text = stringResource(R.string.room_list_empty_text) + text = stringResource(R.string.main_roomlist_empty_text) ) } else { roomSummaries!!.forEach { diff --git a/app/src/main/java/eu/steffo/twom/main/MainActivityScaffold.kt b/app/src/main/java/eu/steffo/twom/main/MainActivityScaffold.kt index 5e81df9..ba4f14b 100644 --- a/app/src/main/java/eu/steffo/twom/main/MainActivityScaffold.kt +++ b/app/src/main/java/eu/steffo/twom/main/MainActivityScaffold.kt @@ -1,57 +1,45 @@ package eu.steffo.twom.main import androidx.compose.foundation.layout.padding -import androidx.compose.material3.CenterAlignedTopAppBar -import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Scaffold -import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.tooling.preview.Preview -import eu.steffo.twom.R import eu.steffo.twom.matrix.LocalSession import eu.steffo.twom.theme.TwoMTheme import org.matrix.android.sdk.api.session.Session -@OptIn(ExperimentalMaterial3Api::class) @Composable @Preview fun MatrixActivityScaffold( onClickLogin: () -> Unit = {}, onClickLogout: () -> Unit = {}, onClickRoom: (roomId: String) -> Unit = {}, + onClickCreate: () -> Unit = {}, session: Session? = null, ) { TwoMTheme { CompositionLocalProvider(LocalSession provides session) { Scaffold( topBar = { - CenterAlignedTopAppBar( - title = { - Text(LocalContext.current.getString(R.string.app_name)) - }, - actions = { - ProfileIconButton( - onClickLogout = onClickLogout - ) - }, - ) - } - ) { - if (session == null) { - MatrixActivityNotLoggedInControl( - modifier = Modifier.padding(it), + MainActivityTopBar( onClickLogin = onClickLogin, + onClickLogout = onClickLogout, ) - } else { - MainActivityRoomListControl( + }, + floatingActionButton = { + MainActivityCreateFAB( + onClickCreate = onClickCreate, + ) + }, + content = { + MainActivityContent( modifier = Modifier.padding(it), onClickRoom = onClickRoom, ) } - } + ) } } } \ No newline at end of file diff --git a/app/src/main/java/eu/steffo/twom/main/MainActivityTopBar.kt b/app/src/main/java/eu/steffo/twom/main/MainActivityTopBar.kt new file mode 100644 index 0000000..4053102 --- /dev/null +++ b/app/src/main/java/eu/steffo/twom/main/MainActivityTopBar.kt @@ -0,0 +1,33 @@ +package eu.steffo.twom.main + +import androidx.compose.material3.CenterAlignedTopAppBar +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.tooling.preview.Preview +import eu.steffo.twom.R + + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +@Preview +fun MainActivityTopBar( + modifier: Modifier = Modifier, + onClickLogin: () -> Unit = {}, + onClickLogout: () -> Unit = {}, +) { + CenterAlignedTopAppBar( + modifier = modifier, + title = { + Text(LocalContext.current.getString(R.string.app_name)) + }, + actions = { + MainActivityAccountIconButton( + onClickLogin = onClickLogin, + onClickLogout = onClickLogout, + ) + }, + ) +} \ No newline at end of file diff --git a/app/src/main/java/eu/steffo/twom/main/RoomListItem.kt b/app/src/main/java/eu/steffo/twom/main/RoomListItem.kt index 4cdf2c0..e27df66 100644 --- a/app/src/main/java/eu/steffo/twom/main/RoomListItem.kt +++ b/app/src/main/java/eu/steffo/twom/main/RoomListItem.kt @@ -10,7 +10,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.unit.dp -import eu.steffo.twom.matrix.Avatar +import eu.steffo.twom.matrix.avatar.AvatarFromURL import org.matrix.android.sdk.api.session.room.model.RoomSummary @@ -32,7 +32,7 @@ fun RoomListItem( .size(40.dp) .clip(MaterialTheme.shapes.medium) ) { - Avatar( + AvatarFromURL( url = roomSummary.avatarUrl, ) } diff --git a/app/src/main/java/eu/steffo/twom/matrix/DefaultAvatar.kt b/app/src/main/java/eu/steffo/twom/matrix/DefaultAvatar.kt deleted file mode 100644 index 945f90c..0000000 --- a/app/src/main/java/eu/steffo/twom/matrix/DefaultAvatar.kt +++ /dev/null @@ -1,17 +0,0 @@ -package eu.steffo.twom.matrix - -import androidx.compose.foundation.Image -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier - -@Composable -fun DefaultAvatar( - modifier: Modifier = Modifier, - contentDescription: String = "", -) { - Image( - modifier = Modifier, - bitmap = TwoMMatrix.defaultAvatar, - contentDescription = contentDescription, - ) -} \ No newline at end of file diff --git a/app/src/main/java/eu/steffo/twom/matrix/TwoMMatrix.kt b/app/src/main/java/eu/steffo/twom/matrix/TwoMMatrix.kt index 9e5e803..e30066f 100644 --- a/app/src/main/java/eu/steffo/twom/matrix/TwoMMatrix.kt +++ b/app/src/main/java/eu/steffo/twom/matrix/TwoMMatrix.kt @@ -1,11 +1,7 @@ package eu.steffo.twom.matrix import android.content.Context -import android.graphics.BitmapFactory import android.util.Log -import androidx.compose.ui.graphics.ImageBitmap -import androidx.compose.ui.graphics.asImageBitmap -import eu.steffo.twom.R import org.matrix.android.sdk.api.Matrix import org.matrix.android.sdk.api.MatrixConfiguration @@ -40,27 +36,4 @@ object TwoMMatrix { } return null } - - /** - * The avatar to default to when another one is not available. - * - * [Avatar] will expect this to be available. - */ - lateinit var defaultAvatar: ImageBitmap - - /** - * Make sure the [matrix] object is available, decoding it if it isn't initialized. - * - * Uses the passed [Context] to access the application resources. - */ - fun ensureDefaultAvatar(context: Context): ImageBitmap? { - if (!this::defaultAvatar.isInitialized) { - Log.d("Matrix", "Initializing default avatar...") - defaultAvatar = - BitmapFactory.decodeResource(context.resources, R.drawable.avatar_default) - .asImageBitmap() - return defaultAvatar - } - return null - } } diff --git a/app/src/main/java/eu/steffo/twom/matrix/avatar/AvatarFromDefault.kt b/app/src/main/java/eu/steffo/twom/matrix/avatar/AvatarFromDefault.kt new file mode 100644 index 0000000..d853e10 --- /dev/null +++ b/app/src/main/java/eu/steffo/twom/matrix/avatar/AvatarFromDefault.kt @@ -0,0 +1,36 @@ +package eu.steffo.twom.matrix.avatar + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.semantics.contentDescription +import androidx.compose.ui.semantics.semantics +import androidx.compose.ui.tooling.preview.Preview + +@Composable +@Preview(widthDp = 40, heightDp = 40) +fun AvatarFromDefault( + modifier: Modifier = Modifier, + contentDescription: String = "", +) { + Box( + modifier = modifier + .fillMaxSize() + .background(MaterialTheme.colorScheme.tertiary), + ) { + Text( + modifier = Modifier + .align(Alignment.Center) + .semantics { + this.contentDescription = "" + }, + color = MaterialTheme.colorScheme.onTertiary, + text = "?", + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/eu/steffo/twom/matrix/Avatar.kt b/app/src/main/java/eu/steffo/twom/matrix/avatar/AvatarFromURL.kt similarity index 92% rename from app/src/main/java/eu/steffo/twom/matrix/Avatar.kt rename to app/src/main/java/eu/steffo/twom/matrix/avatar/AvatarFromURL.kt index 25bb70f..6706f76 100644 --- a/app/src/main/java/eu/steffo/twom/matrix/Avatar.kt +++ b/app/src/main/java/eu/steffo/twom/matrix/avatar/AvatarFromURL.kt @@ -1,4 +1,4 @@ -package eu.steffo.twom.matrix +package eu.steffo.twom.matrix.avatar import android.graphics.BitmapFactory import android.util.Log @@ -13,10 +13,11 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.ImageBitmap import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.tooling.preview.Preview +import eu.steffo.twom.matrix.LocalSession @Composable -@Preview -fun Avatar( +@Preview(widthDp = 40, heightDp = 40) +fun AvatarFromURL( modifier: Modifier = Modifier, url: String? = "", contentDescription: String = "", @@ -52,7 +53,7 @@ fun Avatar( } if (session == null || url == null || avatar == null) { - DefaultAvatar( + AvatarFromDefault( modifier = modifier, contentDescription = contentDescription ) diff --git a/app/src/main/java/eu/steffo/twom/matrix/UserAvatar.kt b/app/src/main/java/eu/steffo/twom/matrix/avatar/AvatarFromUserId.kt similarity index 85% rename from app/src/main/java/eu/steffo/twom/matrix/UserAvatar.kt rename to app/src/main/java/eu/steffo/twom/matrix/avatar/AvatarFromUserId.kt index b81312a..820b230 100644 --- a/app/src/main/java/eu/steffo/twom/matrix/UserAvatar.kt +++ b/app/src/main/java/eu/steffo/twom/matrix/avatar/AvatarFromUserId.kt @@ -1,4 +1,4 @@ -package eu.steffo.twom.matrix +package eu.steffo.twom.matrix.avatar import android.util.Log import androidx.compose.runtime.Composable @@ -8,9 +8,12 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import eu.steffo.twom.matrix.LocalSession @Composable -fun UserAvatar( +@Preview(widthDp = 40, heightDp = 40) +fun AvatarFromUserId( modifier: Modifier = Modifier, userId: String = "", contentDescription: String = "", @@ -33,12 +36,12 @@ fun UserAvatar( } if (avatarUrl == null) { - DefaultAvatar( + AvatarFromDefault( modifier = modifier, contentDescription = contentDescription, ) } else { - Avatar( + AvatarFromURL( modifier = modifier, url = avatarUrl!!, contentDescription = contentDescription, diff --git a/app/src/main/java/eu/steffo/twom/room/RoomActivity.kt b/app/src/main/java/eu/steffo/twom/room/RoomActivity.kt index 3b78e72..62d42ac 100644 --- a/app/src/main/java/eu/steffo/twom/room/RoomActivity.kt +++ b/app/src/main/java/eu/steffo/twom/room/RoomActivity.kt @@ -6,5 +6,4 @@ class RoomActivity : ComponentActivity() { companion object { const val ROOM_ID_EXTRA = "roomId" } - } \ No newline at end of file diff --git a/app/src/main/java/eu/steffo/twom/theme/TwoMTheme.kt b/app/src/main/java/eu/steffo/twom/theme/TwoMTheme.kt index cba4fb6..710ee53 100644 --- a/app/src/main/java/eu/steffo/twom/theme/TwoMTheme.kt +++ b/app/src/main/java/eu/steffo/twom/theme/TwoMTheme.kt @@ -19,12 +19,19 @@ fun TwoMTheme( content: @Composable () -> Unit ) { val context = LocalContext.current + val darkTheme = isSystemInDarkTheme() - val colorScheme = if (darkTheme) { - dynamicDarkColorScheme(context) - } else { - dynamicLightColorScheme(context) + val colorScheme = when (darkTheme) { + true -> dynamicDarkColorScheme(context) + false -> dynamicLightColorScheme(context) } + val typography = Typography() + + MaterialTheme( + colorScheme = colorScheme, + typography = typography, + content = content + ) val view = LocalView.current if (!view.isInEditMode) { @@ -34,12 +41,4 @@ fun TwoMTheme( WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = !darkTheme } } - - val typography = Typography() - - MaterialTheme( - colorScheme = colorScheme, - typography = typography, - content = content - ) } diff --git a/app/src/main/res/drawable/avatar_default.png b/app/src/main/res/drawable/avatar_default.png deleted file mode 100644 index 65f4d6215f033aecc46d794f9448b9f30fc579f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44093 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 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5b07ab8..7060fc3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -19,11 +19,12 @@ Password Show password Hide password - To use TwoM, you need to be logged into Matrix. - Login - You are logged in. - My account - Logout - There are no rooms. + To use TwoM, you need to select the Matrix account to use. + My account + Logout + There are no rooms. Loading... + New + Log into your Matrix account by clicking the icon on the top right of the screen. + Login \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 070e498..580acb6 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -1,5 +1,8 @@ - +