diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/PollComponent.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/PollComponent.kt index 22682c51da..bbd637b5cf 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/PollComponent.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/PollComponent.kt @@ -24,7 +24,6 @@ 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.wrapContentHeight import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.CircularProgressIndicator @@ -45,14 +44,15 @@ import androidx.compose.ui.platform.LocalHapticFeedback import androidx.compose.ui.res.colorResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.vectorResource -import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp import org.signal.core.ui.compose.Buttons import org.signal.core.ui.compose.DayNightPreviews import org.signal.core.ui.compose.Previews import org.signal.core.ui.compose.theme.SignalTheme import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.components.compose.RoundCheckbox +import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.polls.PollOption import org.thoughtcrime.securesms.polls.PollRecord import org.thoughtcrime.securesms.polls.VoteState @@ -79,7 +79,8 @@ fun setContent( poll = poll, onViewVotes = onViewVotes, onToggleVote = onToggleVote, - pollColors = if (isOutgoing) PollColorsType.Outgoing.getColors(chatColor) else PollColorsType.Incoming.getColors(-1) + pollColors = if (isOutgoing) PollColorsType.Outgoing.getColors(chatColor) else PollColorsType.Incoming.getColors(-1), + fontSize = SignalStore.settings.messageFontSize ) } } @@ -90,7 +91,8 @@ private fun Poll( poll: PollRecord, onViewVotes: () -> Unit = {}, onToggleVote: (PollOption, Boolean) -> Unit = { _, _ -> }, - pollColors: PollColors = PollColorsType.Incoming.getColors(-1) + pollColors: PollColors = PollColorsType.Incoming.getColors(-1), + fontSize: Int = 16 ) { val totalVotes = remember(poll.pollOptions) { poll.pollOptions.sumOf { it.voters.size } } val caption = when { @@ -105,32 +107,38 @@ private fun Poll( Text( text = stringResource(caption), color = pollColors.caption, - style = MaterialTheme.typography.bodySmall, + style = MaterialTheme.typography.bodySmall.copy(fontSize = (fontSize * .8).sp), modifier = Modifier.padding(start = 12.dp, bottom = 4.dp) ) poll.pollOptions.forEach { - PollOption(it, totalVotes, poll.hasEnded, onToggleVote, pollColors) + PollOption(it, totalVotes, poll.hasEnded, onToggleVote, pollColors, fontSize) } Spacer(Modifier.size(16.dp)) - if (totalVotes == 0) { + val hasVotes = totalVotes > 0 + Buttons.MediumTonal( + colors = ButtonDefaults.buttonColors( + containerColor = pollColors.buttonBackground, + contentColor = pollColors.button, + disabledContainerColor = Color.Transparent, + disabledContentColor = pollColors.text + ), + onClick = onViewVotes, + enabled = hasVotes, + modifier = Modifier.align(Alignment.CenterHorizontally) + ) { Text( - text = stringResource(R.string.Poll__no_votes), - style = MaterialTheme.typography.labelLarge, - modifier = Modifier.align(Alignment.CenterHorizontally).height(40.dp).wrapContentHeight(align = Alignment.CenterVertically), - textAlign = TextAlign.Center, - color = pollColors.text + text = if (!hasVotes) { + stringResource(R.string.Poll__no_votes) + } else if (poll.hasEnded) { + stringResource(R.string.Poll__view_results) + } else { + stringResource(R.string.Poll__view_votes) + }, + style = MaterialTheme.typography.labelLarge.copy(fontSize = (fontSize * .8).sp) ) - } else { - Buttons.MediumTonal( - colors = ButtonDefaults.buttonColors(containerColor = pollColors.buttonBackground, contentColor = pollColors.button), - onClick = onViewVotes, - modifier = Modifier.align(Alignment.CenterHorizontally).height(40.dp) - ) { - Text(stringResource(if (poll.hasEnded) R.string.Poll__view_results else R.string.Poll__view_votes)) - } } Spacer(Modifier.size(4.dp)) } @@ -142,7 +150,8 @@ private fun PollOption( totalVotes: Int, hasEnded: Boolean, onToggleVote: (PollOption, Boolean) -> Unit = { _, _ -> }, - pollColors: PollColors + pollColors: PollColors, + fontSize: Int ) { val context = LocalContext.current val haptics = LocalHapticFeedback.current @@ -238,7 +247,7 @@ private fun PollOption( Row(verticalAlignment = Alignment.Bottom) { Text( text = option.text, - style = MaterialTheme.typography.bodyLarge, + style = MaterialTheme.typography.bodyLarge.copy(fontSize = fontSize.sp), modifier = Modifier.padding(end = 24.dp).weight(1f), color = pollColors.text ) @@ -260,13 +269,13 @@ private fun PollOption( Text( text = size.toString(), color = pollColors.text, - style = MaterialTheme.typography.bodyMedium + style = MaterialTheme.typography.bodyMedium.copy(fontSize = (fontSize * .8).sp) ) } } Box( - modifier = Modifier.height(8.dp).padding(top = 4.dp).fillMaxWidth() + modifier = Modifier.padding(top = 4.dp).height(8.dp).fillMaxWidth() .background( color = pollColors.progressBackground, shape = RoundedCornerShape(18.dp) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt index 4b7df20a60..7f4a3d210f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt @@ -12,6 +12,7 @@ import android.app.PendingIntent import android.content.ActivityNotFoundException import android.content.BroadcastReceiver import android.content.Context +import android.content.DialogInterface import android.content.Intent import android.content.IntentFilter import android.content.res.Configuration @@ -2568,8 +2569,14 @@ class ConversationFragment : disposables += endPoll .subscribeBy( - // TODO(michelle): Error state when poll terminate fails - onError = { Log.w(TAG, "Error received during poll end!", it) } + onError = { + Log.w(TAG, "Error received during poll end!", it) + MaterialAlertDialogBuilder(requireContext()) + .setTitle(R.string.Poll__couldnt_end_poll) + .setMessage(getString(R.string.Poll__check_connection)) + .setPositiveButton(android.R.string.ok) { dialog: DialogInterface?, which: Int -> dialog!!.dismiss() } + .show() + } ) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationViewModel.kt index ff068fed70..f4deebb47a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationViewModel.kt @@ -92,6 +92,7 @@ import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.sms.MessageSender import org.thoughtcrime.securesms.util.BubbleUtil import org.thoughtcrime.securesms.util.ConversationUtil +import org.thoughtcrime.securesms.util.NetworkUtil import org.thoughtcrime.securesms.util.TextSecurePreferences import org.thoughtcrime.securesms.util.hasGiftBadge import org.thoughtcrime.securesms.util.rx.RxStore @@ -516,9 +517,13 @@ class ConversationViewModel( } fun endPoll(pollId: Long): Completable { - return repository - .endPoll(pollId) - .observeOn(AndroidSchedulers.mainThread()) + return if (!NetworkUtil.isConnected(AppDependencies.application)) { + Completable.error(Exception("Connection required to end poll")) + } else { + repository + .endPoll(pollId) + .observeOn(AndroidSchedulers.mainThread()) + } } fun sendMessage( diff --git a/app/src/main/res/layout/conversation_item_received_multimedia.xml b/app/src/main/res/layout/conversation_item_received_multimedia.xml index a3e9927981..666ad9c841 100644 --- a/app/src/main/res/layout/conversation_item_received_multimedia.xml +++ b/app/src/main/res/layout/conversation_item_received_multimedia.xml @@ -235,6 +235,7 @@ android:id="@+id/poll" android:layout_width="@dimen/media_bubble_max_width" android:layout_height="wrap_content" + android:layout_marginTop="-4dp" android:layout="@layout/conversation_item_poll" /> End poll See all + + Couldn\'t end poll + + Check your connection and try again. New poll