diff --git a/app/src/androidTest/assets/spreadsheet-test.ods b/app/src/androidTest/assets/spreadsheet-test.ods new file mode 100644 index 000000000000..993fe107568f Binary files /dev/null and b/app/src/androidTest/assets/spreadsheet-test.ods differ diff --git a/app/src/androidTest/java/at/tomtasche/reader/test/CoreTest.java b/app/src/androidTest/java/at/tomtasche/reader/test/CoreTest.java index 7ed1d192b4e7..28a4ba4decff 100644 --- a/app/src/androidTest/java/at/tomtasche/reader/test/CoreTest.java +++ b/app/src/androidTest/java/at/tomtasche/reader/test/CoreTest.java @@ -26,6 +26,7 @@ public class CoreTest { private File m_testFile; private File m_passwordTestFile; + private File m_spreadsheetTestFile; @Before public void initializeCore() { @@ -47,6 +48,10 @@ public void extractTestFile() throws IOException { try (InputStream inputStream = assetManager.open("password-test.odt")) { copy(inputStream, m_passwordTestFile); } + m_spreadsheetTestFile = new File(appCtx.getCacheDir(), "spreadsheet-test.ods"); + try (InputStream inputStream = assetManager.open("spreadsheet-test.ods")) { + copy(inputStream, m_spreadsheetTestFile); + } } @After @@ -57,6 +62,9 @@ public void cleanupTestFile() { if (null != m_passwordTestFile) { m_passwordTestFile.delete(); } + if (null != m_spreadsheetTestFile) { + m_spreadsheetTestFile.delete(); + } } private static void copy(InputStream src, File dst) throws IOException { @@ -142,4 +150,28 @@ public void testPasswordProtectedDocumentWithCorrectPassword() { CoreWrapper.CoreResult coreResult = CoreWrapper.parse(coreOptions); Assert.assertEquals(0, coreResult.errorCode); } + + @Test + public void testSpreadsheetSheetNames() { + File cacheDir = InstrumentationRegistry.getInstrumentation().getTargetContext().getCacheDir(); + File outputPath = new File(cacheDir, "spreadsheet_output"); + File cachePath = new File(cacheDir, "spreadsheet_cache"); + + CoreWrapper.CoreOptions coreOptions = new CoreWrapper.CoreOptions(); + coreOptions.inputPath = m_spreadsheetTestFile.getAbsolutePath(); + coreOptions.outputPath = outputPath.getPath(); + coreOptions.editable = false; + coreOptions.cachePath = cachePath.getPath(); + + CoreWrapper.CoreResult coreResult = CoreWrapper.parse(coreOptions); + Assert.assertEquals("CoreWrapper should successfully parse the ODS file", 0, coreResult.errorCode); + + // Verify we have exactly 3 sheets + Assert.assertEquals("ODS file should contain 3 sheets", 3, coreResult.pageNames.size()); + + // Verify sheet names match the actual sheet names from the ODS file + Assert.assertEquals("First sheet should be named 'hey'", "hey", coreResult.pageNames.get(0)); + Assert.assertEquals("Second sheet should be named 'ho'", "ho", coreResult.pageNames.get(1)); + Assert.assertEquals("Third sheet should be named 'Sheet3'", "Sheet3", coreResult.pageNames.get(2)); + } } diff --git a/app/src/main/cpp/core_wrapper.cpp b/app/src/main/cpp/core_wrapper.cpp index 372b19ebbfdf..5575d9328bda 100644 --- a/app/src/main/cpp/core_wrapper.cpp +++ b/app/src/main/cpp/core_wrapper.cpp @@ -221,6 +221,19 @@ Java_at_tomtasche_reader_background_CoreWrapper_parseNative(JNIEnv *env, jclass std::filesystem::remove_all(cachePathCpp); for (const odr::HtmlPage &page: html.pages()) { + // Filter out unwanted views based on document type + if (file.is_document_file() && ( + (((file.as_document_file().document_type() == + odr::DocumentType::presentation) || + (file.as_document_file().document_type() == + odr::DocumentType::drawing)) && + (page.name != "document")) || + ((file.as_document_file().document_type() == + odr::DocumentType::spreadsheet) && + (page.name == "document")))) { + continue; + } + jstring pageName = env->NewStringUTF(page.name.c_str()); env->CallBooleanMethod(pageNames, addMethod, pageName);