Skip to content

Commit d413903

Browse files
committed
Retrieve Metadata Functionality
1 parent b379cca commit d413903

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+2531
-127
lines changed

Diff for: .github/workflows/android.yml

+6
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,12 @@ jobs:
5151
- name: Execute bundle_translation.py
5252
run: python3 scripts/bundle_translation.py
5353

54+
- name: Grant execute permission for bundle_pdf-worker.py
55+
run: chmod +x scripts/bundle_pdf-worker.py
56+
57+
- name: Execute bundle_pdf-worker.py
58+
run: python3 scripts/bundle_pdf-worker.py
59+
5460
- name: Grant execute permission for gradlew
5561
run: chmod +x gradlew
5662

Diff for: .gitignore

+8
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,11 @@ buildSrc/gradle/
5656
app/src/main/assets/translators/
5757
app/src/main/assets/translation_commit_hash.txt
5858
app/src/main/assets/translator.zip
59+
60+
#pdf-worker generated files:
61+
app/src/main/assets/pdf-worker_commit_hash.txt
62+
app/src/main/assets/pdf-worker.zip
63+
64+
/pdf-worker/cmaps/
65+
/pdf-worker/standard_fonts/
66+
/pdf-worker/worker.js

Diff for: app/src/main/assets/timestamp.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1715335209
1+
1738586822

Diff for: app/src/main/java/org/zotero/android/architecture/Defaults.kt

+9
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ open class Defaults @Inject constructor(
5050
private val lastTranslatorCommitHash = "lastTranslatorCommitHash"
5151
private val lastTranslatorDeleted = "lastTranslatorDeleted"
5252
private val lastStylesCommitHash = "lastStylesCommitHash"
53+
private val lastPdfWorkerCommitHash = "lastPdfWorkerCommitHash"
5354

5455
private val isWebDavEnabled = "isWebDavEnabled"
5556
private val webDavVerified = "webDavVerified"
@@ -395,6 +396,14 @@ open class Defaults @Inject constructor(
395396
return sharedPreferences.getInt(performFullSyncGuardKey, 1)
396397
}
397398

399+
fun getLastPdfWorkerCommitHash(): String {
400+
return sharedPreferences.getString(lastPdfWorkerCommitHash, "") ?: ""
401+
}
402+
403+
fun setLastPdfWorkerCommitHash(newValue: String) {
404+
sharedPreferences.edit { putString(lastPdfWorkerCommitHash, newValue) }
405+
}
406+
398407
fun reset() {
399408
setUsername("")
400409
setDisplayName("")

Diff for: app/src/main/java/org/zotero/android/architecture/navigation/CommonScreenNavigation.kt

+20
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,12 @@ import org.zotero.android.screens.libraries.LibrariesScreen
1515
import org.zotero.android.screens.loading.LoadingScreen
1616
import org.zotero.android.screens.mediaviewer.image.ImageViewerScreen
1717
import org.zotero.android.screens.mediaviewer.video.VideoPlayerView
18+
import org.zotero.android.screens.retrievemetadata.RetrieveMetadataScreen
1819
import org.zotero.android.screens.webview.ZoteroWebViewScreen
1920
import java.io.File
2021

2122
internal const val ARG_ITEM_DETAILS_SCREEN = "itemDetailsArgs"
23+
internal const val ARG_RETRIEVE_METADATA = "retrieveMetadataArgs"
2224

2325
fun NavGraphBuilder.allItemsScreen(
2426
navigateToCollectionsScreen: () -> Unit,
@@ -27,6 +29,7 @@ fun NavGraphBuilder.allItemsScreen(
2729
navigateToSinglePicker: () -> Unit,
2830
navigateToAllItemsSort: () -> Unit,
2931
navigateToAddByIdentifier: (addByIdentifierParams: String) -> Unit,
32+
navigateToRetrieveMetadata: (params: String) -> Unit,
3033
navigateToVideoPlayerScreen: () -> Unit,
3134
navigateToImageViewerScreen: () -> Unit,
3235
navigateToZoterWebViewScreen: (String) -> Unit,
@@ -59,6 +62,7 @@ fun NavGraphBuilder.allItemsScreen(
5962
navigateToTagFilter = navigateToTagFilter,
6063
navigateToCollectionPicker = navigateToCollectionPicker,
6164
navigateToScanBarcode = navigateToScanBarcode,
65+
navigateToRetrieveMetadata = navigateToRetrieveMetadata,
6266
)
6367
}
6468
}
@@ -191,6 +195,17 @@ fun NavGraphBuilder.collectionsScreen(
191195
}
192196
}
193197

198+
fun NavGraphBuilder.retrieveMetadataScreen() {
199+
dialogFixedMaxHeight(
200+
route = "${CommonScreenDestinations.RETRIEVE_METADATA_SCREEN}/{$ARG_RETRIEVE_METADATA}",
201+
arguments = listOf(
202+
navArgument(ARG_RETRIEVE_METADATA) { type = NavType.StringType },
203+
),
204+
) {
205+
RetrieveMetadataScreen()
206+
}
207+
}
208+
194209
object CommonScreenDestinations {
195210
const val LOADING = "loading"
196211
const val LIBRARIES_SCREEN = "librariesScreen"
@@ -202,6 +217,7 @@ object CommonScreenDestinations {
202217
const val IMAGE_VIEWER_SCREEN = "imageViewerScreen"
203218
const val COLLECTIONS_SCREEN = "collectionsScreen"
204219
const val ZOTERO_WEB_VIEW_SCREEN = "zoteroWebViewScreen"
220+
const val RETRIEVE_METADATA_SCREEN = "retrieveMetadataScreen"
205221
}
206222

207223

@@ -225,4 +241,8 @@ fun ZoteroNavigation.toZoteroWebViewScreen(encodedUrl: String) {
225241
navController.navigate(
226242
"${CommonScreenDestinations.ZOTERO_WEB_VIEW_SCREEN}/$encodedUrl"
227243
)
244+
}
245+
246+
fun ZoteroNavigation.toRetrieveMetadata(args: String) {
247+
navController.navigate("${CommonScreenDestinations.RETRIEVE_METADATA_SCREEN}/$args")
228248
}

Diff for: app/src/main/java/org/zotero/android/architecture/navigation/NavigationDialogs.kt

+2
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,12 @@ fun NavGraphBuilder.dialogFixedMaxHeight(
4242

4343
fun NavGraphBuilder.dialogDynamicHeight(
4444
route: String,
45+
arguments: List<NamedNavArgument> = emptyList(),
4546
content: @Composable () -> Unit,
4647
) {
4748
customDialog(
4849
route = route,
50+
arguments = arguments,
4951
dialogModifier = Modifier.fillMaxHeight(0.8f),
5052
content = content
5153
)

Diff for: app/src/main/java/org/zotero/android/architecture/navigation/phone/DashboardRootPhoneNavigation.kt

+5-1
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,11 @@ import org.zotero.android.architecture.navigation.imageViewerScreen
2929
import org.zotero.android.architecture.navigation.itemDetailsScreen
3030
import org.zotero.android.architecture.navigation.librariesScreen
3131
import org.zotero.android.architecture.navigation.loadingScreen
32+
import org.zotero.android.architecture.navigation.retrieveMetadataScreen
3233
import org.zotero.android.architecture.navigation.toAddOrEditNote
3334
import org.zotero.android.architecture.navigation.toImageViewerScreen
3435
import org.zotero.android.architecture.navigation.toItemDetails
36+
import org.zotero.android.architecture.navigation.toRetrieveMetadata
3537
import org.zotero.android.architecture.navigation.toVideoPlayerScreen
3638
import org.zotero.android.architecture.navigation.toZoteroWebViewScreen
3739
import org.zotero.android.architecture.navigation.toolbar.SyncToolbarScreen
@@ -40,6 +42,7 @@ import org.zotero.android.architecture.navigation.zoterWebViewScreen
4042
import org.zotero.android.architecture.ui.CustomLayoutSize
4143
import org.zotero.android.pdf.pdfReaderNavScreensForPhone
4244
import org.zotero.android.pdf.toPdfScreen
45+
import org.zotero.android.screens.addbyidentifier.ui.AddByIdentifierScreen
4346
import org.zotero.android.screens.collectionedit.collectionEditNavScreens
4447
import org.zotero.android.screens.collectionedit.toCollectionEditScreen
4548
import org.zotero.android.screens.collectionpicker.CollectionPickerScreen
@@ -55,7 +58,6 @@ import org.zotero.android.screens.settings.toSettingsScreen
5558
import org.zotero.android.screens.sortpicker.sortPickerNavScreens
5659
import org.zotero.android.screens.sortpicker.toSortPicker
5760
import org.zotero.android.screens.tagpicker.TagPickerScreen
58-
import org.zotero.android.screens.addbyidentifier.ui.AddByIdentifierScreen
5961
import org.zotero.android.uicomponents.navigation.ZoteroNavHost
6062
import org.zotero.android.uicomponents.singlepicker.SinglePickerScreen
6163
import org.zotero.android.uicomponents.theme.CustomTheme
@@ -134,6 +136,7 @@ internal fun DashboardRootPhoneNavigation(
134136
navigateToVideoPlayerScreen = navigation::toVideoPlayerScreen,
135137
navigateToImageViewerScreen = navigation::toImageViewerScreen,
136138
navigateToZoterWebViewScreen = navigation::toZoteroWebViewScreen,
139+
navigateToRetrieveMetadata = navigation::toRetrieveMetadata,
137140
navigateToTagFilter = navigation::toTagFilter,
138141
navigateToAddByIdentifier = navigation::toAddByIdentifier,
139142
navigateToCollectionPicker = navigation::toCollectionPicker,
@@ -234,6 +237,7 @@ internal fun DashboardRootPhoneNavigation(
234237
navigateToTagPicker = navigation::toTagPicker
235238
)
236239
zoterWebViewScreen(onClose = navigation::onBack)
240+
retrieveMetadataScreen()
237241
}
238242
}
239243
DashboardTopLevelDialogs(viewState = viewState, viewModel = viewModel)

Diff for: app/src/main/java/org/zotero/android/architecture/navigation/tablet/DashboardRootTabletNavigationScreen.kt

+2
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ internal fun DashboardRootTabletNavigationScreen(
3737
onShowPdf: (String) -> Unit,
3838
toAddOrEditNote: () -> Unit,
3939
toZoteroWebViewScreen: (String) -> Unit,
40+
navigateToRetrieveMetadata: (params: String) -> Unit,
4041
viewModel: DashboardViewModel,
4142
) {
4243
val viewState by viewModel.viewStates.observeAsState(DashboardViewState())
@@ -81,6 +82,7 @@ internal fun DashboardRootTabletNavigationScreen(
8182
onOpenWebpage = onOpenWebpage,
8283
toAddOrEditNote = toAddOrEditNote,
8384
toZoteroWebViewScreen = toZoteroWebViewScreen,
85+
navigateToRetrieveMetadata = navigateToRetrieveMetadata,
8486
navController = rightPaneNavController,
8587
navigation = rightPaneNavigation
8688
)

Diff for: app/src/main/java/org/zotero/android/architecture/navigation/tablet/DashboardRootTopLevelTabletNavigation.kt

+6
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@ import org.zotero.android.architecture.EventBusConstants
1515
import org.zotero.android.architecture.navigation.ZoteroNavigation
1616
import org.zotero.android.architecture.navigation.addNoteScreen
1717
import org.zotero.android.architecture.navigation.dialogDynamicHeight
18+
import org.zotero.android.architecture.navigation.retrieveMetadataScreen
1819
import org.zotero.android.architecture.navigation.toAddOrEditNote
20+
import org.zotero.android.architecture.navigation.toRetrieveMetadata
1921
import org.zotero.android.architecture.navigation.toZoteroWebViewScreen
2022
import org.zotero.android.architecture.navigation.zoterWebViewScreen
2123
import org.zotero.android.pdf.pdfReaderScreenAndNavigationForTablet
@@ -59,6 +61,7 @@ internal fun DashboardRootTopLevelTabletNavigation(
5961
},
6062
toAddOrEditNote = navigation::toAddOrEditNote,
6163
toZoteroWebViewScreen = navigation::toZoteroWebViewScreen,
64+
navigateToRetrieveMetadata = navigation::toRetrieveMetadata
6265
)
6366
pdfReaderScreenAndNavigationForTablet(
6467
navigation = navigation,
@@ -71,6 +74,7 @@ internal fun DashboardRootTopLevelTabletNavigation(
7174
navigateToTagPicker = navigation::toTagPickerScreen
7275
)
7376
zoterWebViewScreen(onClose = navigation::onBack)
77+
retrieveMetadataScreen()
7478
}
7579
}
7680

@@ -80,6 +84,7 @@ private fun NavGraphBuilder.dashboardScreen(
8084
onShowPdf: (String) -> Unit,
8185
toAddOrEditNote: () -> Unit,
8286
toZoteroWebViewScreen: (String) -> Unit,
87+
navigateToRetrieveMetadata: (params: String) -> Unit,
8388
onOpenWebpage: (uri: Uri) -> Unit,
8489
viewModel: DashboardViewModel,
8590
) {
@@ -93,6 +98,7 @@ private fun NavGraphBuilder.dashboardScreen(
9398
onShowPdf = onShowPdf,
9499
toAddOrEditNote = toAddOrEditNote,
95100
toZoteroWebViewScreen = toZoteroWebViewScreen,
101+
navigateToRetrieveMetadata = navigateToRetrieveMetadata,
96102
onOpenWebpage = onOpenWebpage,
97103
viewModel = viewModel
98104
)

Diff for: app/src/main/java/org/zotero/android/architecture/navigation/tablet/TabletRightPaneNavigation.kt

+3-1
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,12 @@ import org.zotero.android.architecture.navigation.toImageViewerScreen
2222
import org.zotero.android.architecture.navigation.toItemDetails
2323
import org.zotero.android.architecture.navigation.toVideoPlayerScreen
2424
import org.zotero.android.architecture.navigation.videoPlayerScreen
25+
import org.zotero.android.screens.addbyidentifier.ui.AddByIdentifierScreen
2526
import org.zotero.android.screens.collectionpicker.CollectionPickerScreen
2627
import org.zotero.android.screens.creatoredit.CreatorEditNavigation
2728
import org.zotero.android.screens.scanbarcode.ui.ScanBarcodeScreen
2829
import org.zotero.android.screens.sortpicker.SortPickerNavigation
2930
import org.zotero.android.screens.tagpicker.TagPickerScreen
30-
import org.zotero.android.screens.addbyidentifier.ui.AddByIdentifierScreen
3131
import org.zotero.android.uicomponents.navigation.ZoteroNavHost
3232
import org.zotero.android.uicomponents.singlepicker.SinglePickerScreen
3333
import java.io.File
@@ -39,6 +39,7 @@ internal fun TabletRightPaneNavigation(
3939
onShowPdf: (String) -> Unit,
4040
toAddOrEditNote: () -> Unit,
4141
toZoteroWebViewScreen: (String) -> Unit,
42+
navigateToRetrieveMetadata: (params: String) -> Unit,
4243
onOpenWebpage: (uri: Uri) -> Unit,
4344
navController: NavHostController,
4445
navigation: ZoteroNavigation,
@@ -66,6 +67,7 @@ internal fun TabletRightPaneNavigation(
6667
navigateToTagFilter = { },
6768
navigateToCollectionPicker = navigation::toCollectionPickerDialog,
6869
navigateToScanBarcode = navigation::toScanBarcodeDialog,
70+
navigateToRetrieveMetadata = navigateToRetrieveMetadata,
6971
onShowPdf = onShowPdf,
7072
)
7173
itemDetailsScreen(

Diff for: app/src/main/java/org/zotero/android/database/requests/CreateTranslatedItemsDbRequest.kt

+8-4
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ package org.zotero.android.database.requests
22

33
import io.realm.Realm
44
import org.zotero.android.api.pojo.sync.ItemResponse
5-
import org.zotero.android.database.DbRequest
5+
import org.zotero.android.database.DbResponseRequest
6+
import org.zotero.android.database.objects.RItem
67
import org.zotero.android.database.objects.RItemChanges
78
import org.zotero.android.database.objects.RObjectChange
89
import org.zotero.android.database.objects.UpdatableChangeType
@@ -13,19 +14,20 @@ class CreateTranslatedItemsDbRequest(
1314
private val responses: List<ItemResponse>,
1415
private val schemaController: SchemaController,
1516
private val dateParser: DateParser,
16-
) : DbRequest {
17+
) : DbResponseRequest<List<RItem>> {
1718

1819
override val needsWrite: Boolean
1920
get() = true
2021

21-
override fun process(database: Realm) {
22+
override fun process(database: Realm): List<RItem> {
23+
val listOfCreatedItems: MutableList<RItem> = mutableListOf()
2224
for (response in this.responses) {
2325
val (item, _) = StoreItemDbRequest(
2426
response = response,
2527
schemaController = this.schemaController,
2628
dateParser = this.dateParser,
2729
preferRemoteData = true,
28-
denyIncorrectCreator = false
30+
denyIncorrectCreator = false,
2931
)
3032
.process(database)
3133

@@ -53,6 +55,8 @@ class CreateTranslatedItemsDbRequest(
5355
changes.add(RItemChanges.tags)
5456
}
5557
item.changes.add(RObjectChange.create(changes = changes))
58+
listOfCreatedItems.add(item)
5659
}
60+
return listOfCreatedItems
5761
}
5862
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package org.zotero.android.database.requests
2+
3+
import io.realm.Realm
4+
import io.realm.kotlin.where
5+
import org.zotero.android.api.pojo.sync.KeyBaseKeyPair
6+
import org.zotero.android.database.DbRequest
7+
import org.zotero.android.database.objects.FieldKeys
8+
import org.zotero.android.database.objects.RItem
9+
import org.zotero.android.database.objects.RItemChanges
10+
import org.zotero.android.database.objects.RObjectChange
11+
import org.zotero.android.database.objects.UpdatableChangeType
12+
import org.zotero.android.sync.DateParser
13+
import org.zotero.android.sync.LibraryIdentifier
14+
import org.zotero.android.sync.SchemaController
15+
import timber.log.Timber
16+
import java.util.Date
17+
18+
class LinkAttachmentToParentItemDbRequest(
19+
private val schemaController: SchemaController,
20+
private val dateParser: DateParser,
21+
private val libraryId: LibraryIdentifier,
22+
private val itemKey: String,
23+
private val parentItemKey: String
24+
): DbRequest {
25+
override val needsWrite: Boolean
26+
get() = true
27+
28+
override fun process(database: Realm) {
29+
val item = database
30+
.where<RItem>()
31+
.key(this.itemKey, this.libraryId)
32+
.findFirst()!!
33+
val parentItem = database
34+
.where<RItem>()
35+
.key(this.parentItemKey, this.libraryId)
36+
.findFirst()!!
37+
38+
item.parent = parentItem
39+
40+
for (collection in item.collections!!
41+
.where()
42+
.findAll()) {
43+
val index = collection.items.indexOf(item)
44+
if (index == -1) {
45+
continue
46+
}
47+
collection.items.removeAt(index)
48+
}
49+
50+
val key = this.schemaController.titleKey(item.rawType)
51+
if (key == null) {
52+
Timber.e("LinkAttachmentToParentItemDbRequest: schema controller doesn't contain title key for item type ${item.rawType}")
53+
return
54+
}
55+
56+
val keyPair = KeyBaseKeyPair(
57+
key = key,
58+
baseKey = (if (key != FieldKeys.Item.title) FieldKeys.Item.title else null)
59+
)
60+
61+
EditItemFieldsDbRequest(
62+
key = itemKey,
63+
libraryId = libraryId,
64+
fieldValues = mapOf(keyPair to "PDF"),
65+
dateParser = dateParser
66+
).process(database)
67+
68+
item.changes.add(
69+
RObjectChange.create(
70+
changes = listOf(
71+
RItemChanges.collections,
72+
RItemChanges.parent,
73+
RItemChanges.fields
74+
)
75+
)
76+
)
77+
item.changeType = UpdatableChangeType.user.name
78+
item.dateModified = Date()
79+
}
80+
}

Diff for: app/src/main/java/org/zotero/android/files/FileStore.kt

+6
Original file line numberDiff line numberDiff line change
@@ -490,4 +490,10 @@ class FileStore @Inject constructor (
490490
return File(uploadsDir, "${key}.zip")
491491
}
492492

493+
fun pdfWorkerDirectory(): File {
494+
val folderPath = File(getRootDirectory(), "pdf-worker")
495+
folderPath.mkdirs()
496+
return folderPath
497+
}
498+
493499
}

0 commit comments

Comments
 (0)