Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions .github/workflows/build_test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,16 @@ jobs:
- name: run tests
run: bundle exec fastlane tests

# taking the pictures is a quarter hour of simulators and belongs to the
# release, but a screenshot target that no longer compiles should not wait
# for one to say so
- name: build the screenshot tests
run: >
xcodebuild build-for-testing
-project OpenDocumentReader.xcodeproj
-scheme "ODR Screenshots"
-destination 'generic/platform=iOS Simulator'

- uses: actions/upload-artifact@v7
if: always()
with:
Expand Down
65 changes: 64 additions & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,62 @@ jobs:
build/*.app.dSYM.zip
if-no-files-found: warn

# Beside the build rather than behind it: it signs nothing and uploads nothing,
# it just drives simulators, and it takes about as long. On a dry run too -
# the artifact is the only way to look at the pictures before the store does.
screenshots:
runs-on: macos-26
steps:
- name: checkout
uses: actions/checkout@v7

- uses: ruby/setup-ruby@v1
with:
bundler-cache: true

- uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: ${{ env.xcode_version }}

# the framing draws with Pillow, which is the one thing the scripts here
# want that is not in the standard library
- uses: actions/setup-python@v6
with:
python-version: "3.13"
- run: python3 -m pip install --quiet Pillow

# the lane checks the set it produced, so a language that came out short
# fails here rather than half way up to App Store Connect
- name: photograph both devices in every locale
run: bundle exec fastlane ios screenshots

# what the store is given
- name: archive the framed screenshots
uses: actions/upload-artifact@v7
with:
name: framed
path: fastlane/framed
if-no-files-found: error
# png, so there is nothing left to squeeze out of them
compression-level: 0

# and what they were framed from, which is where to look when a picture
# comes out wrong
- name: archive the raw captures
uses: actions/upload-artifact@v7
with:
name: screenshots
path: fastlane/screenshots
if-no-files-found: error
compression-level: 0

- uses: actions/upload-artifact@v7
if: failure()
with:
name: screenshot-log
path: ~/Library/Logs/snapshot
if-no-files-found: warn

# a job per app, fail-fast off, so "Re-run failed jobs" can retry one half
upload:
needs: build
Expand Down Expand Up @@ -219,7 +275,7 @@ jobs:
# while a build cannot be uploaded twice. No macOS runner: this touches the
# listing, not the app
listing:
needs: upload
needs: [upload, screenshots]
if: ${{ !inputs.dry_run }}
runs-on: ubuntu-24.04
strategy:
Expand All @@ -244,6 +300,13 @@ jobs:
given: ${{ inputs.version }}
run: .github/scripts/resolve-version.py --input "$given" --dry-run "$dry_run"

# where the lane looks for them, and the same set both apps are given
- name: fetch the screenshots
uses: actions/download-artifact@v8
with:
name: framed
path: fastlane/framed

- name: write ${{ matrix.app }}'s listing
env:
ASC_KEY_ID: ${{ secrets.ASC_KEY_ID }}
Expand Down
7 changes: 7 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,13 @@ Carthage/Build
fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots/**/*.png
fastlane/screenshots/screenshots.html
fastlane/framed

# The documents the screenshots are taken of, and the names the app lays
# them out under. Build output: `scripts/make-screenshot-documents.py`
# writes them, and the screenshot lane runs it before the build.
OpenDocumentReader/Samples/
fastlane/test_output

.DS_Store
Expand Down
11 changes: 6 additions & 5 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,19 +21,20 @@ once the version tag exists.

### Changed

- The engine is odrcore 6.7.1, up from 6.6.0. A pdf, a text file and an archive
listing can be searched, not only a document. A pdf's text also sits where the
file puts it: words no longer drift to the right of where they belong, bold
and italic are bold and italic, and a hit is highlighted in one piece.
- The engine is odrcore 6.7.1, up from 6.6.0. Pdfs, text files and archive
listings can be searched too, and a pdf's text sits where the file puts it.
- PDFs are rendered by odrcore instead of being handed to the web view, and a
password protected one takes the prompt the other formats use. They can be
searched like a document, and a hit tints the text rather than covering it.
searched like a document.
- The search button leaves the tool bar when the page cannot be searched,
rather than greying out - the same as the edit button.
- The pencil turns into a save button while editing, as on Android. Saving from
the bar ends the edit and shows what was written; a save that failed stays in
it. Saving has left the menu; discarding is still there and now leaves edit
mode.
- The App Store screenshots are taken by the release run, from the build going
out, instead of being made by hand: six per device on an iPhone and an iPad,
in every language the app speaks.

### Fixed

Expand Down
117 changes: 117 additions & 0 deletions OpenDocumentReader.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,13 @@
/* End PBXBuildFile section */

/* Begin PBXContainerItemProxy section */
A11E00000000000000000037 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = E2F7ED47220B54D600D63515 /* Project object */;
proxyType = 1;
remoteGlobalIDString = E2F7ED4E220B54D600D63515;
remoteInfo = OpenDocumentReader;
};
E22B25312557F0E2001D0C52 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = E2F7ED47220B54D600D63515 /* Project object */;
Expand All @@ -49,6 +56,7 @@
A11E00000000000000000013 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
A11E00000000000000000014 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
A11E00000000000000000015 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
A11E00000000000000000038 /* OpenDocumentReaderUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = OpenDocumentReaderUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
E1EB6C492C1A510D003EC5A0 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
E237952F2274844400BA7238 /* AdSupport.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AdSupport.framework; path = System/Library/Frameworks/AdSupport.framework; sourceTree = SDKROOT; };
E26C39382250DC6E009C484A /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; };
Expand Down Expand Up @@ -77,9 +85,21 @@
path = OpenDocumentReaderTests;
sourceTree = "<group>";
};
A11E00000000000000000030 /* OpenDocumentReaderUITests */ = {
isa = PBXFileSystemSynchronizedRootGroup;
path = OpenDocumentReaderUITests;
sourceTree = "<group>";
};
/* End PBXFileSystemSynchronizedRootGroup section */

/* Begin PBXFrameworksBuildPhase section */
A11E00000000000000000034 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
A11E00000000000000000003 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
Expand Down Expand Up @@ -171,10 +191,12 @@
A11E00000000000000000009 /* Ads */,
A11E0000000000000000000A /* NoAds */,
A11E00000000000000000022 /* OpenDocumentReaderTests */,
A11E00000000000000000030 /* OpenDocumentReaderUITests */,
E2BB4B64220EF4F20056176B /* Frameworks */,
52A348B12A9262D100DACAB9 /* OpenDocumentReader.app */,
A11E00000000000000000008 /* OpenDocumentReader Lite.app */,
52A348B22A9262D100DACAB9 /* OpenDocumentReaderTests.xctest */,
A11E00000000000000000038 /* OpenDocumentReaderUITests.xctest */,
);
sourceTree = "<group>";
};
Expand Down Expand Up @@ -228,6 +250,27 @@
productReference = 52A348B22A9262D100DACAB9 /* OpenDocumentReaderTests.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
A11E00000000000000000031 /* OpenDocumentReaderUITests */ = {
isa = PBXNativeTarget;
buildConfigurationList = A11E00000000000000000032 /* Build configuration list for PBXNativeTarget "OpenDocumentReaderUITests" */;
buildPhases = (
A11E00000000000000000033 /* Sources */,
A11E00000000000000000034 /* Frameworks */,
A11E00000000000000000035 /* Resources */,
);
buildRules = (
);
dependencies = (
A11E00000000000000000036 /* PBXTargetDependency */,
);
fileSystemSynchronizedGroups = (
A11E00000000000000000030 /* OpenDocumentReaderUITests */,
);
name = OpenDocumentReaderUITests;
productName = OpenDocumentReaderUITests;
productReference = A11E00000000000000000038 /* OpenDocumentReaderUITests.xctest */;
productType = "com.apple.product-type.bundle.ui-testing";
};
E2F7ED4E220B54D600D63515 /* OpenDocumentReader */ = {
isa = PBXNativeTarget;
buildConfigurationList = E2F7ED65220B54D700D63515 /* Build configuration list for PBXNativeTarget "OpenDocumentReader" */;
Expand Down Expand Up @@ -266,6 +309,10 @@
A11E00000000000000000001 = {
CreatedOnToolsVersion = 26.0;
};
A11E00000000000000000031 = {
CreatedOnToolsVersion = 26.0;
TestTargetID = E2F7ED4E220B54D600D63515;
};
E22B252B2557F0E2001D0C52 = {
CreatedOnToolsVersion = 12.0;
TestTargetID = E2F7ED4E220B54D600D63515;
Expand Down Expand Up @@ -313,6 +360,7 @@
E2F7ED4E220B54D600D63515 /* OpenDocumentReader */,
A11E00000000000000000001 /* OpenDocumentReader Lite */,
E22B252B2557F0E2001D0C52 /* OpenDocumentReaderTests */,
A11E00000000000000000031 /* OpenDocumentReaderUITests */,
);
};
/* End PBXProject section */
Expand All @@ -333,6 +381,13 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
A11E00000000000000000035 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
E2F7ED4D220B54D600D63515 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
Expand All @@ -358,6 +413,13 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
A11E00000000000000000033 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
E2F7ED4B220B54D600D63515 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
Expand All @@ -368,6 +430,11 @@
/* End PBXSourcesBuildPhase section */

/* Begin PBXTargetDependency section */
A11E00000000000000000036 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = E2F7ED4E220B54D600D63515 /* OpenDocumentReader */;
targetProxy = A11E00000000000000000037 /* PBXContainerItemProxy */;
};
E22B25322557F0E2001D0C52 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = E2F7ED4E220B54D600D63515 /* OpenDocumentReader */;
Expand Down Expand Up @@ -423,6 +490,7 @@
ENABLE_BITCODE = NO;
ENABLE_MODULE_VERIFIER = YES;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
EXCLUDED_SOURCE_FILE_NAMES = "sample-*";
INFOPLIST_FILE = configs/lite/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = "OpenDocument Reader";
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity";
Expand All @@ -441,6 +509,45 @@
};
name = Release;
};
A11E00000000000000000039 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CODE_SIGN_STYLE = Automatic;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
GENERATE_INFOPLIST_FILE = YES;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = app.opendocument.OpenDocumentReaderUITests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
TEST_TARGET_NAME = OpenDocumentReader;
};
name = Debug;
};
A11E0000000000000000003A /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CODE_SIGN_STYLE = Automatic;
GENERATE_INFOPLIST_FILE = YES;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = app.opendocument.OpenDocumentReaderUITests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
TEST_TARGET_NAME = OpenDocumentReader;
};
name = Release;
};
E22B25342557F0E2001D0C52 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
Expand Down Expand Up @@ -648,6 +755,7 @@
ENABLE_BITCODE = NO;
ENABLE_MODULE_VERIFIER = YES;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
EXCLUDED_SOURCE_FILE_NAMES = "sample-*";
INFOPLIST_FILE = configs/full/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = "OpenDocument Reader";
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity";
Expand All @@ -669,6 +777,15 @@
/* End XCBuildConfiguration section */

/* Begin XCConfigurationList section */
A11E00000000000000000032 /* Build configuration list for PBXNativeTarget "OpenDocumentReaderUITests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
A11E00000000000000000039 /* Debug */,
A11E0000000000000000003A /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
A11E00000000000000000005 /* Build configuration list for PBXNativeTarget "OpenDocumentReader Lite" */ = {
isa = XCConfigurationList;
buildConfigurations = (
Expand Down
Loading