diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/CreateGroupFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/groups/CreateGroupFragment.kt index 0b3518ee99..95b66a9b41 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/CreateGroupFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/CreateGroupFragment.kt @@ -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 +) + +@Composable +fun CreateGroup( + createGroupState: CreateGroupState, + onCreate: suspend (CreateGroupState) -> Unit, + modifier: Modifier = Modifier) { + Column( + modifier + .fillMaxWidth() + .padding(8.dp)) { + + } +} + + @Composable fun MemberList(contacts: List, 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()), {}) + } } \ No newline at end of file diff --git a/app/src/main/java/org/thoughtcrime/securesms/ui/Components.kt b/app/src/main/java/org/thoughtcrime/securesms/ui/Components.kt index 1724bde8a6..20bea146de 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/ui/Components.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/ui/Components.kt @@ -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 = {}) + } +} diff --git a/app/src/main/res/drawable/avatar_placeholder.xml b/app/src/main/res/drawable/avatar_placeholder.xml new file mode 100644 index 0000000000..0e0f285417 --- /dev/null +++ b/app/src/main/res/drawable/avatar_placeholder.xml @@ -0,0 +1,18 @@ + + + + + +