diff --git a/README.md b/README.md index b5c0e3a..51b836a 100644 --- a/README.md +++ b/README.md @@ -76,7 +76,7 @@ The last command requires a running emulator or connected device. The debug APK CI builds the app and runs unit tests and lint for pushes to `main` and pull requests. For a release, increment `versionCode` and update `versionName` in `app/build.gradle.kts`, add the matching changelog, commit and push to `main`, then push a `v`-prefixed tag matching `versionName`. The [release workflow](.github/workflows/release.yml) signs the APK with the existing release key, verifies its package, version, and certificate, and publishes it with a SHA-256 checksum. It also signs an AAB with a separate Play upload key and retains it as a workflow artifact for manual Play Console upload. You can run the workflow manually to check signing without publishing a release. -The workflow reads both signing keys and passwords from GitHub Actions repository secrets. For a local signed APK on macOS, run `./scripts/build-release-macos.sh`; it reads the key from `$HOME/.local/share/shareding/release.jks` and its password from macOS Keychain (service `org.evsyukov.shareding.release`, account `shareding`). Set `SHAREDING_RELEASE_KEYSTORE` and `SHAREDING_RELEASE_PASSWORD` to use other locations. The signed APK is written to `app/build/outputs/apk/release/app-release.apk`. Back up the app-signing and Play upload keys and passwords securely. See the [Google Play release checklist](docs/google-play.md) for the separate AAB key and Console steps. +The workflow reads both signing keys and passwords from GitHub Actions repository secrets. For a local signed APK on macOS, run `./scripts/build-release-macos.sh`; it reads the key from `$HOME/.local/share/shareding/release.jks` and its password from macOS Keychain (service `org.evsyukov.shareding.release`, account `shareding`). Set `SHAREDING_RELEASE_KEYSTORE` and `SHAREDING_RELEASE_PASSWORD` to use other locations. The signed APK is written to `app/build/outputs/apk/release/app-release.apk`. Back up the app-signing and Play upload keys and passwords securely. The behavior contract is in the [specification](docs/specs/share-to-linkding.md). diff --git a/app/src/main/java/org/evsyukov/shareding/MainActivity.kt b/app/src/main/java/org/evsyukov/shareding/MainActivity.kt index 38b7832..942855a 100644 --- a/app/src/main/java/org/evsyukov/shareding/MainActivity.kt +++ b/app/src/main/java/org/evsyukov/shareding/MainActivity.kt @@ -711,7 +711,7 @@ private fun SettingsScreen(settings: Settings, padding: PaddingValues, SettingsGroup("Bookmark defaults") { TagInput(tags, { tags = it; saveStatus = null }, "Default tags", if (savedConnectionIsCurrent) availableTags else emptyList(), - "Comma-separated: reading, work notes. Added to new bookmarks.", + "Comma-separated: reading, work notes. Added when a link is sent.", tagLoadError && savedConnectionIsCurrent, canRefresh = settings.configured && savedConnectionIsCurrent, onRefreshTags = onRefreshTags) SwitchRow("Mark unread", unread) { unread = it; saveStatus = null } diff --git a/docs/fdroid/README.md b/docs/fdroid/README.md deleted file mode 100644 index adab250..0000000 --- a/docs/fdroid/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# F-Droid submission - -`org.evsyukov.shareding.yml` is the source for `fdroiddata/metadata/org.evsyukov.shareding.yml`. The recipe points to the tagged `v0.1.8` source and the APK signed by ShareDing's existing release key. F-Droid can publish that APK only if its own build verifies against it. The certificate fingerprint in `AllowedAPKSigningKeys` prevents a different signing key from being accepted. - -The tagged source contains the app summary, description, icon, screenshots, and versionCode 11 release notes in `fastlane/metadata/android/en-US/`. F-Droid imports these listing assets from upstream; the fdroiddata recipe only defines the build and source details. - -Before each future release, increment `versionCode`, update `versionName`, add a matching Fastlane changelog, and publish the signed APK from the same tagged commit. Keep the app signing key unchanged. F-Droid's `Binaries` URL uses the version name to find the corresponding GitHub Release asset. diff --git a/docs/fdroid/org.evsyukov.shareding.yml b/docs/fdroid/org.evsyukov.shareding.yml deleted file mode 100644 index ad72c53..0000000 --- a/docs/fdroid/org.evsyukov.shareding.yml +++ /dev/null @@ -1,30 +0,0 @@ -Categories: - - Bookmark -License: MIT -AuthorName: Denis Evsyukov -AuthorWebSite: https://denis.evsyukov.org -WebSite: https://github.com/juev/shareding -SourceCode: https://github.com/juev/shareding -IssueTracker: https://github.com/juev/shareding/issues -Changelog: https://github.com/juev/shareding/releases - -AutoName: ShareDing - -RepoType: git -Repo: https://github.com/juev/shareding.git -Binaries: https://github.com/juev/shareding/releases/download/v%v/ShareDing-v%v.apk - -Builds: - - versionName: 0.1.8 - versionCode: 11 - commit: 6313df158d8a988454288a62b1fd0c20d3160a5d - subdir: app - gradle: - - yes - -AllowedAPKSigningKeys: 3693ca80cbfc0d7b30a403f49c25637d78b12d1a196bdec398f413fb56a8657e - -AutoUpdateMode: Version -UpdateCheckMode: Tags ^v[0-9]+\.[0-9]+\.[0-9]+$ -CurrentVersion: 0.1.8 -CurrentVersionCode: 11 diff --git a/docs/google-play.md b/docs/google-play.md deleted file mode 100644 index e1e882e..0000000 --- a/docs/google-play.md +++ /dev/null @@ -1,26 +0,0 @@ -# Google Play release checklist - -This guide is for the first ShareDing Play release, version 0.2.0 (code 13). The Play-delivered APKs and the GitHub/F-Droid APK must use the same package and app-signing certificate so existing installations can update. The AAB has a separate upload signature. - -## Artifacts and signing - -The GitHub [release workflow](../.github/workflows/release.yml) signs the APK with the existing app-signing key and retains a separately signed AAB as the `ShareDing-Play-v0.2.0` Actions artifact. The AAB upload certificate SHA-256 is `DE:5C:B1:C8:16:BA:ED:02:55:BE:FA:89:4F:12:BB:D1:1C:47:5F:4B:C5:C1:DC:08:0B:C5:EF:CD:E1:50:FC:38`. The existing APK certificate SHA-256 is `36:93:CA:80:CB:FC:0D:7B:30:A4:03:F4:9C:25:63:7D:78:B1:2D:1A:19:6B:DE:C3:98:F4:13:FB:56:A8:65:7E`. - -Before the first Play rollout, open **Protected with Play → Play Store distribution → Play app signing** in Play Console. Choose to provide a copy of the existing app-signing key and follow the Console's PEPK instructions. The local key is `~/.local/share/shareding/release.jks` with alias `shareding`; its password is in macOS Keychain under service `org.evsyukov.shareding.release`, account `shareding`. PEPK encrypts the private key for Google. Keep the keystore, password, and encrypted PEPK output out of this repository. Verify the app-signing certificate shown by Play matches the APK fingerprint above. Register the separate upload certificate at `~/.local/share/shareding/upload_certificate.pem`; its private key is in `~/.local/share/shareding/upload.jks`, alias `shareding`, and its password is in Keychain service `org.evsyukov.shareding.upload`, account `shareding`. Back up both local keys and passwords securely. - -The workflow's upload secrets are `SHAREDING_UPLOAD_KEYSTORE_B64` and `SHAREDING_UPLOAD_PASSWORD`. Download the verified AAB from the release workflow artifact for manual Console upload. Keep the APK from the GitHub Release for GitHub/F-Droid users. Do not upload the APK to Play as the release artifact. - -## Listing and App content - -- Use the English title, short description, full description, icon, feature graphic, screenshots, and release notes under [`fastlane/metadata/android/en-US`](../fastlane/metadata/android/en-US/). The icon is 512 × 512 PNG, the feature graphic is 1024 × 500 PNG, and the three phone screenshots are 1200 × 2400 PNG. -- Set the public privacy policy URL to `https://github.com/juev/shareding/blob/main/docs/privacy.md` and privacy contact to `denis@evsyukov.org`. Check that the URL opens without a GitHub login after the release commit reaches `main`; the app's About screen opens the same page. -- Complete App access, Data safety, ads, target audience, content rating, and any other declarations shown by Console. The app has no advertising or analytics SDK, stores its queue and settings locally, and sends the token and bookmark fields to the user-configured HTTPS linkding server. It may fetch HTTP bookmark pages without TLS, and it requests links from known URL shorteners to find their targets; those requests carry no token or credentials. The app has no proxy setting. Use these facts when answering Console questions; review the exact wording of each question before submitting answers. Do not describe all app traffic as encrypted. -- In App access, explain in English how a reviewer gets a stable test API token and HTTPS URL for the existing publicly reachable linkding instance. Use a dedicated account with a limited test library, verify that login and API access work without VPN or regional restrictions, and keep it available through review. Enter the actual URL and token directly in Console, not in this repository. - -## Testing and rollout - -1. Upload the signed AAB to internal testing. Install it from Play, check bookmark sync against the reviewer instance, and check an update over a release APK. A successful update confirms that Play used the existing app-signing key and preserved local settings and queued bookmarks. Compare the Play app-signing fingerprint with the existing APK fingerprint. -2. Start closed testing and invite at least 12 people who have Google accounts. Google provides the track and opt-in link; the developer recruits testers. Keep 12 or more people opted in continuously for 14 days, gather actual feedback, and fix blocking issues with a higher version code. Invite a buffer of 15–20 willing testers to cover opt-outs. -3. When Console allows it, apply for production access and answer its testing questions with actual results. After approval, submit a production release and confirm the public listing, install, and signer. The account may have an additional device verification task in Console. - -Google's current instructions: [Play App Signing](https://support.google.com/googleplay/android-developer/answer/9842756), [testing for new personal accounts](https://support.google.com/googleplay/android-developer/answer/14151465), [User Data policy](https://support.google.com/googleplay/android-developer/answer/10144311). diff --git a/docs/images/settings.png b/docs/images/settings.png index 8ae1bef..b7e8f2a 100644 Binary files a/docs/images/settings.png and b/docs/images/settings.png differ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png index df114ce..5e6f911 100644 Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png and b/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png differ