Skip to content

Commit

Permalink
Zoom level is reset after editing annotation Closes #199,
Browse files Browse the repository at this point in the history
Making PdfAnnotationScreen, PdfAnnotationMoreScreen and PdfSettingsScreen to be regular views instead to avoid reinitializing pspdfkit’s PdfView after making annotation changes hence avoiding navigating away from a selected annotation

Upping versionCode to 123
  • Loading branch information
Dima-Android committed Dec 12, 2024
1 parent 084ce27 commit ca91c26
Show file tree
Hide file tree
Showing 15 changed files with 390 additions and 69 deletions.
26 changes: 10 additions & 16 deletions app/src/main/java/org/zotero/android/pdf/PdfReaderNavigation.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,12 @@ import androidx.navigation.NavType
import androidx.navigation.compose.composable
import androidx.navigation.navArgument
import org.zotero.android.androidx.content.longToast
import org.zotero.android.architecture.ScreenArguments
import org.zotero.android.architecture.navigation.ZoteroNavigation
import org.zotero.android.architecture.navigation.dialogFixedDimens
import org.zotero.android.pdf.annotation.PdfAnnotationNavigation
import org.zotero.android.pdf.annotation.pdfAnnotationNavScreens
import org.zotero.android.pdf.annotation.toPdfAnnotationScreen
import org.zotero.android.pdf.annotationmore.PdfAnnotationMoreNavigation
import org.zotero.android.pdf.annotationmore.pdfAnnotationMoreNavScreens
import org.zotero.android.pdf.annotationmore.toPdfAnnotationMoreScreen
import org.zotero.android.pdf.colorpicker.PdfReaderColorPickerScreen
import org.zotero.android.pdf.pdffilter.PdfFilterNavigation
Expand Down Expand Up @@ -57,23 +56,29 @@ internal fun NavGraphBuilder.pdfReaderScreenAndNavigationForTablet(
.width(420.dp),
route = PdfReaderDestinations.PDF_SETTINGS,
) {
PdfSettingsScreen(onBack = navigation::onBack)
PdfSettingsScreen(args = ScreenArguments.pdfSettingsArgs, onBack = navigation::onBack)
}
dialogFixedDimens(
modifier = Modifier
.height(500.dp)
.width(420.dp),
route = PdfReaderDestinations.PDF_ANNOTATION_NAVIGATION,
) {
PdfAnnotationNavigation()
PdfAnnotationNavigation(
args = ScreenArguments.pdfAnnotationArgs,
onBack = navigation::onBack
)
}
dialogFixedDimens(
modifier = Modifier
.height(500.dp)
.width(420.dp),
route = PdfReaderDestinations.PDF_ANNOTATION_MORE_NAVIGATION,
) {
PdfAnnotationMoreNavigation()
PdfAnnotationMoreNavigation(
args = ScreenArguments.pdfAnnotationMoreArgs,
onBack = navigation::onBack
)
}
dialogFixedDimens(
modifier = Modifier
Expand Down Expand Up @@ -102,20 +107,9 @@ internal fun NavGraphBuilder.pdfReaderNavScreensForPhone(
navigateToTagPicker = navigateToTagPicker,
)
pdfFilterNavScreens(navigation)
pdfSettings(navigation)
pdfPlainReader(navigation)
pdfColorPicker(navigation)
pdfAnnotationMoreNavScreens(navigation)
pdfAnnotationNavScreens(navigation)
}

private fun NavGraphBuilder.pdfSettings(navigation: ZoteroNavigation) {
composable(
route = PdfReaderDestinations.PDF_SETTINGS,
arguments = listOf(),
) {
PdfSettingsScreen(onBack = navigation::onBack)
}
}

private fun NavGraphBuilder.pdfPlainReader(navigation: ZoteroNavigation) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.zotero.android.pdf.annotation

import androidx.activity.compose.BackHandler
import androidx.activity.compose.LocalOnBackPressedDispatcherOwner
import androidx.compose.foundation.layout.navigationBarsPadding
import androidx.compose.runtime.Composable
Expand All @@ -9,41 +10,57 @@ import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import org.zotero.android.architecture.navigation.ZoteroNavigation
import org.zotero.android.pdf.annotation.data.PdfAnnotationArgs
import org.zotero.android.screens.tagpicker.TagPickerScreen
import org.zotero.android.uicomponents.navigation.ZoteroNavHost

@Composable
internal fun PdfAnnotationNavigation() {
internal fun PdfAnnotationNavigation(args: PdfAnnotationArgs, onBack: () -> Unit) {
val navController = rememberNavController()
val dispatcher = LocalOnBackPressedDispatcherOwner.current?.onBackPressedDispatcher
val navigation = remember(navController) {
ZoteroNavigation(navController, dispatcher)
}

BackHandler(onBack = {
onBack()
})
ZoteroNavHost(
navController = navController,
startDestination = PdfAnnotationDestinatiosn.PDF_ANNOTATION_SCREEN,
modifier = Modifier.navigationBarsPadding(), // do not draw behind nav bar
) {
pdfAnnotationNavScreens(navigation = navigation)
pdfAnnotationNavScreens(args = args, navigation = navigation)
}
}

internal fun NavGraphBuilder.pdfAnnotationNavScreens(
args: PdfAnnotationArgs,
navigation: ZoteroNavigation,
) {
pdfAnnotationScreen(onBack = navigation::onBack, navigateToTagPicker = navigation::toTagPicker)

pdfAnnotationScreen(
args = args,
onBack = navigation::onBack,
navigateToTagPicker = navigation::toTagPicker
)
tagPickerScreen(onBack = navigation::onBack)
}

private fun NavGraphBuilder.pdfAnnotationScreen(
args: PdfAnnotationArgs,
onBack: () -> Unit,
navigateToTagPicker: () -> Unit,
) {
composable(
route = PdfAnnotationDestinatiosn.PDF_ANNOTATION_SCREEN,
arguments = listOf(),
) {
PdfAnnotationScreen(onBack = onBack, navigateToTagPicker = navigateToTagPicker)
PdfAnnotationScreen(
args = args,
onBack = onBack,
navigateToTagPicker = navigateToTagPicker
)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import org.zotero.android.architecture.ui.CustomLayoutSize
import org.zotero.android.database.objects.AnnotationType
import org.zotero.android.pdf.annotation.data.PdfAnnotationArgs
import org.zotero.android.pdf.annotation.row.PdfAnnotationHeaderRow
import org.zotero.android.pdf.annotation.row.PdfAnnotationHighlightRow
import org.zotero.android.pdf.annotation.row.PdfAnnotationImageRow
Expand All @@ -35,10 +36,16 @@ import org.zotero.android.uicomponents.topbar.HeadingTextButton
@Composable
internal fun PdfAnnotationScreen(
viewModel: PdfAnnotationViewModel = hiltViewModel(),
args: PdfAnnotationArgs,
navigateToTagPicker: () -> Unit,
onBack: () -> Unit,
) {
viewModel.init()
val layoutType = CustomLayoutSize.calculateLayoutType()
val isTablet = layoutType.isTablet()
LaunchedEffect(args) {
viewModel.init(args = args, isTablet = isTablet)
}

viewModel.setOsTheme(isDark = isSystemInDarkTheme())
val viewState by viewModel.viewStates.observeAsState(PdfAnnotationViewState())
val viewEffect by viewModel.viewEffects.observeAsState()
Expand Down Expand Up @@ -83,7 +90,9 @@ internal fun PdfAnnotationPart(
annotation = annotation,
annotationColor = annotationColor,
layoutType = layoutType,
onBack = onBack,
onBack = {
viewModel.onDone()
},
)
if (annotation.type != AnnotationType.text) {
SidebarDivider(modifier = Modifier.fillMaxWidth())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import org.zotero.android.architecture.ScreenArguments
import org.zotero.android.architecture.ViewEffect
import org.zotero.android.architecture.ViewState
import org.zotero.android.database.objects.AnnotationsConfig
import org.zotero.android.pdf.annotation.data.PdfAnnotationArgs
import org.zotero.android.pdf.annotation.data.PdfAnnotationColorResult
import org.zotero.android.pdf.annotation.data.PdfAnnotationCommentResult
import org.zotero.android.pdf.annotation.data.PdfAnnotationDeleteResult
Expand All @@ -32,6 +33,9 @@ internal class PdfAnnotationViewModel @Inject constructor(
) : BaseViewModel2<PdfAnnotationViewState, PdfAnnotationViewEffect>(PdfAnnotationViewState()) {

private var isDeletingAnnotation = false
private lateinit var args: PdfAnnotationArgs
private var pdfReaderThemeCancellable: Job? = null
private var isTablet: Boolean = false

@Subscribe(threadMode = ThreadMode.MAIN)
fun onEvent(tagPickerResult: TagPickerResult) {
Expand All @@ -43,16 +47,16 @@ internal class PdfAnnotationViewModel @Inject constructor(
}
}

private var pdfReaderThemeCancellable: Job? = null

fun init() = initOnce {
fun init(args: PdfAnnotationArgs, isTablet: Boolean) = initOnce {
this.args = args
this.isTablet = isTablet
EventBus.getDefault().register(this)
updateState {
copy(isDark = pdfReaderCurrentThemeEventStream.currentValue()!!.isDark)
}
startObservingTheme()

val args = ScreenArguments.pdfAnnotationArgs
val annotation = args.selectedAnnotation!!

val colors = AnnotationsConfig.colors(annotation.type)
Expand Down Expand Up @@ -90,7 +94,6 @@ internal class PdfAnnotationViewModel @Inject constructor(
// }

val selected = viewState.tags.map { it.name }.toSet()
val args = ScreenArguments.pdfAnnotationArgs
ScreenArguments.tagPickerArgs = TagPickerArgs(
libraryId = args.library.identifier,
selectedTags = selected,
Expand All @@ -103,17 +106,21 @@ internal class PdfAnnotationViewModel @Inject constructor(

override fun onCleared() {
if (!isDeletingAnnotation) {
EventBus.getDefault().post(
PdfAnnotationCommentResult(
annotationKey = viewState.annotation!!.key,
comment = viewState.commentFocusText
)
)
postAnnotationCommentResult()
}
EventBus.getDefault().unregister(this)
super.onCleared()
}

private fun postAnnotationCommentResult() {
EventBus.getDefault().post(
PdfAnnotationCommentResult(
annotationKey = viewState.annotation!!.key,
comment = viewState.commentFocusText
)
)
}

fun onCommentTextChange(comment: String) {
updateState {
copy(commentFocusText = comment)
Expand Down Expand Up @@ -177,6 +184,13 @@ internal class PdfAnnotationViewModel @Inject constructor(
)
}

fun onDone() {
if (!isTablet) {
postAnnotationCommentResult()
}
triggerEffect(PdfAnnotationViewEffect.Back)
}

}

internal data class PdfAnnotationViewState(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package org.zotero.android.pdf.annotation.sidebar

import androidx.compose.animation.AnimatedContent
import androidx.compose.animation.AnimatedContentTransitionScope
import androidx.compose.animation.ContentTransform
import androidx.compose.animation.SizeTransform
import androidx.compose.animation.core.tween
import androidx.compose.animation.slideInHorizontally
import androidx.compose.animation.slideOutHorizontally
import androidx.compose.animation.with
import androidx.compose.foundation.background
import androidx.compose.foundation.gestures.detectTapGestures
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.unit.IntOffset
import org.zotero.android.pdf.annotation.PdfAnnotationNavigation
import org.zotero.android.pdf.reader.PdfReaderViewModel
import org.zotero.android.pdf.reader.PdfReaderViewState
import org.zotero.android.uicomponents.theme.CustomTheme

@Composable
internal fun PdfAnnotationNavigationView(
viewState: PdfReaderViewState,
viewModel: PdfReaderViewModel
) {
AnimatedContent(
targetState = viewState.pdfAnnotationArgs != null,
transitionSpec = {
createAnnotationTransitionSpec()
}, label = ""
) { showView ->
if (showView) {
Column(
modifier = Modifier
.fillMaxSize()
.background(CustomTheme.colors.pdfAnnotationsFormBackground)
.pointerInput(Unit) {
detectTapGestures {
//Prevent tap to be propagated to composables behind this screen.
}
}) {
val args = viewState.pdfAnnotationArgs
if (args != null) {
PdfAnnotationNavigation(
args = args,
onBack = viewModel::hidePdfAnnotationView
)
}
}
}
}
}

private fun AnimatedContentTransitionScope<Boolean>.createAnnotationTransitionSpec(): ContentTransform {
val intOffsetSpec = tween<IntOffset>()
return (slideInHorizontally(intOffsetSpec) { it } with
slideOutHorizontally(intOffsetSpec) { it }).using(
// Disable clipping since the faded slide-in/out should
// be displayed out of bounds.
SizeTransform(
clip = false,
sizeAnimationSpec = { _, _ -> tween() }
))
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.zotero.android.pdf.annotationmore

import androidx.activity.compose.BackHandler
import androidx.activity.compose.LocalOnBackPressedDispatcherOwner
import androidx.compose.foundation.layout.navigationBarsPadding
import androidx.compose.runtime.Composable
Expand All @@ -9,41 +10,55 @@ import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import org.zotero.android.architecture.navigation.ZoteroNavigation
import org.zotero.android.pdf.annotationmore.data.PdfAnnotationMoreArgs
import org.zotero.android.pdf.annotationmore.editpage.PdfAnnotationEditPageScreen
import org.zotero.android.uicomponents.navigation.ZoteroNavHost

@Composable
internal fun PdfAnnotationMoreNavigation() {
internal fun PdfAnnotationMoreNavigation(args: PdfAnnotationMoreArgs, onBack: () -> Unit) {
val navController = rememberNavController()
val dispatcher = LocalOnBackPressedDispatcherOwner.current?.onBackPressedDispatcher
val navigation = remember(navController) {
ZoteroNavigation(navController, dispatcher)
}
BackHandler(onBack = {
onBack()
})
ZoteroNavHost(
navController = navController,
startDestination = PdfAnnotationMoreDestination.PDF_ANNOTATION_MORE_SCREEN,
modifier = Modifier.navigationBarsPadding(), // do not draw behind nav bar
) {
pdfAnnotationMoreNavScreens(navigation = navigation)
pdfAnnotationMoreNavScreens(args = args, navigation = navigation)
}
}

internal fun NavGraphBuilder.pdfAnnotationMoreNavScreens(
args: PdfAnnotationMoreArgs,
navigation: ZoteroNavigation,
) {
pdfAnnotationMoreScreen(onBack = navigation::onBack, navigateToPageEdit = navigation::toPageEdit)
pdfAnnotationMoreScreen(
args = args,
onBack = navigation::onBack,
navigateToPageEdit = navigation::toPageEdit
)
pageEditScreen(onBack = navigation::onBack)
}

private fun NavGraphBuilder.pdfAnnotationMoreScreen(
args: PdfAnnotationMoreArgs,
onBack: () -> Unit,
navigateToPageEdit: () -> Unit,
) {
composable(
route = PdfAnnotationMoreDestination.PDF_ANNOTATION_MORE_SCREEN,
arguments = listOf(),
) {
PdfAnnotationMoreScreen(onBack = onBack, navigateToPageEdit = navigateToPageEdit)
PdfAnnotationMoreScreen(
args = args,
onBack = onBack,
navigateToPageEdit = navigateToPageEdit
)
}
}

Expand Down
Loading

0 comments on commit ca91c26

Please sign in to comment.