From bff8fc823047abd52ec7da2859e40d52b2cc3367 Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Fri, 21 Apr 2023 10:48:42 -0300 Subject: [PATCH] Add call link details screen scaffolding. --- .../securesms/calls/links/CallLinks.kt | 8 + .../links/EditCallLinkNameDialogFragment.kt | 20 +- .../securesms/calls/links/SignalCallRow.kt | 30 ++- ...CreateCallLinkBottomSheetDialogFragment.kt | 31 ++- .../links/create/CreateCallLinkViewModel.kt | 23 +-- .../links/details/CallLinkDetailsActivity.kt | 10 + .../links/details/CallLinkDetailsFragment.kt | 179 ++++++++++++++++++ .../calls/links/details/CallLinkViewModel.kt | 22 +++ .../conversation/colors/AvatarColorPair.kt | 18 ++ .../securesms/database/CallLinkTable.kt | 8 + .../main/res/navigation/call_link_details.xml | 26 +++ .../res/navigation/main_activity_list.xml | 21 +- app/src/main/res/values/strings.xml | 12 ++ .../src/main/java/org/signal/core/ui/Rows.kt | 9 +- 14 files changed, 371 insertions(+), 46 deletions(-) create mode 100644 app/src/main/java/org/thoughtcrime/securesms/calls/links/CallLinks.kt create mode 100644 app/src/main/java/org/thoughtcrime/securesms/calls/links/details/CallLinkDetailsActivity.kt create mode 100644 app/src/main/java/org/thoughtcrime/securesms/calls/links/details/CallLinkDetailsFragment.kt create mode 100644 app/src/main/java/org/thoughtcrime/securesms/calls/links/details/CallLinkViewModel.kt create mode 100644 app/src/main/res/navigation/call_link_details.xml diff --git a/app/src/main/java/org/thoughtcrime/securesms/calls/links/CallLinks.kt b/app/src/main/java/org/thoughtcrime/securesms/calls/links/CallLinks.kt new file mode 100644 index 0000000000..1805a767a8 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/calls/links/CallLinks.kt @@ -0,0 +1,8 @@ +package org.thoughtcrime.securesms.calls.links + +/** + * Utility object for call links to try to keep some common logic in one place. + */ +object CallLinks { + fun url(identifier: String) = "https://calls.signal.org/#$identifier" +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/calls/links/EditCallLinkNameDialogFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/calls/links/EditCallLinkNameDialogFragment.kt index 5523ca6c82..e53b342558 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/calls/links/EditCallLinkNameDialogFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/calls/links/EditCallLinkNameDialogFragment.kt @@ -28,18 +28,21 @@ import androidx.compose.ui.text.TextRange import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import androidx.fragment.app.viewModels +import androidx.core.os.bundleOf +import androidx.fragment.app.setFragmentResult +import androidx.navigation.fragment.navArgs import org.signal.core.ui.Buttons import org.signal.core.ui.Scaffolds import org.thoughtcrime.securesms.R -import org.thoughtcrime.securesms.calls.links.create.CreateCallLinkViewModel import org.thoughtcrime.securesms.compose.ComposeDialogFragment class EditCallLinkNameDialogFragment : ComposeDialogFragment() { - private val viewModel: CreateCallLinkViewModel by viewModels( - ownerProducer = { requireParentFragment() } - ) + companion object { + const val RESULT_KEY = "edit_call_link_name" + } + + private val args: EditCallLinkNameDialogFragmentArgs by navArgs() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -57,12 +60,11 @@ class EditCallLinkNameDialogFragment : ComposeDialogFragment() { @Preview @Composable override fun DialogContent() { - val viewModelCallName by viewModel.callName var callName by remember { mutableStateOf( TextFieldValue( - text = viewModelCallName, - selection = TextRange(viewModelCallName.length) + text = args.name, + selection = TextRange(args.name.length) ) ) } @@ -97,7 +99,7 @@ class EditCallLinkNameDialogFragment : ComposeDialogFragment() { Spacer(modifier = Modifier.weight(1f)) Buttons.MediumTonal( onClick = { - viewModel.setCallName(callName.text) + setFragmentResult(RESULT_KEY, bundleOf(RESULT_KEY to callName.text)) dismiss() }, modifier = Modifier.align(End) diff --git a/app/src/main/java/org/thoughtcrime/securesms/calls/links/SignalCallRow.kt b/app/src/main/java/org/thoughtcrime/securesms/calls/links/SignalCallRow.kt index e83ba4fd20..588bcae810 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/calls/links/SignalCallRow.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/calls/links/SignalCallRow.kt @@ -15,12 +15,14 @@ import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember import androidx.compose.ui.Alignment.Companion.CenterVertically import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.vectorResource @@ -29,14 +31,25 @@ import androidx.compose.ui.unit.dp import org.signal.core.ui.Buttons import org.signal.core.ui.theme.SignalTheme import org.thoughtcrime.securesms.R +import org.thoughtcrime.securesms.conversation.colors.AvatarColor +import org.thoughtcrime.securesms.conversation.colors.AvatarColorPair +import org.thoughtcrime.securesms.database.CallLinkTable @Preview @Composable private fun SignalCallRowPreview() { + val avatarColor = remember { AvatarColor.random() } + val callLink = remember { + CallLinkTable.CallLink( + name = "Call Name", + identifier = "blahblahblah", + avatarColor = avatarColor, + isApprovalRequired = false + ) + } SignalTheme(false) { SignalCallRow( - callName = "Call Name", - callLink = "https://call.signal.org#blahblahblah", + callLink = callLink, onJoinClicked = {} ) } @@ -44,8 +57,7 @@ private fun SignalCallRowPreview() { @Composable fun SignalCallRow( - callName: String, - callLink: String, + callLink: CallLinkTable.CallLink, onJoinClicked: () -> Unit, modifier: Modifier = Modifier ) { @@ -60,15 +72,17 @@ fun SignalCallRow( ) .padding(16.dp) ) { + val callColorPair = AvatarColorPair.create(LocalContext.current, callLink.avatarColor) + Image( imageVector = ImageVector.vectorResource(id = R.drawable.symbol_video_display_bold_40), contentScale = ContentScale.Inside, contentDescription = null, - colorFilter = ColorFilter.tint(Color(0xFF5151F6)), + colorFilter = ColorFilter.tint(Color(callColorPair.foregroundColor)), modifier = Modifier .size(64.dp) .background( - color = Color(0xFFE5E5FE), + color = Color(callColorPair.backgroundColor), shape = CircleShape ) ) @@ -81,10 +95,10 @@ fun SignalCallRow( .align(CenterVertically) ) { Text( - text = callName.ifEmpty { stringResource(id = R.string.CreateCallLinkBottomSheetDialogFragment__signal_call) } + text = callLink.name.ifEmpty { stringResource(id = R.string.CreateCallLinkBottomSheetDialogFragment__signal_call) } ) Text( - text = callLink, + text = CallLinks.url(callLink.identifier), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/calls/links/create/CreateCallLinkBottomSheetDialogFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/calls/links/create/CreateCallLinkBottomSheetDialogFragment.kt index 92cf17fabd..7ef6594936 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/calls/links/create/CreateCallLinkBottomSheetDialogFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/calls/links/create/CreateCallLinkBottomSheetDialogFragment.kt @@ -2,6 +2,8 @@ package org.thoughtcrime.securesms.calls.links.create import android.content.ActivityNotFoundException import android.content.Intent +import android.os.Bundle +import android.view.View import android.widget.Toast import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column @@ -25,15 +27,18 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.core.app.ShareCompat import androidx.fragment.app.viewModels +import androidx.navigation.fragment.findNavController import org.signal.core.ui.Buttons import org.signal.core.ui.Dividers import org.signal.core.ui.Rows import org.thoughtcrime.securesms.R +import org.thoughtcrime.securesms.calls.links.CallLinks import org.thoughtcrime.securesms.calls.links.EditCallLinkNameDialogFragment import org.thoughtcrime.securesms.calls.links.SignalCallRow import org.thoughtcrime.securesms.compose.ComposeBottomSheetDialogFragment import org.thoughtcrime.securesms.conversation.mutiselect.forward.MultiselectForwardFragment import org.thoughtcrime.securesms.conversation.mutiselect.forward.MultiselectForwardFragmentArgs +import org.thoughtcrime.securesms.database.CallLinkTable import org.thoughtcrime.securesms.sharing.MultiShareArgs import org.thoughtcrime.securesms.util.Util @@ -46,6 +51,14 @@ class CreateCallLinkBottomSheetDialogFragment : ComposeBottomSheetDialogFragment override val peekHeightPercentage: Float = 1f + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + parentFragmentManager.setFragmentResultListener(EditCallLinkNameDialogFragment.RESULT_KEY, viewLifecycleOwner) { resultKey, bundle -> + if (bundle.containsKey(resultKey)) { + viewModel.setCallName(bundle.getString(resultKey)!!) + } + } + } + @Composable override fun SheetContent() { Column( @@ -53,9 +66,7 @@ class CreateCallLinkBottomSheetDialogFragment : ComposeBottomSheetDialogFragment .fillMaxWidth() .wrapContentSize(Alignment.Center) ) { - val callName: String by viewModel.callName - val callLink: String by viewModel.callLink - val approveAllMembers: Boolean by viewModel.approveAllMembers + val callLink: CallLinkTable.CallLink by viewModel.callLink Handle(modifier = Modifier.align(Alignment.CenterHorizontally)) @@ -71,7 +82,6 @@ class CreateCallLinkBottomSheetDialogFragment : ComposeBottomSheetDialogFragment Spacer(modifier = Modifier.height(24.dp)) SignalCallRow( - callName = callName, callLink = callLink, onJoinClicked = this@CreateCallLinkBottomSheetDialogFragment::onJoinClicked ) @@ -84,7 +94,7 @@ class CreateCallLinkBottomSheetDialogFragment : ComposeBottomSheetDialogFragment ) Rows.ToggleRow( - checked = approveAllMembers, + checked = callLink.isApprovalRequired, text = stringResource(id = R.string.CreateCallLinkBottomSheetDialogFragment__approve_all_members), onCheckChanged = viewModel::setApproveAllMembers, modifier = Modifier.clickable(onClick = viewModel::toggleApproveAllMembers) @@ -124,7 +134,10 @@ class CreateCallLinkBottomSheetDialogFragment : ComposeBottomSheetDialogFragment } private fun onAddACallNameClicked() { - EditCallLinkNameDialogFragment().show(childFragmentManager, null) + val snapshot = viewModel.callLink.value + findNavController().navigate( + CreateCallLinkBottomSheetDialogFragmentDirections.actionCreateCallLinkBottomSheetToEditCallLinkNameDialogFragment(snapshot.name) + ) } private fun onJoinClicked() { @@ -142,7 +155,7 @@ class CreateCallLinkBottomSheetDialogFragment : ComposeBottomSheetDialogFragment canSendToNonPush = false, multiShareArgs = listOf( MultiShareArgs.Builder() - .withDraftText(snapshot) + .withDraftText(snapshot.identifier) .build() ) ) @@ -151,7 +164,7 @@ class CreateCallLinkBottomSheetDialogFragment : ComposeBottomSheetDialogFragment private fun onCopyLinkClicked() { val snapshot = viewModel.callLink.value - Util.copyToClipboard(requireContext(), snapshot) + Util.copyToClipboard(requireContext(), CallLinks.url(snapshot.identifier)) Toast.makeText(requireContext(), R.string.CreateCallLinkBottomSheetDialogFragment__copied_to_clipboard, Toast.LENGTH_LONG).show() } @@ -159,7 +172,7 @@ class CreateCallLinkBottomSheetDialogFragment : ComposeBottomSheetDialogFragment val snapshot = viewModel.callLink.value val mimeType = Intent.normalizeMimeType("text/plain") val shareIntent = ShareCompat.IntentBuilder(requireContext()) - .setText(snapshot) + .setText(CallLinks.url(snapshot.identifier)) .setType(mimeType) .createChooserIntent() .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) diff --git a/app/src/main/java/org/thoughtcrime/securesms/calls/links/create/CreateCallLinkViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/calls/links/create/CreateCallLinkViewModel.kt index 11d1ae0c7b..b0b7df43f3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/calls/links/create/CreateCallLinkViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/calls/links/create/CreateCallLinkViewModel.kt @@ -4,29 +4,24 @@ import androidx.compose.runtime.MutableState import androidx.compose.runtime.State import androidx.compose.runtime.mutableStateOf import androidx.lifecycle.ViewModel +import org.thoughtcrime.securesms.conversation.colors.AvatarColor +import org.thoughtcrime.securesms.database.CallLinkTable class CreateCallLinkViewModel : ViewModel() { - private val _callName: MutableState = mutableStateOf("") - private val _callLink: MutableState = mutableStateOf("") - private val _approveAllMembers: MutableState = mutableStateOf(false) - - val callName: State = _callName - val callLink: State = _callLink - val approveAllMembers: State = _approveAllMembers + private val _callLink: MutableState = mutableStateOf( + CallLinkTable.CallLink("", "", AvatarColor.random(), false) + ) + val callLink: State = _callLink fun setApproveAllMembers(approveAllMembers: Boolean) { - _approveAllMembers.value = approveAllMembers + _callLink.value = _callLink.value.copy(isApprovalRequired = approveAllMembers) } fun toggleApproveAllMembers() { - _approveAllMembers.value = !_approveAllMembers.value + _callLink.value = _callLink.value.copy(isApprovalRequired = _callLink.value.isApprovalRequired) } fun setCallName(callName: String) { - _callName.value = callName - } - - fun setCallLink(callLink: String) { - _callLink.value = callLink + _callLink.value = _callLink.value.copy(name = callName) } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/calls/links/details/CallLinkDetailsActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/calls/links/details/CallLinkDetailsActivity.kt new file mode 100644 index 0000000000..4092c53499 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/calls/links/details/CallLinkDetailsActivity.kt @@ -0,0 +1,10 @@ +package org.thoughtcrime.securesms.calls.links.details + +import androidx.fragment.app.Fragment +import androidx.navigation.fragment.NavHostFragment +import org.thoughtcrime.securesms.R +import org.thoughtcrime.securesms.components.FragmentWrapperActivity + +class CallLinkDetailsActivity : FragmentWrapperActivity() { + override fun getFragment(): Fragment = NavHostFragment.create(R.navigation.call_link_details) +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/calls/links/details/CallLinkDetailsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/calls/links/details/CallLinkDetailsFragment.kt new file mode 100644 index 0000000000..9f6dc2519d --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/calls/links/details/CallLinkDetailsFragment.kt @@ -0,0 +1,179 @@ +package org.thoughtcrime.securesms.calls.links.details + +import android.os.Bundle +import android.view.View +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.res.vectorResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.fragment.app.setFragmentResultListener +import androidx.fragment.app.viewModels +import androidx.navigation.fragment.findNavController +import org.signal.core.ui.Dividers +import org.signal.core.ui.Rows +import org.signal.core.ui.Scaffolds +import org.signal.core.ui.theme.SignalTheme +import org.thoughtcrime.securesms.R +import org.thoughtcrime.securesms.calls.links.EditCallLinkNameDialogFragment +import org.thoughtcrime.securesms.calls.links.SignalCallRow +import org.thoughtcrime.securesms.compose.ComposeFragment +import org.thoughtcrime.securesms.conversation.colors.AvatarColor +import org.thoughtcrime.securesms.database.CallLinkTable + +/** + * Provides detailed info about a call link and allows the owner of that link + * to modify call properties. + */ +class CallLinkDetailsFragment : ComposeFragment(), CallLinkDetailsCallback { + + private val viewModel: CallLinkViewModel by viewModels() + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + parentFragmentManager.setFragmentResultListener(EditCallLinkNameDialogFragment.RESULT_KEY, viewLifecycleOwner) { resultKey, bundle -> + if (bundle.containsKey(resultKey)) { + viewModel.setName(bundle.getString(resultKey)!!) + } + } + } + + @Composable + override fun FragmentContent() { + val isLoading by viewModel.isLoading + val callLink by viewModel.callLink + + CallLinkDetails( + isLoading, + callLink, + this + ) + } + + override fun onNavigationClicked() { + findNavController().popBackStack() + } + + override fun onJoinClicked() { + // TODO("Not yet implemented") + } + + override fun onEditNameClicked() { + val name = viewModel.callLink.value.name + findNavController().navigate( + CallLinkDetailsFragmentDirections.actionCallLinkDetailsFragmentToEditCallLinkNameDialogFragment(name) + ) + } + + override fun onShareClicked() { + // TODO("Not yet implemented") + } + + override fun onDeleteClicked() { + // TODO("Not yet implemented") + } + + override fun onApproveAllMembersChanged(checked: Boolean) { + // TODO("Not yet implemented") + } +} + +private interface CallLinkDetailsCallback { + fun onNavigationClicked() + fun onJoinClicked() + fun onEditNameClicked() + fun onShareClicked() + fun onDeleteClicked() + fun onApproveAllMembersChanged(checked: Boolean) +} + +@Preview +@Composable +private fun CallLinkDetailsPreview() { + val avatarColor = remember { + AvatarColor.random() + } + + val callLink = remember { + CallLinkTable.CallLink( + name = "Call Name", + identifier = "call-id-1", + isApprovalRequired = false, + avatarColor = avatarColor + ) + } + + SignalTheme(false) { + CallLinkDetails( + false, + callLink, + object : CallLinkDetailsCallback { + override fun onNavigationClicked() = Unit + override fun onJoinClicked() = Unit + override fun onEditNameClicked() = Unit + override fun onShareClicked() = Unit + override fun onDeleteClicked() = Unit + override fun onApproveAllMembersChanged(checked: Boolean) = Unit + } + ) + } +} + +@Composable +private fun CallLinkDetails( + isLoading: Boolean, + callLink: CallLinkTable.CallLink, + callback: CallLinkDetailsCallback +) { + Scaffolds.Settings( + title = stringResource(id = R.string.CallLinkDetailsFragment__call_details), + onNavigationClick = callback::onNavigationClicked, + navigationIconPainter = painterResource(id = R.drawable.ic_arrow_left_24) + ) { paddingValues -> + if (isLoading) { + return@Settings + } + + Column(modifier = Modifier.padding(paddingValues)) { + SignalCallRow( + callLink = callLink, + onJoinClicked = callback::onJoinClicked, + modifier = Modifier.padding(top = 16.dp, bottom = 12.dp) + ) + + Rows.TextRow( + text = stringResource(id = R.string.CallLinkDetailsFragment__add_call_name), + modifier = Modifier.clickable(onClick = callback::onEditNameClicked) + ) + + Rows.ToggleRow( + checked = callLink.isApprovalRequired, + text = stringResource(id = R.string.CallLinkDetailsFragment__approve_all_members), + onCheckChanged = callback::onApproveAllMembersChanged + ) + + Dividers.Default() + + Rows.TextRow( + text = stringResource(id = R.string.CallLinkDetailsFragment__share_link), + icon = ImageVector.vectorResource(id = R.drawable.symbol_link_24), + modifier = Modifier.clickable(onClick = callback::onShareClicked) + ) + + Rows.TextRow( + text = stringResource(id = R.string.CallLinkDetailsFragment__delete_call_link), + icon = ImageVector.vectorResource(id = R.drawable.symbol_trash_24), + foregroundTint = MaterialTheme.colorScheme.error, + modifier = Modifier.clickable(onClick = callback::onDeleteClicked) + ) + } + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/calls/links/details/CallLinkViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/calls/links/details/CallLinkViewModel.kt new file mode 100644 index 0000000000..8f475e4961 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/calls/links/details/CallLinkViewModel.kt @@ -0,0 +1,22 @@ +package org.thoughtcrime.securesms.calls.links.details + +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.State +import androidx.compose.runtime.mutableStateOf +import androidx.lifecycle.ViewModel +import org.thoughtcrime.securesms.conversation.colors.AvatarColor +import org.thoughtcrime.securesms.database.CallLinkTable + +class CallLinkViewModel : ViewModel() { + private val isLoadingState: MutableState = mutableStateOf(true) + val isLoading: State = isLoadingState + + private val callLinkState: MutableState = mutableStateOf( + CallLinkTable.CallLink("", "", AvatarColor.A120, false) + ) + val callLink: State = callLinkState + + fun setName(name: String) { + callLinkState.value = callLinkState.value.copy(name = name) + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/AvatarColorPair.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/AvatarColorPair.kt index de1b1f0240..eae6efefc0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/AvatarColorPair.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/AvatarColorPair.kt @@ -29,4 +29,22 @@ class AvatarColorPair private constructor( } } } + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + + other as AvatarColorPair + + if (foregroundColor != other.foregroundColor) return false + if (backgroundColor != other.backgroundColor) return false + + return true + } + + override fun hashCode(): Int { + var result = foregroundColor + result = 31 * result + backgroundColor + return result + } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/CallLinkTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/CallLinkTable.kt index 3493a4ec31..60e487e15c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/CallLinkTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/CallLinkTable.kt @@ -2,6 +2,7 @@ package org.thoughtcrime.securesms.database import android.content.Context import org.signal.core.util.logging.Log +import org.thoughtcrime.securesms.conversation.colors.AvatarColor /** * Table containing ad-hoc call link details @@ -21,4 +22,11 @@ class CallLinkTable(context: Context, databaseHelper: SignalDatabase) : Database ) """ } + + data class CallLink( + val name: String, + val identifier: String, + val avatarColor: AvatarColor, + val isApprovalRequired: Boolean + ) } diff --git a/app/src/main/res/navigation/call_link_details.xml b/app/src/main/res/navigation/call_link_details.xml new file mode 100644 index 0000000000..bb3bf2dd3f --- /dev/null +++ b/app/src/main/res/navigation/call_link_details.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/navigation/main_activity_list.xml b/app/src/main/res/navigation/main_activity_list.xml index 89a2599f02..0dcdee23e6 100644 --- a/app/src/main/res/navigation/main_activity_list.xml +++ b/app/src/main/res/navigation/main_activity_list.xml @@ -31,7 +31,7 @@ + android:label="stories_landing_fragment"> @@ -40,7 +40,7 @@ + android:label="call_log_fragment"> @@ -52,6 +52,21 @@ + android:label="create_call_link_bottom_sheet"> + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 42645b5908..9a447bd789 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -5960,5 +5960,17 @@ Edit history + + + Call details + + Add call name + + Approve all members + + Share link + + Delete call link + diff --git a/core-ui/src/main/java/org/signal/core/ui/Rows.kt b/core-ui/src/main/java/org/signal/core/ui/Rows.kt index 0132d19024..78858dd1da 100644 --- a/core-ui/src/main/java/org/signal/core/ui/Rows.kt +++ b/core-ui/src/main/java/org/signal/core/ui/Rows.kt @@ -21,6 +21,7 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment.Companion.CenterVertically import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.tooling.preview.Preview @@ -102,7 +103,8 @@ object Rows { fun TextRow( text: String, modifier: Modifier = Modifier, - icon: ImageVector? = null + icon: ImageVector? = null, + foregroundTint: Color = MaterialTheme.colorScheme.onSurface ) { if (icon != null) { Row( @@ -113,14 +115,15 @@ object Rows { Icon( imageVector = icon, contentDescription = null, - tint = MaterialTheme.colorScheme.onSurface + tint = foregroundTint ) Spacer(modifier = Modifier.width(24.dp)) Text( text = text, - modifier = Modifier.weight(1f) + modifier = Modifier.weight(1f), + color = foregroundTint ) } } else {