@@ -3,44 +3,157 @@ package com.example.pdfviewer
33import android.os.Bundle
44import androidx.activity.ComponentActivity
55import androidx.activity.compose.setContent
6+ import androidx.compose.foundation.ExperimentalFoundationApi
67import androidx.compose.foundation.layout.fillMaxSize
8+ import androidx.compose.foundation.layout.fillMaxWidth
9+ import androidx.compose.foundation.layout.heightIn
710import androidx.compose.foundation.layout.padding
11+ import androidx.compose.material3.ExperimentalMaterial3Api
12+ import androidx.compose.material3.ModalBottomSheet
13+ import androidx.compose.material3.OutlinedButton
814import androidx.compose.material3.Scaffold
15+ import androidx.compose.material3.SheetState
916import androidx.compose.material3.Surface
1017import androidx.compose.material3.Text
18+ import androidx.compose.material3.rememberModalBottomSheetState
19+ import androidx.compose.runtime.Composable
20+ import androidx.compose.runtime.getValue
21+ import androidx.compose.runtime.mutableStateOf
22+ import androidx.compose.runtime.remember
23+ import androidx.compose.runtime.rememberCoroutineScope
24+ import androidx.compose.runtime.setValue
1125import androidx.compose.ui.Alignment
1226import androidx.compose.ui.Modifier
1327import androidx.compose.ui.graphics.Color
28+ import androidx.compose.ui.hapticfeedback.HapticFeedbackType
29+ import androidx.compose.ui.platform.LocalHapticFeedback
30+ import androidx.compose.ui.res.stringResource
31+ import androidx.compose.ui.text.style.TextAlign
32+ import androidx.compose.ui.unit.dp
1433import com.example.pdfviewer.ui.theme.PdfViewerTheme
1534import com.pnuema.android.pdfviewer.PdfViewer
35+ import kotlinx.coroutines.launch
36+ import com.pnuema.android.pdfviewer.rememberPdfOptions
1637
1738class MainActivity : ComponentActivity () {
39+ @OptIn(ExperimentalMaterial3Api ::class , ExperimentalFoundationApi ::class )
1840 override fun onCreate (savedInstanceState : Bundle ? ) {
1941 super .onCreate(savedInstanceState)
2042
2143 setContent {
2244 PdfViewerTheme {
23- // A surface container using the 'background' color from the theme
45+ val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true )
46+ val coroutineScope = rememberCoroutineScope()
47+ var showContextMenu by remember { mutableStateOf(false ) }
48+ val pdfOptions = rememberPdfOptions()
49+
2450 Scaffold { padding ->
2551 Surface (
2652 modifier = Modifier
2753 .fillMaxSize()
28- .padding(top = padding.calculateTopPadding() ),
54+ .padding(padding),
2955 color = Color .LightGray
3056 ) {
57+
58+ val haptics = LocalHapticFeedback .current
3159 PdfViewer (
3260 url = " https://raw.githubusercontent.com/barnhill/ComposePdfViewer/main/app/src/main/assets/sample.pdf" ,
61+ options = pdfOptions,
3362 loadingContent = {
3463 Text (
3564 modifier = Modifier .align(Alignment .Center ),
3665 text = " Loading..."
3766 )
67+ },
68+ onLongClick = {
69+ haptics.performHapticFeedback(HapticFeedbackType .LongPress )
70+ showContextMenu = ! sheetState.isVisible
71+ }
72+ )
73+ /* PdfViewer(
74+ file = FileUtil.getTestFile(this),
75+ options = pdfOptions,
76+ onLongClick = {
77+ haptics.performHapticFeedback(HapticFeedbackType.LongPress)
78+ showContextMenu = !sheetState.isVisible
79+ }
80+ )*/
81+ }
82+
83+ if (showContextMenu) {
84+ PdfOptionsMenu (
85+ sheetState = sheetState,
86+ onDismissRequest = { showContextMenu = false },
87+ onPrintClicked = {
88+ coroutineScope.launch {
89+ sheetState.hide()
90+ pdfOptions.print ()
91+ }.invokeOnCompletion {
92+ if (! sheetState.isVisible) {
93+ showContextMenu = false
94+ }
95+ }
96+ },
97+ onShareClicked = {
98+ coroutineScope.launch {
99+ sheetState.hide()
100+ pdfOptions.share()
101+ }.invokeOnCompletion {
102+ if (! sheetState.isVisible) {
103+ showContextMenu = false
104+ }
105+ }
38106 }
39107 )
40- /* PdfViewer(file = FileUtil.getTestFile(this))*/
41108 }
42109 }
43110 }
44111 }
45112 }
113+
114+ @OptIn(ExperimentalMaterial3Api ::class )
115+ @Composable
116+ private fun PdfOptionsMenu (
117+ modifier : Modifier = Modifier ,
118+ sheetState : SheetState ,
119+ onDismissRequest : () -> Unit ,
120+ onPrintClicked : () -> Unit ,
121+ onShareClicked : () -> Unit ,
122+ ) {
123+ ModalBottomSheet (
124+ modifier = modifier,
125+ sheetState = sheetState,
126+ onDismissRequest = onDismissRequest
127+ ) {
128+ OutlinedButton (
129+ modifier = Modifier
130+ .heightIn(48 .dp)
131+ .padding(horizontal = 16 .dp)
132+ .padding(top = 16 .dp)
133+ .fillMaxWidth(),
134+ onClick = onPrintClicked
135+ ) {
136+ Text (
137+ modifier = Modifier .fillMaxWidth(),
138+ textAlign = TextAlign .Center ,
139+ text = stringResource(R .string.print_button_label)
140+ )
141+ }
142+
143+ OutlinedButton (
144+ modifier = Modifier
145+ .heightIn(48 .dp)
146+ .padding(horizontal = 16 .dp)
147+ .padding(vertical = 16 .dp)
148+ .fillMaxWidth(),
149+ onClick = onShareClicked
150+ ) {
151+ Text (
152+ modifier = Modifier .fillMaxWidth(),
153+ textAlign = TextAlign .Center ,
154+ text = stringResource(R .string.share_button_label)
155+ )
156+ }
157+ }
158+ }
46159}
0 commit comments