diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/transfercontrols/TransferControlView.kt b/app/src/main/java/org/thoughtcrime/securesms/components/transfercontrols/TransferControlView.kt index 64e9d0ba0a..4ff7a7c2d1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/transfercontrols/TransferControlView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/transfercontrols/TransferControlView.kt @@ -4,15 +4,16 @@ */ package org.thoughtcrime.securesms.components.transfercontrols -import android.annotation.SuppressLint import android.content.Context import android.os.Build -import android.text.format.Formatter +import android.text.StaticLayout import android.util.AttributeSet import android.view.LayoutInflater import android.view.View +import android.view.ViewGroup import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.view.children +import androidx.core.view.updateLayoutParams import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode @@ -29,6 +30,8 @@ import org.thoughtcrime.securesms.util.ThrottledDebouncer import org.thoughtcrime.securesms.util.ViewUtil import org.thoughtcrime.securesms.util.visible import java.util.UUID +import kotlin.math.ceil +import kotlin.math.roundToInt class TransferControlView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : ConstraintLayout(context, attrs, defStyleAttr) { private val uuid = UUID.randomUUID().toString() @@ -236,11 +239,7 @@ class TransferControlView @JvmOverloads constructor(context: Context, attrs: Att } else { ViewUtil.dpToPx(PRIMARY_TEXT_OFFSET_DP).toFloat() } - val remainingSlides = currentState.slides.filterNot { it.transferState == AttachmentTable.TRANSFER_PROGRESS_DONE } - val downloadCount = remainingSlides.size - binding.primaryDetailsText.text = context.resources.getQuantityString(R.plurals.TransferControlView_n_items, downloadCount, downloadCount) - val byteCount = currentState.networkProgress.sumTotal() - currentState.networkProgress.sumCompleted() - binding.secondaryDetailsText.text = Formatter.formatShortFileSize(context, byteCount) + setSecondaryDetailsText(currentState) } private fun displayPendingGalleryWithPlayable(currentState: TransferControlViewState) { @@ -259,13 +258,12 @@ class TransferControlView @JvmOverloads constructor(context: Context, attrs: Att ) binding.secondaryProgressView.setStopped(false) + setSecondaryDetailsText(currentState) binding.secondaryDetailsText.translationX = if (ViewUtil.isLtr(this)) { ViewUtil.dpToPx(-SECONDARY_TEXT_OFFSET_DP).toFloat() } else { ViewUtil.dpToPx(SECONDARY_TEXT_OFFSET_DP).toFloat() } - val byteCount = currentState.networkProgress.sumTotal() - currentState.networkProgress.sumCompleted() - binding.secondaryDetailsText.text = Formatter.formatShortFileSize(context, byteCount) } private fun displayPendingSingleItem(currentState: TransferControlViewState) { @@ -278,9 +276,8 @@ class TransferControlView @JvmOverloads constructor(context: Context, attrs: Att secondaryProgressView = false, secondaryDetailsText = currentState.showSecondaryText ) - val byteCount = currentState.slides.sumOf { it.asAttachment().size } binding.secondaryDetailsText.translationX = 0f - binding.secondaryDetailsText.text = Formatter.formatShortFileSize(context, byteCount) + setSecondaryDetailsText(currentState) } private fun displayPendingPlayableVideo(currentState: TransferControlViewState) { @@ -300,13 +297,12 @@ class TransferControlView @JvmOverloads constructor(context: Context, attrs: Att secondaryDetailsText = currentState.showSecondaryText, secondaryProgressView = currentState.showSecondaryText ) + setSecondaryDetailsText(currentState) binding.secondaryDetailsText.translationX = if (ViewUtil.isLtr(this)) { ViewUtil.dpToPx(-SECONDARY_TEXT_OFFSET_DP).toFloat() } else { ViewUtil.dpToPx(SECONDARY_TEXT_OFFSET_DP).toFloat() } - val byteCount = currentState.slides.sumOf { it.asAttachment().size } - binding.secondaryDetailsText.text = Formatter.formatShortFileSize(context, byteCount) } private fun displayDownloadingGallery(currentState: TransferControlViewState) { @@ -326,7 +322,7 @@ class TransferControlView @JvmOverloads constructor(context: Context, attrs: Att binding.secondaryProgressView.setProgress(progress) } binding.secondaryDetailsText.translationX = 0f - binding.secondaryDetailsText.text = deriveSecondaryDetailsText(currentState) + setSecondaryDetailsText(currentState) } private fun displayDownloadingSingleItem(currentState: TransferControlViewState) { @@ -346,7 +342,7 @@ class TransferControlView @JvmOverloads constructor(context: Context, attrs: Att binding.primaryProgressView.setProgress(progress) } binding.secondaryDetailsText.translationX = 0f - binding.secondaryDetailsText.text = deriveSecondaryDetailsText(currentState) + setSecondaryDetailsText(currentState) } private fun displayDownloadingPlayableVideo(currentState: TransferControlViewState) { @@ -367,7 +363,7 @@ class TransferControlView @JvmOverloads constructor(context: Context, attrs: Att binding.secondaryProgressView.setProgress(progress) } binding.secondaryDetailsText.translationX = 0f - binding.secondaryDetailsText.text = deriveSecondaryDetailsText(currentState) + setSecondaryDetailsText(currentState) } private fun displayUploadingSingleItem(currentState: TransferControlViewState) { @@ -384,7 +380,7 @@ class TransferControlView @JvmOverloads constructor(context: Context, attrs: Att binding.secondaryProgressView.setProgress(progress) binding.secondaryDetailsText.translationX = 0f - binding.secondaryDetailsText.text = deriveSecondaryDetailsText(currentState) + setSecondaryDetailsText(currentState) } private fun displayUploadingGallery(currentState: TransferControlViewState) { @@ -400,7 +396,7 @@ class TransferControlView @JvmOverloads constructor(context: Context, attrs: Att binding.secondaryProgressView.setProgress(progress) binding.secondaryDetailsText.translationX = 0f - binding.secondaryDetailsText.text = deriveSecondaryDetailsText(currentState) + setSecondaryDetailsText(currentState) } private fun displayRetry(currentState: TransferControlViewState, isUploading: Boolean) { @@ -420,15 +416,15 @@ class TransferControlView @JvmOverloads constructor(context: Context, attrs: Att primaryDetailsText = false, secondaryDetailsText = currentState.showSecondaryText ) + binding.secondaryBackground.setOnClickListener(currentState.startTransferClickListener) + binding.secondaryDetailsText.setOnClickListener(currentState.startTransferClickListener) + binding.secondaryProgressView.setStopped(isUploading) + setSecondaryDetailsText(currentState) binding.secondaryDetailsText.translationX = if (ViewUtil.isLtr(this)) { ViewUtil.dpToPx(-RETRY_SECONDARY_TEXT_OFFSET_DP).toFloat() } else { ViewUtil.dpToPx(RETRY_SECONDARY_TEXT_OFFSET_DP).toFloat() } - binding.secondaryBackground.setOnClickListener(currentState.startTransferClickListener) - binding.secondaryDetailsText.setOnClickListener(currentState.startTransferClickListener) - binding.secondaryProgressView.setStopped(isUploading) - binding.secondaryDetailsText.text = resources.getString(R.string.NetworkFailure__retry) } private fun displayChildrenAsGone() { @@ -654,14 +650,62 @@ class TransferControlView @JvmOverloads constructor(context: Context, attrs: Att return weightedProgress / weightedTotal } - @SuppressLint("SetTextI18n") - private fun deriveSecondaryDetailsText(currentState: TransferControlViewState): String { - return if (currentState.networkProgress.sumCompleted() == 0L || isCompressing(currentState)) { - return context.getString(R.string.TransferControlView__processing) - } else { - val progressMiB = currentState.networkProgress.sumCompleted() / MEBIBYTE - val totalMiB = currentState.networkProgress.sumTotal() / MEBIBYTE - context.resources.getString(R.string.TransferControlView__download_progress, progressMiB, totalMiB) + private fun setSecondaryDetailsText(currentState: TransferControlViewState) { + when (deriveMode(currentState)) { + Mode.PENDING_GALLERY -> { + binding.secondaryDetailsText.updateLayoutParams { + width = ViewGroup.LayoutParams.WRAP_CONTENT + } + val remainingSlides = currentState.slides.filterNot { it.transferState == AttachmentTable.TRANSFER_PROGRESS_DONE } + val downloadCount = remainingSlides.size + binding.primaryDetailsText.text = context.resources.getQuantityString(R.plurals.TransferControlView_n_items, downloadCount, downloadCount) + val mebibyteCount = (currentState.networkProgress.sumTotal() - currentState.networkProgress.sumCompleted()) / MEBIBYTE + binding.secondaryDetailsText.text = context.getString(R.string.TransferControlView__filesize, mebibyteCount) + } + + Mode.PENDING_GALLERY_CONTAINS_PLAYABLE -> { + binding.secondaryDetailsText.updateLayoutParams { + width = ViewGroup.LayoutParams.WRAP_CONTENT + } + val mebibyteCount = (currentState.networkProgress.sumTotal() - currentState.networkProgress.sumCompleted()) / MEBIBYTE + binding.secondaryDetailsText.text = context.getString(R.string.TransferControlView__filesize, mebibyteCount) + } + + Mode.PENDING_SINGLE_ITEM, Mode.PENDING_VIDEO_PLAYABLE -> { + binding.secondaryDetailsText.updateLayoutParams { + width = ViewGroup.LayoutParams.WRAP_CONTENT + } + val mebibyteCount = (currentState.slides.sumOf { it.asAttachment().size }) / MEBIBYTE + binding.secondaryDetailsText.text = context.getString(R.string.TransferControlView__filesize, mebibyteCount) + } + + Mode.DOWNLOADING_GALLERY, Mode.DOWNLOADING_SINGLE_ITEM, Mode.DOWNLOADING_VIDEO_PLAYABLE, Mode.UPLOADING_GALLERY, Mode.UPLOADING_SINGLE_ITEM -> { + if (currentState.networkProgress.sumCompleted() == 0L || isCompressing(currentState)) { + binding.secondaryDetailsText.updateLayoutParams { + width = ViewGroup.LayoutParams.WRAP_CONTENT + } + binding.secondaryDetailsText.text = context.getString(R.string.TransferControlView__processing) + } else { + val progressMiB = currentState.networkProgress.sumCompleted() / MEBIBYTE + val totalMiB = currentState.networkProgress.sumTotal() / MEBIBYTE + val completedLabel = context.resources.getString(R.string.TransferControlView__download_progress, totalMiB, totalMiB) + val desiredWidth = StaticLayout.getDesiredWidth(completedLabel, binding.secondaryDetailsText.paint) + binding.secondaryDetailsText.text = context.resources.getString(R.string.TransferControlView__download_progress, progressMiB, totalMiB) + val roundedWidth = ceil(desiredWidth.toDouble()).roundToInt() + binding.secondaryDetailsText.compoundPaddingLeft + binding.secondaryDetailsText.compoundPaddingRight + binding.secondaryDetailsText.updateLayoutParams { + width = roundedWidth + } + } + } + + Mode.RETRY_DOWNLOADING, Mode.RETRY_UPLOADING -> { + binding.secondaryDetailsText.text = resources.getString(R.string.NetworkFailure__retry) + binding.secondaryDetailsText.updateLayoutParams { + width = ViewGroup.LayoutParams.WRAP_CONTENT + } + } + + Mode.GONE -> Unit } } diff --git a/app/src/main/res/layout/transfer_controls_view.xml b/app/src/main/res/layout/transfer_controls_view.xml index dde02b5a7b..ff4373c09f 100644 --- a/app/src/main/res/layout/transfer_controls_view.xml +++ b/app/src/main/res/layout/transfer_controls_view.xml @@ -57,13 +57,15 @@ android:layout_marginStart="@dimen/transfer_control_view_progressbar_to_textview_margin" android:layout_marginEnd="4dp" android:fontFamily="sans-serif-light" - android:gravity="center" + android:gravity="center_vertical|end" android:includeFontPadding="false" android:longClickable="false" + android:maxLines="1" android:paddingStart="4dp" android:paddingTop="2dp" android:paddingEnd="9dp" android:paddingBottom="2dp" + android:textAlignment="viewEnd" android:textColor="@color/signal_colorOnCustom" app:layout_constrainedWidth="true" app:layout_constraintStart_toEndOf="@+id/secondary_progress_view" diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6956ae0808..853e163540 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2423,6 +2423,8 @@ Processing… %1.1f MB/%2.1f MB + + %1.1f MB