mirror of
https://github.com/Steffo99/twom.git
synced 2024-11-21 23:54:26 +00:00
Refactor and cleanup things
This commit is contained in:
parent
d66bbeb277
commit
645e3768ce
23 changed files with 281 additions and 151 deletions
|
@ -49,6 +49,10 @@
|
||||||
android:name=".room.RoomActivity"
|
android:name=".room.RoomActivity"
|
||||||
android:theme="@style/Theme.TwoM" />
|
android:theme="@style/Theme.TwoM" />
|
||||||
|
|
||||||
|
<activity
|
||||||
|
android:name=".create.CreateActivity"
|
||||||
|
android:theme="@style/Theme.TwoM" />
|
||||||
|
|
||||||
</application>
|
</application>
|
||||||
|
|
||||||
</manifest>
|
</manifest>
|
|
@ -0,0 +1,5 @@
|
||||||
|
package eu.steffo.twom.create
|
||||||
|
|
||||||
|
import androidx.activity.ComponentActivity
|
||||||
|
|
||||||
|
class CreateActivity : ComponentActivity()
|
|
@ -1,24 +1,14 @@
|
||||||
package eu.steffo.twom.login
|
package eu.steffo.twom.login
|
||||||
|
|
||||||
import androidx.compose.foundation.layout.padding
|
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.Scaffold
|
||||||
import androidx.compose.material3.Text
|
|
||||||
import androidx.compose.material3.TopAppBar
|
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.platform.LocalContext
|
|
||||||
import androidx.compose.ui.tooling.preview.Preview
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
import eu.steffo.twom.R
|
|
||||||
import eu.steffo.twom.theme.TwoMTheme
|
import eu.steffo.twom.theme.TwoMTheme
|
||||||
import org.matrix.android.sdk.api.session.Session
|
import org.matrix.android.sdk.api.session.Session
|
||||||
|
|
||||||
|
|
||||||
@OptIn(ExperimentalMaterial3Api::class)
|
|
||||||
@Composable
|
@Composable
|
||||||
@Preview
|
@Preview
|
||||||
fun LoginActivityScaffold(
|
fun LoginActivityScaffold(
|
||||||
|
@ -28,23 +18,16 @@ fun LoginActivityScaffold(
|
||||||
TwoMTheme {
|
TwoMTheme {
|
||||||
Scaffold(
|
Scaffold(
|
||||||
topBar = {
|
topBar = {
|
||||||
TopAppBar (
|
LoginActivityTopBar(
|
||||||
navigationIcon = {
|
onBack = onBack,
|
||||||
IconButton(onClick = onBack) {
|
|
||||||
Icon(
|
|
||||||
imageVector = Icons.Filled.ArrowBack,
|
|
||||||
contentDescription = LocalContext.current.getString(R.string.back)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
title = { Text(LocalContext.current.getString(R.string.login_title)) }
|
|
||||||
)
|
)
|
||||||
}
|
},
|
||||||
) {
|
content = {
|
||||||
LoginActivityControl(
|
LoginActivityControl(
|
||||||
modifier = Modifier.padding(it),
|
modifier = Modifier.padding(it),
|
||||||
onLogin = onLogin
|
onLogin = onLogin
|
||||||
)
|
)
|
||||||
}
|
},
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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)) }
|
||||||
|
)
|
||||||
|
}
|
|
@ -9,6 +9,7 @@ import androidx.activity.result.ActivityResult
|
||||||
import androidx.activity.result.ActivityResultLauncher
|
import androidx.activity.result.ActivityResultLauncher
|
||||||
import androidx.activity.result.contract.ActivityResultContracts
|
import androidx.activity.result.contract.ActivityResultContracts
|
||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
|
import eu.steffo.twom.create.CreateActivity
|
||||||
import eu.steffo.twom.login.LoginActivity
|
import eu.steffo.twom.login.LoginActivity
|
||||||
import eu.steffo.twom.matrix.TwoMMatrix
|
import eu.steffo.twom.matrix.TwoMMatrix
|
||||||
import eu.steffo.twom.room.RoomActivity
|
import eu.steffo.twom.room.RoomActivity
|
||||||
|
@ -19,6 +20,7 @@ import org.matrix.android.sdk.api.session.Session
|
||||||
class MainActivity : ComponentActivity() {
|
class MainActivity : ComponentActivity() {
|
||||||
private lateinit var loginLauncher: ActivityResultLauncher<Intent>
|
private lateinit var loginLauncher: ActivityResultLauncher<Intent>
|
||||||
private lateinit var roomLauncher: ActivityResultLauncher<Intent>
|
private lateinit var roomLauncher: ActivityResultLauncher<Intent>
|
||||||
|
private lateinit var createLauncher: ActivityResultLauncher<Intent>
|
||||||
|
|
||||||
private var session: Session? = null
|
private var session: Session? = null
|
||||||
|
|
||||||
|
@ -26,7 +28,6 @@ class MainActivity : ComponentActivity() {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
|
||||||
TwoMMatrix.ensureMatrix(applicationContext)
|
TwoMMatrix.ensureMatrix(applicationContext)
|
||||||
TwoMMatrix.ensureDefaultAvatar(applicationContext)
|
|
||||||
|
|
||||||
fetchLastSession()
|
fetchLastSession()
|
||||||
openSession()
|
openSession()
|
||||||
|
@ -43,6 +44,12 @@ class MainActivity : ComponentActivity() {
|
||||||
this::onRoom
|
this::onRoom
|
||||||
)
|
)
|
||||||
|
|
||||||
|
createLauncher =
|
||||||
|
registerForActivityResult(
|
||||||
|
ActivityResultContracts.StartActivityForResult(),
|
||||||
|
this::onCreate
|
||||||
|
)
|
||||||
|
|
||||||
resetContent()
|
resetContent()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -115,13 +122,23 @@ class MainActivity : ComponentActivity() {
|
||||||
Log.d("Main", "Clicked a room, launching room activity...")
|
Log.d("Main", "Clicked a room, launching room activity...")
|
||||||
val intent = Intent(applicationContext, RoomActivity::class.java)
|
val intent = Intent(applicationContext, RoomActivity::class.java)
|
||||||
intent.putExtra(RoomActivity.ROOM_ID_EXTRA, roomId)
|
intent.putExtra(RoomActivity.ROOM_ID_EXTRA, roomId)
|
||||||
loginLauncher.launch(intent)
|
roomLauncher.launch(intent)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun onRoom(result: ActivityResult) {
|
private fun onRoom(result: ActivityResult) {
|
||||||
Log.d("Main", "Received result from room activity: $result")
|
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() {
|
private fun resetContent() {
|
||||||
Log.d("Main", "Recomposing...")
|
Log.d("Main", "Recomposing...")
|
||||||
setContent {
|
setContent {
|
||||||
|
@ -129,6 +146,7 @@ class MainActivity : ComponentActivity() {
|
||||||
onClickLogin = this::onClickLogin,
|
onClickLogin = this::onClickLogin,
|
||||||
onClickLogout = this::onClickLogout,
|
onClickLogout = this::onClickLogout,
|
||||||
onClickRoom = this::onClickRoom,
|
onClickRoom = this::onClickRoom,
|
||||||
|
onClickCreate = this::onClickCreate,
|
||||||
session = session,
|
session = session,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,31 +19,31 @@ import androidx.compose.ui.res.stringResource
|
||||||
import androidx.compose.ui.tooling.preview.Preview
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
import eu.steffo.twom.R
|
import eu.steffo.twom.R
|
||||||
import eu.steffo.twom.matrix.LocalSession
|
import eu.steffo.twom.matrix.LocalSession
|
||||||
import eu.steffo.twom.matrix.UserAvatar
|
import eu.steffo.twom.matrix.avatar.AvatarFromUserId
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
@Preview(showBackground = true)
|
@Preview(showBackground = true)
|
||||||
fun ProfileIconButton(
|
fun MainActivityAccountIconButton(
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
|
onClickLogin: () -> Unit = {},
|
||||||
onClickLogout: () -> Unit = {},
|
onClickLogout: () -> Unit = {},
|
||||||
) {
|
) {
|
||||||
val session = LocalSession.current
|
val session = LocalSession.current
|
||||||
var expanded by remember { mutableStateOf(false) }
|
var expanded by remember { mutableStateOf(false) }
|
||||||
|
|
||||||
Box {
|
Box(modifier) {
|
||||||
IconButton(
|
IconButton(
|
||||||
enabled = (session != null),
|
|
||||||
onClick = { expanded = true },
|
onClick = { expanded = true },
|
||||||
) {
|
) {
|
||||||
if (session == null) {
|
if (session == null) {
|
||||||
Icon(
|
Icon(
|
||||||
imageVector = Icons.Filled.AccountCircle,
|
imageVector = Icons.Filled.AccountCircle,
|
||||||
contentDescription = LocalContext.current.getString(R.string.account_label),
|
contentDescription = LocalContext.current.getString(R.string.main_account_label),
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
UserAvatar(
|
AvatarFromUserId(
|
||||||
userId = session.myUserId,
|
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,
|
expanded = expanded,
|
||||||
onDismissRequest = { expanded = false },
|
onDismissRequest = { expanded = false },
|
||||||
) {
|
) {
|
||||||
if (session != null) {
|
if (session == null) {
|
||||||
DropdownMenuItem(
|
DropdownMenuItem(
|
||||||
text = {
|
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()
|
||||||
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
24
app/src/main/java/eu/steffo/twom/main/MainActivityContent.kt
Normal file
24
app/src/main/java/eu/steffo/twom/main/MainActivityContent.kt
Normal file
|
@ -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,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
|
@ -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))
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,8 +2,6 @@ package eu.steffo.twom.main
|
||||||
|
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
import androidx.compose.foundation.layout.Row
|
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.material3.Text
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
|
@ -14,21 +12,16 @@ import eu.steffo.twom.theme.TwoMPadding
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
@Preview(showBackground = true)
|
@Preview(showBackground = true)
|
||||||
fun MatrixActivityNotLoggedInControl(
|
fun MainActivityNotLoggedIn(
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onClickLogin: () -> Unit = {},
|
onClickLogin: () -> Unit = {},
|
||||||
) {
|
) {
|
||||||
Column(modifier) {
|
Column(modifier) {
|
||||||
Row(TwoMPadding.base) {
|
Row(TwoMPadding.base) {
|
||||||
Text(LocalContext.current.getString(R.string.notloggedin_text))
|
Text(LocalContext.current.getString(R.string.main_notloggedin_text_1))
|
||||||
}
|
}
|
||||||
Row(TwoMPadding.base) {
|
Row(TwoMPadding.base) {
|
||||||
Button(
|
Text(LocalContext.current.getString(R.string.main_notloggedin_text_2))
|
||||||
modifier = Modifier.fillMaxWidth(),
|
|
||||||
onClick = onClickLogin,
|
|
||||||
) {
|
|
||||||
Text(LocalContext.current.getString(R.string.notloggedin_login_text))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -11,7 +11,6 @@ import androidx.compose.runtime.remember
|
||||||
import androidx.compose.runtime.setValue
|
import androidx.compose.runtime.setValue
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.compose.ui.tooling.preview.Preview
|
|
||||||
import eu.steffo.twom.R
|
import eu.steffo.twom.R
|
||||||
import eu.steffo.twom.matrix.LocalSession
|
import eu.steffo.twom.matrix.LocalSession
|
||||||
import eu.steffo.twom.theme.TwoMPadding
|
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
|
import org.matrix.android.sdk.api.session.room.roomSummaryQueryParams
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
@Preview
|
fun MainActivityRoomList(
|
||||||
fun MainActivityRoomListControl(
|
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onClickRoom: (roomId: String) -> Unit = {},
|
onClickRoom: (roomId: String) -> Unit = {},
|
||||||
) {
|
) {
|
||||||
|
@ -47,7 +45,7 @@ fun MainActivityRoomListControl(
|
||||||
} else if (roomSummaries!!.isEmpty()) {
|
} else if (roomSummaries!!.isEmpty()) {
|
||||||
Text(
|
Text(
|
||||||
modifier = TwoMPadding.base,
|
modifier = TwoMPadding.base,
|
||||||
text = stringResource(R.string.room_list_empty_text)
|
text = stringResource(R.string.main_roomlist_empty_text)
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
roomSummaries!!.forEach {
|
roomSummaries!!.forEach {
|
|
@ -1,57 +1,45 @@
|
||||||
package eu.steffo.twom.main
|
package eu.steffo.twom.main
|
||||||
|
|
||||||
import androidx.compose.foundation.layout.padding
|
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.Scaffold
|
||||||
import androidx.compose.material3.Text
|
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.CompositionLocalProvider
|
import androidx.compose.runtime.CompositionLocalProvider
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.platform.LocalContext
|
|
||||||
import androidx.compose.ui.tooling.preview.Preview
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
import eu.steffo.twom.R
|
|
||||||
import eu.steffo.twom.matrix.LocalSession
|
import eu.steffo.twom.matrix.LocalSession
|
||||||
import eu.steffo.twom.theme.TwoMTheme
|
import eu.steffo.twom.theme.TwoMTheme
|
||||||
import org.matrix.android.sdk.api.session.Session
|
import org.matrix.android.sdk.api.session.Session
|
||||||
|
|
||||||
@OptIn(ExperimentalMaterial3Api::class)
|
|
||||||
@Composable
|
@Composable
|
||||||
@Preview
|
@Preview
|
||||||
fun MatrixActivityScaffold(
|
fun MatrixActivityScaffold(
|
||||||
onClickLogin: () -> Unit = {},
|
onClickLogin: () -> Unit = {},
|
||||||
onClickLogout: () -> Unit = {},
|
onClickLogout: () -> Unit = {},
|
||||||
onClickRoom: (roomId: String) -> Unit = {},
|
onClickRoom: (roomId: String) -> Unit = {},
|
||||||
|
onClickCreate: () -> Unit = {},
|
||||||
session: Session? = null,
|
session: Session? = null,
|
||||||
) {
|
) {
|
||||||
TwoMTheme {
|
TwoMTheme {
|
||||||
CompositionLocalProvider(LocalSession provides session) {
|
CompositionLocalProvider(LocalSession provides session) {
|
||||||
Scaffold(
|
Scaffold(
|
||||||
topBar = {
|
topBar = {
|
||||||
CenterAlignedTopAppBar(
|
MainActivityTopBar(
|
||||||
title = {
|
|
||||||
Text(LocalContext.current.getString(R.string.app_name))
|
|
||||||
},
|
|
||||||
actions = {
|
|
||||||
ProfileIconButton(
|
|
||||||
onClickLogout = onClickLogout
|
|
||||||
)
|
|
||||||
},
|
|
||||||
)
|
|
||||||
}
|
|
||||||
) {
|
|
||||||
if (session == null) {
|
|
||||||
MatrixActivityNotLoggedInControl(
|
|
||||||
modifier = Modifier.padding(it),
|
|
||||||
onClickLogin = onClickLogin,
|
onClickLogin = onClickLogin,
|
||||||
|
onClickLogout = onClickLogout,
|
||||||
)
|
)
|
||||||
} else {
|
},
|
||||||
MainActivityRoomListControl(
|
floatingActionButton = {
|
||||||
|
MainActivityCreateFAB(
|
||||||
|
onClickCreate = onClickCreate,
|
||||||
|
)
|
||||||
|
},
|
||||||
|
content = {
|
||||||
|
MainActivityContent(
|
||||||
modifier = Modifier.padding(it),
|
modifier = Modifier.padding(it),
|
||||||
onClickRoom = onClickRoom,
|
onClickRoom = onClickRoom,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
33
app/src/main/java/eu/steffo/twom/main/MainActivityTopBar.kt
Normal file
33
app/src/main/java/eu/steffo/twom/main/MainActivityTopBar.kt
Normal file
|
@ -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,
|
||||||
|
)
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
|
@ -10,7 +10,7 @@ import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.draw.clip
|
import androidx.compose.ui.draw.clip
|
||||||
import androidx.compose.ui.unit.dp
|
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
|
import org.matrix.android.sdk.api.session.room.model.RoomSummary
|
||||||
|
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@ fun RoomListItem(
|
||||||
.size(40.dp)
|
.size(40.dp)
|
||||||
.clip(MaterialTheme.shapes.medium)
|
.clip(MaterialTheme.shapes.medium)
|
||||||
) {
|
) {
|
||||||
Avatar(
|
AvatarFromURL(
|
||||||
url = roomSummary.avatarUrl,
|
url = roomSummary.avatarUrl,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
|
||||||
)
|
|
||||||
}
|
|
|
@ -1,11 +1,7 @@
|
||||||
package eu.steffo.twom.matrix
|
package eu.steffo.twom.matrix
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.graphics.BitmapFactory
|
|
||||||
import android.util.Log
|
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.Matrix
|
||||||
import org.matrix.android.sdk.api.MatrixConfiguration
|
import org.matrix.android.sdk.api.MatrixConfiguration
|
||||||
|
|
||||||
|
@ -40,27 +36,4 @@ object TwoMMatrix {
|
||||||
}
|
}
|
||||||
return null
|
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
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 = "?",
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
package eu.steffo.twom.matrix
|
package eu.steffo.twom.matrix.avatar
|
||||||
|
|
||||||
import android.graphics.BitmapFactory
|
import android.graphics.BitmapFactory
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
|
@ -13,10 +13,11 @@ import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.graphics.ImageBitmap
|
import androidx.compose.ui.graphics.ImageBitmap
|
||||||
import androidx.compose.ui.graphics.asImageBitmap
|
import androidx.compose.ui.graphics.asImageBitmap
|
||||||
import androidx.compose.ui.tooling.preview.Preview
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
|
import eu.steffo.twom.matrix.LocalSession
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
@Preview
|
@Preview(widthDp = 40, heightDp = 40)
|
||||||
fun Avatar(
|
fun AvatarFromURL(
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
url: String? = "",
|
url: String? = "",
|
||||||
contentDescription: String = "",
|
contentDescription: String = "",
|
||||||
|
@ -52,7 +53,7 @@ fun Avatar(
|
||||||
}
|
}
|
||||||
|
|
||||||
if (session == null || url == null || avatar == null) {
|
if (session == null || url == null || avatar == null) {
|
||||||
DefaultAvatar(
|
AvatarFromDefault(
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
contentDescription = contentDescription
|
contentDescription = contentDescription
|
||||||
)
|
)
|
|
@ -1,4 +1,4 @@
|
||||||
package eu.steffo.twom.matrix
|
package eu.steffo.twom.matrix.avatar
|
||||||
|
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
|
@ -8,9 +8,12 @@ import androidx.compose.runtime.mutableStateOf
|
||||||
import androidx.compose.runtime.saveable.rememberSaveable
|
import androidx.compose.runtime.saveable.rememberSaveable
|
||||||
import androidx.compose.runtime.setValue
|
import androidx.compose.runtime.setValue
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
|
import eu.steffo.twom.matrix.LocalSession
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun UserAvatar(
|
@Preview(widthDp = 40, heightDp = 40)
|
||||||
|
fun AvatarFromUserId(
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
userId: String = "",
|
userId: String = "",
|
||||||
contentDescription: String = "",
|
contentDescription: String = "",
|
||||||
|
@ -33,12 +36,12 @@ fun UserAvatar(
|
||||||
}
|
}
|
||||||
|
|
||||||
if (avatarUrl == null) {
|
if (avatarUrl == null) {
|
||||||
DefaultAvatar(
|
AvatarFromDefault(
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
contentDescription = contentDescription,
|
contentDescription = contentDescription,
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
Avatar(
|
AvatarFromURL(
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
url = avatarUrl!!,
|
url = avatarUrl!!,
|
||||||
contentDescription = contentDescription,
|
contentDescription = contentDescription,
|
|
@ -6,5 +6,4 @@ class RoomActivity : ComponentActivity() {
|
||||||
companion object {
|
companion object {
|
||||||
const val ROOM_ID_EXTRA = "roomId"
|
const val ROOM_ID_EXTRA = "roomId"
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -19,12 +19,19 @@ fun TwoMTheme(
|
||||||
content: @Composable () -> Unit
|
content: @Composable () -> Unit
|
||||||
) {
|
) {
|
||||||
val context = LocalContext.current
|
val context = LocalContext.current
|
||||||
|
|
||||||
val darkTheme = isSystemInDarkTheme()
|
val darkTheme = isSystemInDarkTheme()
|
||||||
val colorScheme = if (darkTheme) {
|
val colorScheme = when (darkTheme) {
|
||||||
dynamicDarkColorScheme(context)
|
true -> dynamicDarkColorScheme(context)
|
||||||
} else {
|
false -> dynamicLightColorScheme(context)
|
||||||
dynamicLightColorScheme(context)
|
|
||||||
}
|
}
|
||||||
|
val typography = Typography()
|
||||||
|
|
||||||
|
MaterialTheme(
|
||||||
|
colorScheme = colorScheme,
|
||||||
|
typography = typography,
|
||||||
|
content = content
|
||||||
|
)
|
||||||
|
|
||||||
val view = LocalView.current
|
val view = LocalView.current
|
||||||
if (!view.isInEditMode) {
|
if (!view.isInEditMode) {
|
||||||
|
@ -34,12 +41,4 @@ fun TwoMTheme(
|
||||||
WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = !darkTheme
|
WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = !darkTheme
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val typography = Typography()
|
|
||||||
|
|
||||||
MaterialTheme(
|
|
||||||
colorScheme = colorScheme,
|
|
||||||
typography = typography,
|
|
||||||
content = content
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 43 KiB |
|
@ -19,11 +19,12 @@
|
||||||
<string name="login_password_label">Password</string>
|
<string name="login_password_label">Password</string>
|
||||||
<string name="password_show">Show password</string>
|
<string name="password_show">Show password</string>
|
||||||
<string name="password_hide">Hide password</string>
|
<string name="password_hide">Hide password</string>
|
||||||
<string name="notloggedin_text">To use TwoM, you need to be logged into Matrix.</string>
|
<string name="main_notloggedin_text_1">To use TwoM, you need to select the Matrix account to use.</string>
|
||||||
<string name="notloggedin_login_text">Login</string>
|
<string name="main_account_label">My account</string>
|
||||||
<string name="loggedin_text">You are logged in.</string>
|
<string name="main_account_logout_text">Logout</string>
|
||||||
<string name="account_label">My account</string>
|
<string name="main_roomlist_empty_text">There are no rooms.</string>
|
||||||
<string name="profile_logout_text">Logout</string>
|
|
||||||
<string name="room_list_empty_text">There are no rooms.</string>
|
|
||||||
<string name="loading">Loading...</string>
|
<string name="loading">Loading...</string>
|
||||||
|
<string name="main_efab_create_text">New</string>
|
||||||
|
<string name="main_notloggedin_text_2">Log into your Matrix account by clicking the icon on the top right of the screen.</string>
|
||||||
|
<string name="main_account_login_text">Login</string>
|
||||||
</resources>
|
</resources>
|
|
@ -1,5 +1,8 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
|
|
||||||
<style name="Theme.TwoM" parent="@style/Theme.Material3.DayNight"></style>
|
<style name="Theme.TwoM" parent="@style/Theme.Material3.DayNight" />
|
||||||
|
|
||||||
|
<style name="Theme.TwoM.Dialog" parent="@style/Theme.Material3.DayNight.Dialog" />
|
||||||
|
|
||||||
</resources>
|
</resources>
|
Loading…
Reference in a new issue