mirror of
https://github.com/oxen-io/session-android.git
synced 2025-12-31 07:56:28 +00:00
feat: add basic compose for create group and some reusable components
This commit is contained in:
@@ -7,13 +7,15 @@ import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.Toast
|
||||
import androidx.compose.foundation.layout.fillMaxHeight
|
||||
import androidx.compose.foundation.layout.fillMaxSize
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.fillMaxWidth
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.platform.ComposeView
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.tooling.preview.PreviewParameter
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.core.view.isVisible
|
||||
import androidx.fragment.app.Fragment
|
||||
@@ -32,12 +34,15 @@ import org.session.libsession.utilities.Contact
|
||||
import org.session.libsession.utilities.Device
|
||||
import org.session.libsession.utilities.TextSecurePreferences
|
||||
import org.session.libsession.utilities.recipients.Recipient
|
||||
import org.session.libsignal.utilities.SessionId
|
||||
import org.thoughtcrime.securesms.contacts.SelectContactsAdapter
|
||||
import org.thoughtcrime.securesms.conversation.start.NewConversationDelegate
|
||||
import org.thoughtcrime.securesms.conversation.v2.ConversationActivityV2
|
||||
import org.thoughtcrime.securesms.dependencies.DatabaseComponent
|
||||
import org.thoughtcrime.securesms.keyboard.emoji.KeyboardPageSearchView
|
||||
import org.thoughtcrime.securesms.mms.GlideApp
|
||||
import org.thoughtcrime.securesms.ui.PreviewTheme
|
||||
import org.thoughtcrime.securesms.ui.ThemeResPreviewParameterProvider
|
||||
import org.thoughtcrime.securesms.util.fadeIn
|
||||
import org.thoughtcrime.securesms.util.fadeOut
|
||||
import javax.inject.Inject
|
||||
@@ -132,15 +137,46 @@ class CreateGroupFragment : Fragment() {
|
||||
context.startActivity(intent)
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun CreateGroupScreen(createGroupState: CreateGroupState, modifier: Modifier = Modifier) {
|
||||
CreateGroup(createGroupState, onCreate = {
|
||||
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
data class CreateGroupState (
|
||||
val groupName: String,
|
||||
val groupDescription: String,
|
||||
val members: Set<SessionId>
|
||||
)
|
||||
|
||||
@Composable
|
||||
fun CreateGroup(
|
||||
createGroupState: CreateGroupState,
|
||||
onCreate: suspend (CreateGroupState) -> Unit,
|
||||
modifier: Modifier = Modifier) {
|
||||
Column(
|
||||
modifier
|
||||
.fillMaxWidth()
|
||||
.padding(8.dp)) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Composable
|
||||
fun MemberList(contacts: List<Contact>, modifier: Modifier = Modifier) {
|
||||
Avatar
|
||||
|
||||
}
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun ClosedGroupPreview() {
|
||||
MemberList(contacts = emptyList(), modifier = Modifier.fillMaxWidth())
|
||||
fun ClosedGroupPreview(
|
||||
@PreviewParameter(ThemeResPreviewParameterProvider::class) themeResId: Int
|
||||
) {
|
||||
PreviewTheme(themeResId) {
|
||||
CreateGroup(CreateGroupState("Group Name", "Test Group Description", emptySet()), {})
|
||||
}
|
||||
}
|
||||
@@ -2,17 +2,24 @@ package org.thoughtcrime.securesms.ui
|
||||
|
||||
import androidx.annotation.DrawableRes
|
||||
import androidx.compose.foundation.ExperimentalFoundationApi
|
||||
import androidx.compose.foundation.Image
|
||||
import androidx.compose.foundation.background
|
||||
import androidx.compose.foundation.clickable
|
||||
import androidx.compose.foundation.layout.Box
|
||||
import androidx.compose.foundation.layout.BoxScope
|
||||
import androidx.compose.foundation.layout.Row
|
||||
import androidx.compose.foundation.layout.RowScope
|
||||
import androidx.compose.foundation.layout.Spacer
|
||||
import androidx.compose.foundation.layout.fillMaxHeight
|
||||
import androidx.compose.foundation.layout.fillMaxSize
|
||||
import androidx.compose.foundation.layout.fillMaxWidth
|
||||
import androidx.compose.foundation.layout.height
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.layout.size
|
||||
import androidx.compose.foundation.layout.width
|
||||
import androidx.compose.foundation.layout.wrapContentHeight
|
||||
import androidx.compose.foundation.pager.PagerState
|
||||
import androidx.compose.foundation.shape.CircleShape
|
||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||
import androidx.compose.material.ButtonColors
|
||||
import androidx.compose.material.Card
|
||||
@@ -29,8 +36,14 @@ import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.graphics.RectangleShape
|
||||
import androidx.compose.ui.res.painterResource
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.text.font.FontWeight
|
||||
import androidx.compose.ui.text.style.TextOverflow
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.tooling.preview.PreviewParameter
|
||||
import androidx.compose.ui.unit.Dp
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.compose.ui.unit.sp
|
||||
import androidx.compose.ui.viewinterop.AndroidView
|
||||
import com.google.accompanist.pager.HorizontalPagerIndicator
|
||||
import kotlinx.coroutines.launch
|
||||
@@ -180,3 +193,102 @@ fun RowScope.Avatar(recipient: Recipient) {
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun EditableAvatar(
|
||||
// TODO: add attachment-based state for current view rendering?
|
||||
) {
|
||||
Box(modifier = Modifier
|
||||
.size(110.dp)
|
||||
.padding(15.dp)
|
||||
) {
|
||||
Image(
|
||||
painter = painterResource(id = R.drawable.avatar_placeholder),
|
||||
contentDescription = stringResource(
|
||||
id = R.string.arrays__default
|
||||
),
|
||||
Modifier
|
||||
.fillMaxSize()
|
||||
.background(MaterialTheme.colors.cellColor, shape = CircleShape)
|
||||
.padding(16.dp)
|
||||
)
|
||||
Image(
|
||||
painter = painterResource(id = R.drawable.ic_plus),
|
||||
contentDescription = null,
|
||||
Modifier
|
||||
.align(Alignment.BottomEnd)
|
||||
.size(24.dp)
|
||||
.background(colorDestructive, shape = CircleShape)
|
||||
.padding(6.dp)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun NavigationBar(
|
||||
//
|
||||
title: String,
|
||||
titleAlignment: Alignment = Alignment.Center,
|
||||
// if
|
||||
onBack: (() -> Unit)? = null,
|
||||
onClose: (()->Unit)? = null,
|
||||
) {
|
||||
Row(
|
||||
Modifier
|
||||
.fillMaxWidth()
|
||||
.height(64.dp)) {
|
||||
// Optional back button, layout should still take up space
|
||||
Box(modifier = Modifier
|
||||
.fillMaxHeight()
|
||||
) {
|
||||
if (onBack != null) {
|
||||
Icon(
|
||||
painter = painterResource(id = R.drawable.ic_arrow_left_24),
|
||||
contentDescription = stringResource(
|
||||
id = R.string.new_conversation_dialog_back_button_content_description
|
||||
),
|
||||
Modifier
|
||||
.clickable { onBack() }
|
||||
.padding(16.dp)
|
||||
.align(Alignment.Center)
|
||||
)
|
||||
}
|
||||
}
|
||||
//Main title
|
||||
Box(modifier = Modifier.fillMaxHeight().weight(1f).padding(8.dp)) {
|
||||
Text(
|
||||
text = title,
|
||||
Modifier.align(titleAlignment),
|
||||
overflow = TextOverflow.Ellipsis,
|
||||
fontSize = 26.sp,
|
||||
fontWeight = FontWeight.Bold
|
||||
)
|
||||
}
|
||||
// Optional close button
|
||||
Box(modifier = Modifier
|
||||
.fillMaxHeight()
|
||||
.align(Alignment.CenterVertically)
|
||||
) {
|
||||
if (onClose != null) {
|
||||
Icon(
|
||||
painter = painterResource(id = R.drawable.ic_baseline_close_24),
|
||||
contentDescription = stringResource(
|
||||
id = R.string.new_conversation_dialog_close_button_content_description
|
||||
),
|
||||
Modifier
|
||||
.clickable { onClose() }
|
||||
.padding(16.dp)
|
||||
.align(Alignment.Center)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
@Preview
|
||||
fun PreviewNavigationBar(@PreviewParameter(provider = ThemeResPreviewParameterProvider::class) themeResId: Int) {
|
||||
PreviewTheme(themeResId = themeResId) {
|
||||
NavigationBar(title = "Create Group", onBack = {}, onClose = {})
|
||||
}
|
||||
}
|
||||
|
||||
18
app/src/main/res/drawable/avatar_placeholder.xml
Normal file
18
app/src/main/res/drawable/avatar_placeholder.xml
Normal file
@@ -0,0 +1,18 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="44dp"
|
||||
android:height="35dp"
|
||||
android:viewportWidth="44"
|
||||
android:viewportHeight="35">
|
||||
<path
|
||||
android:pathData="M34.951,23.398L26.63,17.311C26.575,17.267 26.507,17.243 26.438,17.243C26.368,17.243 26.299,17.267 26.245,17.311L18.784,23.488C18.727,23.531 18.657,23.554 18.585,23.554C18.513,23.554 18.444,23.531 18.386,23.488L14.637,20.432C14.583,20.391 14.517,20.369 14.45,20.369C14.383,20.369 14.318,20.391 14.264,20.432L4.107,27.648C4.068,27.679 4.036,27.718 4.014,27.762C3.991,27.807 3.979,27.855 3.978,27.905V30.242C3.982,30.435 4.06,30.619 4.196,30.756C4.333,30.893 4.517,30.971 4.71,30.974H34.348C34.542,30.974 34.728,30.897 34.865,30.76C35.002,30.622 35.08,30.436 35.08,30.242V23.642C35.081,23.594 35.07,23.546 35.047,23.503C35.025,23.46 34.992,23.424 34.951,23.398Z"
|
||||
android:fillColor="?colorOnSurface"/>
|
||||
<path
|
||||
android:pathData="M11.131,18.248C12.726,18.248 14.02,16.955 14.02,15.359C14.02,13.763 12.726,12.47 11.131,12.47C9.535,12.47 8.242,13.763 8.242,15.359C8.242,16.955 9.535,18.248 11.131,18.248Z"
|
||||
android:fillColor="?colorOnSurface"/>
|
||||
<path
|
||||
android:pathData="M40.396,4.123L8.229,0.374C7.807,0.322 7.38,0.354 6.971,0.47C6.563,0.585 6.181,0.78 5.849,1.044C5.517,1.308 5.24,1.636 5.036,2.008C4.832,2.38 4.703,2.789 4.659,3.212L4.505,4.598H7.073L7.201,3.507C7.212,3.424 7.239,3.343 7.281,3.27C7.323,3.198 7.379,3.134 7.445,3.083C7.555,2.995 7.69,2.946 7.831,2.942H7.895L22.187,4.598H35.722C36.512,4.603 37.29,4.789 37.996,5.143C38.702,5.498 39.316,6.01 39.792,6.64H40.1C40.269,6.659 40.423,6.745 40.528,6.877C40.634,7.009 40.683,7.178 40.666,7.346L40.576,8.078C40.755,8.595 40.85,9.137 40.858,9.683V27.995L43.221,7.68C43.315,6.834 43.071,5.986 42.541,5.319C42.012,4.653 41.241,4.223 40.396,4.123Z"
|
||||
android:fillColor="?colorOnSurface"/>
|
||||
<path
|
||||
android:pathData="M35.722,34.801H3.336C2.485,34.801 1.668,34.463 1.066,33.861C0.464,33.258 0.126,32.442 0.126,31.59V9.761C0.126,8.909 0.464,8.093 1.066,7.49C1.668,6.888 2.485,6.55 3.336,6.55H35.722C36.573,6.55 37.39,6.888 37.992,7.49C38.594,8.093 38.932,8.909 38.932,9.761V31.59C38.932,32.442 38.594,33.258 37.992,33.861C37.39,34.463 36.573,34.801 35.722,34.801ZM3.336,9.093C3.166,9.093 3.003,9.16 2.882,9.281C2.762,9.401 2.694,9.565 2.694,9.735V31.565C2.694,31.735 2.762,31.898 2.882,32.019C3.003,32.139 3.166,32.207 3.336,32.207H35.722C35.892,32.207 36.055,32.139 36.176,32.019C36.296,31.898 36.364,31.735 36.364,31.565V9.735C36.364,9.565 36.296,9.401 36.176,9.281C36.055,9.16 35.892,9.093 35.722,9.093H3.336Z"
|
||||
android:fillColor="?colorOnSurface"/>
|
||||
</vector>
|
||||
Reference in New Issue
Block a user