|
|
|
@ -28,13 +28,19 @@ import androidx.compose.ui.graphics.Color
@@ -28,13 +28,19 @@ import androidx.compose.ui.graphics.Color
|
|
|
|
|
import androidx.compose.ui.graphics.asImageBitmap |
|
|
|
|
import androidx.compose.ui.layout.ContentScale |
|
|
|
|
import androidx.compose.ui.res.stringResource |
|
|
|
|
import androidx.compose.ui.text.style.TextAlign |
|
|
|
|
import androidx.compose.ui.unit.dp |
|
|
|
|
import io.element.android.compound.theme.ElementTheme |
|
|
|
|
import io.element.android.libraries.architecture.AsyncData |
|
|
|
|
import io.element.android.libraries.designsystem.preview.ElementPreview |
|
|
|
|
import io.element.android.libraries.designsystem.preview.PreviewsDayNight |
|
|
|
|
import io.element.android.libraries.designsystem.text.roundToPx |
|
|
|
|
import io.element.android.libraries.designsystem.text.toDp |
|
|
|
|
import io.element.android.libraries.designsystem.theme.components.Text |
|
|
|
|
import io.element.android.libraries.ui.strings.CommonStrings |
|
|
|
|
import kotlinx.collections.immutable.ImmutableList |
|
|
|
|
import kotlinx.collections.immutable.toImmutableList |
|
|
|
|
import me.saket.telephoto.zoomable.zoomable |
|
|
|
|
import java.io.IOException |
|
|
|
|
|
|
|
|
|
@Composable |
|
|
|
|
fun PdfViewer( |
|
|
|
@ -59,7 +65,7 @@ fun PdfViewer(
@@ -59,7 +65,7 @@ fun PdfViewer(
|
|
|
|
|
} |
|
|
|
|
val pdfPages = pdfViewerState.getPages() |
|
|
|
|
PdfPagesView( |
|
|
|
|
pdfPages = pdfPages.toImmutableList(), |
|
|
|
|
pdfPages = pdfPages, |
|
|
|
|
lazyListState = pdfViewerState.lazyListState, |
|
|
|
|
) |
|
|
|
|
} |
|
|
|
@ -67,6 +73,48 @@ fun PdfViewer(
@@ -67,6 +73,48 @@ fun PdfViewer(
|
|
|
|
|
|
|
|
|
|
@Composable |
|
|
|
|
private fun PdfPagesView( |
|
|
|
|
pdfPages: AsyncData<ImmutableList<PdfPage>>, |
|
|
|
|
lazyListState: LazyListState, |
|
|
|
|
modifier: Modifier = Modifier, |
|
|
|
|
) { |
|
|
|
|
when (pdfPages) { |
|
|
|
|
is AsyncData.Uninitialized, |
|
|
|
|
is AsyncData.Loading -> Unit |
|
|
|
|
is AsyncData.Failure -> PdfPagesErrorView( |
|
|
|
|
pdfPages.error, |
|
|
|
|
modifier, |
|
|
|
|
) |
|
|
|
|
is AsyncData.Success -> PdfPagesContentView( |
|
|
|
|
pdfPages = pdfPages.data, |
|
|
|
|
lazyListState = lazyListState, |
|
|
|
|
modifier = modifier |
|
|
|
|
) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Composable |
|
|
|
|
fun PdfPagesErrorView( |
|
|
|
|
error: Throwable, |
|
|
|
|
modifier: Modifier = Modifier, |
|
|
|
|
) { |
|
|
|
|
Box( |
|
|
|
|
modifier = modifier.fillMaxSize(), |
|
|
|
|
contentAlignment = Alignment.Center, |
|
|
|
|
) { |
|
|
|
|
Text( |
|
|
|
|
text = buildString { |
|
|
|
|
append(stringResource(id = CommonStrings.error_unknown)) |
|
|
|
|
append("\n\n") |
|
|
|
|
append(error.localizedMessage) |
|
|
|
|
}, |
|
|
|
|
textAlign = TextAlign.Center, |
|
|
|
|
style = ElementTheme.typography.fontBodyLgRegular, |
|
|
|
|
) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Composable |
|
|
|
|
private fun PdfPagesContentView( |
|
|
|
|
pdfPages: ImmutableList<PdfPage>, |
|
|
|
|
lazyListState: LazyListState, |
|
|
|
|
modifier: Modifier = Modifier, |
|
|
|
@ -117,3 +165,11 @@ private fun PdfPageView(
@@ -117,3 +165,11 @@ private fun PdfPageView(
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@PreviewsDayNight |
|
|
|
|
@Composable |
|
|
|
|
internal fun PdfPagesErrorViewPreview() = ElementPreview { |
|
|
|
|
PdfPagesErrorView( |
|
|
|
|
error = IOException("file not in PDF format or corrupted"), |
|
|
|
|
) |
|
|
|
|
} |
|
|
|
|