Skip to content

Commit

Permalink
Retrieve Metadata Functionality
Browse files Browse the repository at this point in the history
  • Loading branch information
Dima-Android committed Feb 10, 2025
1 parent b379cca commit d413903
Show file tree
Hide file tree
Showing 50 changed files with 2,531 additions and 127 deletions.
6 changes: 6 additions & 0 deletions .github/workflows/android.yml
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,12 @@ jobs:
- name: Execute bundle_translation.py
run: python3 scripts/bundle_translation.py

- name: Grant execute permission for bundle_pdf-worker.py
run: chmod +x scripts/bundle_pdf-worker.py

- name: Execute bundle_pdf-worker.py
run: python3 scripts/bundle_pdf-worker.py

- name: Grant execute permission for gradlew
run: chmod +x gradlew

Expand Down
8 changes: 8 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -56,3 +56,11 @@ buildSrc/gradle/
app/src/main/assets/translators/
app/src/main/assets/translation_commit_hash.txt
app/src/main/assets/translator.zip

#pdf-worker generated files:
app/src/main/assets/pdf-worker_commit_hash.txt
app/src/main/assets/pdf-worker.zip

/pdf-worker/cmaps/
/pdf-worker/standard_fonts/
/pdf-worker/worker.js
2 changes: 1 addition & 1 deletion app/src/main/assets/timestamp.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1715335209
1738586822
9 changes: 9 additions & 0 deletions app/src/main/java/org/zotero/android/architecture/Defaults.kt
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ open class Defaults @Inject constructor(
private val lastTranslatorCommitHash = "lastTranslatorCommitHash"
private val lastTranslatorDeleted = "lastTranslatorDeleted"
private val lastStylesCommitHash = "lastStylesCommitHash"
private val lastPdfWorkerCommitHash = "lastPdfWorkerCommitHash"

private val isWebDavEnabled = "isWebDavEnabled"
private val webDavVerified = "webDavVerified"
Expand Down Expand Up @@ -395,6 +396,14 @@ open class Defaults @Inject constructor(
return sharedPreferences.getInt(performFullSyncGuardKey, 1)
}

fun getLastPdfWorkerCommitHash(): String {
return sharedPreferences.getString(lastPdfWorkerCommitHash, "") ?: ""
}

fun setLastPdfWorkerCommitHash(newValue: String) {
sharedPreferences.edit { putString(lastPdfWorkerCommitHash, newValue) }
}

fun reset() {
setUsername("")
setDisplayName("")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,12 @@ import org.zotero.android.screens.libraries.LibrariesScreen
import org.zotero.android.screens.loading.LoadingScreen
import org.zotero.android.screens.mediaviewer.image.ImageViewerScreen
import org.zotero.android.screens.mediaviewer.video.VideoPlayerView
import org.zotero.android.screens.retrievemetadata.RetrieveMetadataScreen
import org.zotero.android.screens.webview.ZoteroWebViewScreen
import java.io.File

internal const val ARG_ITEM_DETAILS_SCREEN = "itemDetailsArgs"
internal const val ARG_RETRIEVE_METADATA = "retrieveMetadataArgs"

fun NavGraphBuilder.allItemsScreen(
navigateToCollectionsScreen: () -> Unit,
Expand All @@ -27,6 +29,7 @@ fun NavGraphBuilder.allItemsScreen(
navigateToSinglePicker: () -> Unit,
navigateToAllItemsSort: () -> Unit,
navigateToAddByIdentifier: (addByIdentifierParams: String) -> Unit,
navigateToRetrieveMetadata: (params: String) -> Unit,
navigateToVideoPlayerScreen: () -> Unit,
navigateToImageViewerScreen: () -> Unit,
navigateToZoterWebViewScreen: (String) -> Unit,
Expand Down Expand Up @@ -59,6 +62,7 @@ fun NavGraphBuilder.allItemsScreen(
navigateToTagFilter = navigateToTagFilter,
navigateToCollectionPicker = navigateToCollectionPicker,
navigateToScanBarcode = navigateToScanBarcode,
navigateToRetrieveMetadata = navigateToRetrieveMetadata,
)
}
}
Expand Down Expand Up @@ -191,6 +195,17 @@ fun NavGraphBuilder.collectionsScreen(
}
}

fun NavGraphBuilder.retrieveMetadataScreen() {
dialogFixedMaxHeight(
route = "${CommonScreenDestinations.RETRIEVE_METADATA_SCREEN}/{$ARG_RETRIEVE_METADATA}",
arguments = listOf(
navArgument(ARG_RETRIEVE_METADATA) { type = NavType.StringType },
),
) {
RetrieveMetadataScreen()
}
}

object CommonScreenDestinations {
const val LOADING = "loading"
const val LIBRARIES_SCREEN = "librariesScreen"
Expand All @@ -202,6 +217,7 @@ object CommonScreenDestinations {
const val IMAGE_VIEWER_SCREEN = "imageViewerScreen"
const val COLLECTIONS_SCREEN = "collectionsScreen"
const val ZOTERO_WEB_VIEW_SCREEN = "zoteroWebViewScreen"
const val RETRIEVE_METADATA_SCREEN = "retrieveMetadataScreen"
}


Expand All @@ -225,4 +241,8 @@ fun ZoteroNavigation.toZoteroWebViewScreen(encodedUrl: String) {
navController.navigate(
"${CommonScreenDestinations.ZOTERO_WEB_VIEW_SCREEN}/$encodedUrl"
)
}

fun ZoteroNavigation.toRetrieveMetadata(args: String) {
navController.navigate("${CommonScreenDestinations.RETRIEVE_METADATA_SCREEN}/$args")
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,12 @@ fun NavGraphBuilder.dialogFixedMaxHeight(

fun NavGraphBuilder.dialogDynamicHeight(
route: String,
arguments: List<NamedNavArgument> = emptyList(),
content: @Composable () -> Unit,
) {
customDialog(
route = route,
arguments = arguments,
dialogModifier = Modifier.fillMaxHeight(0.8f),
content = content
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,11 @@ import org.zotero.android.architecture.navigation.imageViewerScreen
import org.zotero.android.architecture.navigation.itemDetailsScreen
import org.zotero.android.architecture.navigation.librariesScreen
import org.zotero.android.architecture.navigation.loadingScreen
import org.zotero.android.architecture.navigation.retrieveMetadataScreen
import org.zotero.android.architecture.navigation.toAddOrEditNote
import org.zotero.android.architecture.navigation.toImageViewerScreen
import org.zotero.android.architecture.navigation.toItemDetails
import org.zotero.android.architecture.navigation.toRetrieveMetadata
import org.zotero.android.architecture.navigation.toVideoPlayerScreen
import org.zotero.android.architecture.navigation.toZoteroWebViewScreen
import org.zotero.android.architecture.navigation.toolbar.SyncToolbarScreen
Expand All @@ -40,6 +42,7 @@ import org.zotero.android.architecture.navigation.zoterWebViewScreen
import org.zotero.android.architecture.ui.CustomLayoutSize
import org.zotero.android.pdf.pdfReaderNavScreensForPhone
import org.zotero.android.pdf.toPdfScreen
import org.zotero.android.screens.addbyidentifier.ui.AddByIdentifierScreen
import org.zotero.android.screens.collectionedit.collectionEditNavScreens
import org.zotero.android.screens.collectionedit.toCollectionEditScreen
import org.zotero.android.screens.collectionpicker.CollectionPickerScreen
Expand All @@ -55,7 +58,6 @@ import org.zotero.android.screens.settings.toSettingsScreen
import org.zotero.android.screens.sortpicker.sortPickerNavScreens
import org.zotero.android.screens.sortpicker.toSortPicker
import org.zotero.android.screens.tagpicker.TagPickerScreen
import org.zotero.android.screens.addbyidentifier.ui.AddByIdentifierScreen
import org.zotero.android.uicomponents.navigation.ZoteroNavHost
import org.zotero.android.uicomponents.singlepicker.SinglePickerScreen
import org.zotero.android.uicomponents.theme.CustomTheme
Expand Down Expand Up @@ -134,6 +136,7 @@ internal fun DashboardRootPhoneNavigation(
navigateToVideoPlayerScreen = navigation::toVideoPlayerScreen,
navigateToImageViewerScreen = navigation::toImageViewerScreen,
navigateToZoterWebViewScreen = navigation::toZoteroWebViewScreen,
navigateToRetrieveMetadata = navigation::toRetrieveMetadata,
navigateToTagFilter = navigation::toTagFilter,
navigateToAddByIdentifier = navigation::toAddByIdentifier,
navigateToCollectionPicker = navigation::toCollectionPicker,
Expand Down Expand Up @@ -234,6 +237,7 @@ internal fun DashboardRootPhoneNavigation(
navigateToTagPicker = navigation::toTagPicker
)
zoterWebViewScreen(onClose = navigation::onBack)
retrieveMetadataScreen()
}
}
DashboardTopLevelDialogs(viewState = viewState, viewModel = viewModel)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ internal fun DashboardRootTabletNavigationScreen(
onShowPdf: (String) -> Unit,
toAddOrEditNote: () -> Unit,
toZoteroWebViewScreen: (String) -> Unit,
navigateToRetrieveMetadata: (params: String) -> Unit,
viewModel: DashboardViewModel,
) {
val viewState by viewModel.viewStates.observeAsState(DashboardViewState())
Expand Down Expand Up @@ -81,6 +82,7 @@ internal fun DashboardRootTabletNavigationScreen(
onOpenWebpage = onOpenWebpage,
toAddOrEditNote = toAddOrEditNote,
toZoteroWebViewScreen = toZoteroWebViewScreen,
navigateToRetrieveMetadata = navigateToRetrieveMetadata,
navController = rightPaneNavController,
navigation = rightPaneNavigation
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,9 @@ import org.zotero.android.architecture.EventBusConstants
import org.zotero.android.architecture.navigation.ZoteroNavigation
import org.zotero.android.architecture.navigation.addNoteScreen
import org.zotero.android.architecture.navigation.dialogDynamicHeight
import org.zotero.android.architecture.navigation.retrieveMetadataScreen
import org.zotero.android.architecture.navigation.toAddOrEditNote
import org.zotero.android.architecture.navigation.toRetrieveMetadata
import org.zotero.android.architecture.navigation.toZoteroWebViewScreen
import org.zotero.android.architecture.navigation.zoterWebViewScreen
import org.zotero.android.pdf.pdfReaderScreenAndNavigationForTablet
Expand Down Expand Up @@ -59,6 +61,7 @@ internal fun DashboardRootTopLevelTabletNavigation(
},
toAddOrEditNote = navigation::toAddOrEditNote,
toZoteroWebViewScreen = navigation::toZoteroWebViewScreen,
navigateToRetrieveMetadata = navigation::toRetrieveMetadata
)
pdfReaderScreenAndNavigationForTablet(
navigation = navigation,
Expand All @@ -71,6 +74,7 @@ internal fun DashboardRootTopLevelTabletNavigation(
navigateToTagPicker = navigation::toTagPickerScreen
)
zoterWebViewScreen(onClose = navigation::onBack)
retrieveMetadataScreen()
}
}

Expand All @@ -80,6 +84,7 @@ private fun NavGraphBuilder.dashboardScreen(
onShowPdf: (String) -> Unit,
toAddOrEditNote: () -> Unit,
toZoteroWebViewScreen: (String) -> Unit,
navigateToRetrieveMetadata: (params: String) -> Unit,
onOpenWebpage: (uri: Uri) -> Unit,
viewModel: DashboardViewModel,
) {
Expand All @@ -93,6 +98,7 @@ private fun NavGraphBuilder.dashboardScreen(
onShowPdf = onShowPdf,
toAddOrEditNote = toAddOrEditNote,
toZoteroWebViewScreen = toZoteroWebViewScreen,
navigateToRetrieveMetadata = navigateToRetrieveMetadata,
onOpenWebpage = onOpenWebpage,
viewModel = viewModel
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,12 @@ import org.zotero.android.architecture.navigation.toImageViewerScreen
import org.zotero.android.architecture.navigation.toItemDetails
import org.zotero.android.architecture.navigation.toVideoPlayerScreen
import org.zotero.android.architecture.navigation.videoPlayerScreen
import org.zotero.android.screens.addbyidentifier.ui.AddByIdentifierScreen
import org.zotero.android.screens.collectionpicker.CollectionPickerScreen
import org.zotero.android.screens.creatoredit.CreatorEditNavigation
import org.zotero.android.screens.scanbarcode.ui.ScanBarcodeScreen
import org.zotero.android.screens.sortpicker.SortPickerNavigation
import org.zotero.android.screens.tagpicker.TagPickerScreen
import org.zotero.android.screens.addbyidentifier.ui.AddByIdentifierScreen
import org.zotero.android.uicomponents.navigation.ZoteroNavHost
import org.zotero.android.uicomponents.singlepicker.SinglePickerScreen
import java.io.File
Expand All @@ -39,6 +39,7 @@ internal fun TabletRightPaneNavigation(
onShowPdf: (String) -> Unit,
toAddOrEditNote: () -> Unit,
toZoteroWebViewScreen: (String) -> Unit,
navigateToRetrieveMetadata: (params: String) -> Unit,
onOpenWebpage: (uri: Uri) -> Unit,
navController: NavHostController,
navigation: ZoteroNavigation,
Expand Down Expand Up @@ -66,6 +67,7 @@ internal fun TabletRightPaneNavigation(
navigateToTagFilter = { },
navigateToCollectionPicker = navigation::toCollectionPickerDialog,
navigateToScanBarcode = navigation::toScanBarcodeDialog,
navigateToRetrieveMetadata = navigateToRetrieveMetadata,
onShowPdf = onShowPdf,
)
itemDetailsScreen(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@ package org.zotero.android.database.requests

import io.realm.Realm
import org.zotero.android.api.pojo.sync.ItemResponse
import org.zotero.android.database.DbRequest
import org.zotero.android.database.DbResponseRequest
import org.zotero.android.database.objects.RItem
import org.zotero.android.database.objects.RItemChanges
import org.zotero.android.database.objects.RObjectChange
import org.zotero.android.database.objects.UpdatableChangeType
Expand All @@ -13,19 +14,20 @@ class CreateTranslatedItemsDbRequest(
private val responses: List<ItemResponse>,
private val schemaController: SchemaController,
private val dateParser: DateParser,
) : DbRequest {
) : DbResponseRequest<List<RItem>> {

override val needsWrite: Boolean
get() = true

override fun process(database: Realm) {
override fun process(database: Realm): List<RItem> {
val listOfCreatedItems: MutableList<RItem> = mutableListOf()
for (response in this.responses) {
val (item, _) = StoreItemDbRequest(
response = response,
schemaController = this.schemaController,
dateParser = this.dateParser,
preferRemoteData = true,
denyIncorrectCreator = false
denyIncorrectCreator = false,
)
.process(database)

Expand Down Expand Up @@ -53,6 +55,8 @@ class CreateTranslatedItemsDbRequest(
changes.add(RItemChanges.tags)
}
item.changes.add(RObjectChange.create(changes = changes))
listOfCreatedItems.add(item)
}
return listOfCreatedItems
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
package org.zotero.android.database.requests

import io.realm.Realm
import io.realm.kotlin.where
import org.zotero.android.api.pojo.sync.KeyBaseKeyPair
import org.zotero.android.database.DbRequest
import org.zotero.android.database.objects.FieldKeys
import org.zotero.android.database.objects.RItem
import org.zotero.android.database.objects.RItemChanges
import org.zotero.android.database.objects.RObjectChange
import org.zotero.android.database.objects.UpdatableChangeType
import org.zotero.android.sync.DateParser
import org.zotero.android.sync.LibraryIdentifier
import org.zotero.android.sync.SchemaController
import timber.log.Timber
import java.util.Date

class LinkAttachmentToParentItemDbRequest(
private val schemaController: SchemaController,
private val dateParser: DateParser,
private val libraryId: LibraryIdentifier,
private val itemKey: String,
private val parentItemKey: String
): DbRequest {
override val needsWrite: Boolean
get() = true

override fun process(database: Realm) {
val item = database
.where<RItem>()
.key(this.itemKey, this.libraryId)
.findFirst()!!
val parentItem = database
.where<RItem>()
.key(this.parentItemKey, this.libraryId)
.findFirst()!!

item.parent = parentItem

for (collection in item.collections!!
.where()
.findAll()) {
val index = collection.items.indexOf(item)
if (index == -1) {
continue
}
collection.items.removeAt(index)
}

val key = this.schemaController.titleKey(item.rawType)
if (key == null) {
Timber.e("LinkAttachmentToParentItemDbRequest: schema controller doesn't contain title key for item type ${item.rawType}")
return
}

val keyPair = KeyBaseKeyPair(
key = key,
baseKey = (if (key != FieldKeys.Item.title) FieldKeys.Item.title else null)
)

EditItemFieldsDbRequest(
key = itemKey,
libraryId = libraryId,
fieldValues = mapOf(keyPair to "PDF"),
dateParser = dateParser
).process(database)

item.changes.add(
RObjectChange.create(
changes = listOf(
RItemChanges.collections,
RItemChanges.parent,
RItemChanges.fields
)
)
)
item.changeType = UpdatableChangeType.user.name
item.dateModified = Date()
}
}
6 changes: 6 additions & 0 deletions app/src/main/java/org/zotero/android/files/FileStore.kt
Original file line number Diff line number Diff line change
Expand Up @@ -490,4 +490,10 @@ class FileStore @Inject constructor (
return File(uploadsDir, "${key}.zip")
}

fun pdfWorkerDirectory(): File {
val folderPath = File(getRootDirectory(), "pdf-worker")
folderPath.mkdirs()
return folderPath
}

}
Loading

0 comments on commit d413903

Please sign in to comment.