22
33package org.schabi.newpipe.ui.components.menu
44
5+ import android.content.Context
56import android.content.res.Configuration
67import androidx.compose.foundation.basicMarquee
8+ import androidx.compose.foundation.clickable
79import androidx.compose.foundation.layout.Arrangement
810import androidx.compose.foundation.layout.Box
911import androidx.compose.foundation.layout.BoxWithConstraints
@@ -57,9 +59,12 @@ import androidx.compose.ui.graphics.vector.ImageVector
5759import androidx.compose.ui.platform.LocalContext
5860import androidx.compose.ui.res.painterResource
5961import androidx.compose.ui.res.stringResource
60- import androidx.compose.ui.semantics.contentDescription
61- import androidx.compose.ui.semantics.semantics
62+ import androidx.compose.ui.text.SpanStyle
63+ import androidx.compose.ui.text.buildAnnotatedString
64+ import androidx.compose.ui.text.font.FontWeight
6265import androidx.compose.ui.text.style.TextAlign
66+ import androidx.compose.ui.text.style.TextDecoration
67+ import androidx.compose.ui.text.withStyle
6368import androidx.compose.ui.tooling.preview.Preview
6469import androidx.compose.ui.tooling.preview.PreviewParameter
6570import androidx.compose.ui.tooling.preview.datasource.CollectionPreviewParameterProvider
@@ -72,6 +77,7 @@ import org.schabi.newpipe.R
7277import org.schabi.newpipe.player.playqueue.PlayQueue
7378import org.schabi.newpipe.player.playqueue.SinglePlayQueue
7479import org.schabi.newpipe.ui.theme.AppTheme
80+ import org.schabi.newpipe.ui.theme.customColors
7581import org.schabi.newpipe.util.Either
7682import org.schabi.newpipe.util.Localization
7783import java.time.OffsetDateTime
@@ -346,27 +352,78 @@ fun LongPressMenuHeader(
346352 modifier = Modifier .basicMarquee(iterations = Int .MAX_VALUE ),
347353 )
348354
349- val subtitle = Localization .concatenateStrings(
350- item.uploader,
351- item.uploadDate?.match<String >(
352- { it },
353- { Localization .relativeTime(it) }
354- ),
355- item.viewCount?.let { Localization .localizeViewCount(ctx, it) }
355+ val subtitle = getSubtitleAnnotatedString(
356+ item = item,
357+ linkColor = MaterialTheme .customColors.onSurfaceVariantLink,
358+ ctx = ctx,
356359 )
357360 if (subtitle.isNotBlank()) {
358361 Spacer (Modifier .height(1 .dp))
362+
359363 Text (
360364 text = subtitle,
361365 style = MaterialTheme .typography.bodyMedium,
362- modifier = Modifier .basicMarquee(iterations = Int .MAX_VALUE ),
366+ modifier = if (item.uploaderUrl.isNullOrBlank()) {
367+ Modifier
368+ } else {
369+ Modifier .clickable {
370+ // TODO handle click on uploader URL
371+ }
372+ }.basicMarquee(iterations = Int .MAX_VALUE )
363373 )
364374 }
365375 }
366376 }
367377 }
368378}
369379
380+ fun getSubtitleAnnotatedString (
381+ item : LongPressable ,
382+ linkColor : Color ,
383+ ctx : Context ,
384+ ) = buildAnnotatedString {
385+ var shouldAddSeparator = false
386+ if (! item.uploaderUrl.isNullOrBlank()) {
387+ withStyle(
388+ SpanStyle (
389+ fontWeight = FontWeight .Bold ,
390+ color = linkColor,
391+ textDecoration = TextDecoration .Underline
392+ )
393+ ) {
394+ if (item.uploader.isNullOrBlank()) {
395+ append(ctx.getString(R .string.show_channel_details))
396+ } else {
397+ append(item.uploader)
398+ }
399+ }
400+ shouldAddSeparator = true
401+ } else if (! item.uploader.isNullOrBlank()) {
402+ append(item.uploader)
403+ shouldAddSeparator = true
404+ }
405+
406+ val uploadDate = item.uploadDate?.match<String >(
407+ { it },
408+ { Localization .relativeTime(it) }
409+ )
410+ if (! uploadDate.isNullOrBlank()) {
411+ if (shouldAddSeparator) {
412+ append(Localization .DOT_SEPARATOR )
413+ }
414+ shouldAddSeparator = true
415+ append(uploadDate)
416+ }
417+
418+ val viewCount = item.viewCount?.let { Localization .localizeViewCount(ctx, it) }
419+ if (! viewCount.isNullOrBlank()) {
420+ if (shouldAddSeparator) {
421+ append(Localization .DOT_SEPARATOR )
422+ }
423+ append(viewCount)
424+ }
425+ }
426+
370427@Composable
371428fun LongPressMenuButton (
372429 icon : ImageVector ,
0 commit comments