From 905461c242c02e76f293bd72bc19147ac4a8e7a4 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Fri, 25 Oct 2024 17:54:34 -0400 Subject: [PATCH 1/5] Update a field label --- lib/pages/add_app.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pages/add_app.dart b/lib/pages/add_app.dart index 851c0b7..4c552c2 100644 --- a/lib/pages/add_app.dart +++ b/lib/pages/add_app.dart @@ -545,7 +545,7 @@ class AddAppPageState extends State { items: [ [ GeneratedFormTextField('appId', - label: tr('appId'), + label: '${tr('appId')} - ${tr('custom')}', required: false, additionalValidators: [ (value) { From ac6f8c456d4f0c4dca75ec0a42172c7a644b7dd0 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Fri, 25 Oct 2024 17:59:26 -0400 Subject: [PATCH 2/5] Sort pl.json entries --- assets/translations/pl.json | 125 +++++++++++++++++------------------- 1 file changed, 58 insertions(+), 67 deletions(-) diff --git a/assets/translations/pl.json b/assets/translations/pl.json index 6de564d..9bbf36f 100644 --- a/assets/translations/pl.json +++ b/assets/translations/pl.json @@ -22,6 +22,9 @@ "requiredInBrackets": "(Wymagane)", "dropdownNoOptsError": "BŁĄD: LISTA ROZWIJANA MUSI MIEĆ CO NAJMNIEJ JEDNĄ OPCJĘ", "colour": "Kolor", + "standard": "Domyślny", + "custom": "Własny", + "useMaterialYou": "Material You", "githubStarredRepos": "Repozytoria GitHub oznaczone gwiazdką", "uname": "Nazwa użytkownika", "wrongArgNum": "Nieprawidłowa liczba podanych argumentów", @@ -51,9 +54,8 @@ "percentProgress": "Postęp: {}%", "pleaseWait": "Proszę czekać", "updateAvailable": "Dostępna aktualizacja", - "estimateInBracketsShort": "(Szac.)", "notInstalled": "Nie zainstalowano", - "estimateInBrackets": "(Szacunkowo)", + "pseudoVersion": "pseudo-wersja", "selectAll": "Zaznacz wszystkie", "deselectX": "Odznacz {}", "xWillBeRemovedButRemainInstalled": "{} zostanie usunięty z Obtainium, ale pozostanie zainstalowany na urządzeniu.", @@ -73,13 +75,14 @@ "unpinFromTop": "Odepnij", "resetInstallStatusForSelectedAppsQuestion": "Zresetować status instalacji dla wybranych aplikacji?", "installStatusOfXWillBeResetExplanation": "Stan instalacji wybranych aplikacji zostanie zresetowany.\n\nMoże być to pomocne, gdy wersja aplikacji wyświetlana w Obtainium jest nieprawidłowa z powodu nieudanych aktualizacji lub innych problemów.", + "customLinkMessage": "Te linki działają na urządzeniach z zainstalowanym Obtainium", + "shareAppConfigLinks": "Udostępnij konfigurację aplikacji w formie linku", "shareSelectedAppURLs": "Udostępnij wybrane adresy URL aplikacji", "resetInstallStatus": "Zresetuj stan instalacji", "more": "Więcej", "removeOutdatedFilter": "Usuń filtr nieaktualnych aplikacji", "showOutdatedOnly": "Pokaż tylko nieaktualne aplikacje", "filter": "FIltr", - "filterActive": "Filtruj *", "filterApps": "Filtruj aplikacje", "appName": "Nazwa aplikacji", "author": "Autor", @@ -103,7 +106,6 @@ "importErrors": "Błędy importowania", "importedXOfYApps": "Zaimportowano {} z {} aplikacji.", "followingURLsHadErrors": "Następujące adresy URL zawierały błędy:", - "okay": "Okej", "selectURL": "Wybierz adres URL", "selectURLs": "Wybierz adresy URL", "pick": "Wybierz", @@ -111,8 +113,7 @@ "dark": "Ciemny", "light": "Jasny", "followSystem": "Zgodny z systemem", - "obtainium": "Obtainium", - "materialYou": "Material You", + "followSystemThemeExplanation": "Podążanie za motywem systemowym jest możliwe tylko przy użyciu aplikacji firm trzecich", "useBlackTheme": "Użyj czarnego motywu", "appSortBy": "Sortuj aplikacje według", "authorName": "Autor/Nazwa", @@ -146,8 +147,10 @@ "noNewUpdates": "Brak nowych aktualizacji.", "xHasAnUpdate": "{} ma aktualizację.", "appsUpdated": "Zaktualizowano aplikacje", + "appsNotUpdated": "Nie udało się zaktualizować aplikacji", "appsUpdatedNotifDescription": "Informuje, gdy co najmniej jedna aplikacja została zaktualizowana w tle", "xWasUpdatedToY": "{} zaktualizowano do {}.", + "xWasNotUpdatedToY": "Błąd aktualizacji {} do {}.", "errorCheckingUpdates": "Błąd sprawdzania aktualizacji", "errorCheckingUpdatesNotifDescription": "Jest wyświetlane, gdy sprawdzanie aktualizacji w tle nie powiedzie się", "appsRemoved": "Usunięte aplikacje", @@ -176,7 +179,6 @@ "appWithIdOrNameNotFound": "Nie znaleziono aplikacji o tym identyfikatorze lub nazwie", "reposHaveMultipleApps": "Repozytoria mogą zawierać wiele aplikacji", "fdroidThirdPartyRepo": "Zewnętrzne repo F-Droid", - "steam": "Steam", "steamMobile": "Mobilny Steam", "steamChat": "Steam Chat", "install": "Instaluj", @@ -187,6 +189,9 @@ "disableVersionDetection": "Wyłącz wykrywanie wersji", "noVersionDetectionExplanation": "Opcja ta powinna być używana tylko w przypadku aplikacji, w których wykrywanie wersji nie działa poprawnie.", "downloadingX": "Pobieranie {}", + "downloadX": "Pobierz {}", + "downloadedX": "Pobrano {}", + "releaseAsset": "Wydany pakiet", "downloadNotifDescription": "Informuje o postępach w pobieraniu aplikacji", "noAPKFound": "Nie znaleziono pakietu APK", "noVersionDetection": "Bez wykrywania wersji", @@ -208,10 +213,12 @@ "uninstallFromDevice": "Odinstaluj z urządzenia", "onlyWorksWithNonVersionDetectApps": "Działa tylko w przypadku aplikacji z wyłączonym wykrywaniem wersji.", "releaseDateAsVersion": "Użyj daty wydania jako wersji", + "releaseTitleAsVersion": "Używaj nazwy wydania jako ciągu wersji", "releaseDateAsVersionExplanation": "Opcja ta powinna być używana tylko w przypadku aplikacji, w których wykrywanie wersji nie działa poprawnie, ale dostępna jest data wydania.", "changes": "Zmiany", "releaseDate": "Data wydania", "importFromURLsInFile": "Importuj z adresów URL w pliku (typu OPML)", + "versionDetectionExplanation": "Uzgodnij ciąg wersji z wersją wykrytą przez system operacyjny", "versionDetection": "Wykrywanie wersji", "standardVersionDetection": "Standardowe wykrywanie wersji", "groupByCategory": "Grupuj według kategorii", @@ -235,8 +242,7 @@ "addInfoBelow": "Dodaj tę informację poniżej.", "addInfoInSettings": "Dodaj tę informację w Ustawieniach.", "githubSourceNote": "Limit żądań GitHub można ominąć za pomocą klucza API.", - "gitlabSourceNote": "Pozyskiwanie pliku APK z GitLab może nie działać bez klucza API.", - "sortByFileNamesNotLinks": "Sortuj wg nazw plików zamiast pełnych linków", + "sortByLastLinkSegment": "Sortuj tylko według ostatniego segmentu łącza", "filterReleaseNotesByRegEx": "Filtruj informacje o wersji według wyrażenia regularnego", "customLinkFilterRegex": "Filtruj linki APK według wyrażenia regularnego (domyślnie \".apk$\")", "appsPossiblyUpdated": "Aplikacje mogły zostać zaktualizowane", @@ -247,19 +253,27 @@ "backgroundUpdateLimitsExplanation": "Powodzenie instalacji w tle można określić dopiero po otwarciu Obtainium.", "verifyLatestTag": "Zweryfikuj najnowszy tag", "intermediateLinkRegex": "Filtr linków \"pośrednich\" do odwiedzenia w pierwszej kolejności", + "filterByLinkText": "Filtruj linki według tekstu linku", "intermediateLinkNotFound": "Nie znaleziono linku pośredniego", + "intermediateLink": "Link pośredni", "exemptFromBackgroundUpdates": "Wyklucz z uaktualnień w tle (jeśli są włączone)", "bgUpdatesOnWiFiOnly": "Wyłącz aktualizacje w tle, gdy nie ma połączenia z Wi-Fi", + "bgUpdatesWhileChargingOnly": "Wyłącz aktualizacje w tle, gdy urządzenie nie jest ładowane", "autoSelectHighestVersionCode": "Automatycznie wybierz najwyższy kod wersji APK", "versionExtractionRegEx": "Wyrażenie regularne wyodrębniające wersję", + "trimVersionString": "Przytnij ciąg wersji za pomocą RegEx", + "matchGroupToUseForX": "Dopasuj grupę do użycia dla \"{}\"", "matchGroupToUse": "Dopasuj grupę do użycia dla wyrażenia regularnego wyodrębniania wersji", "highlightTouchTargets": "Wyróżnij mniej oczywiste elementy dotykowe", "pickExportDir": "Wybierz katalog eksportu", "autoExportOnChanges": "Automatyczny eksport po wprowadzeniu zmian", + "includeSettings": "Dołącz ustawienia", "filterVersionsByRegEx": "Filtruj wersje według wyrażenia regularnego", "trySelectingSuggestedVersionCode": "Spróbuj wybierać sugerowany kod wersji APK", "dontSortReleasesList": "Utrzymaj kolejność wydań z interfejsu API", "reverseSort": "Odwrotne sortowanie", + "takeFirstLink": "Wykorzystaj pierwszy link", + "skipSort": "Pomiń sortowanie", "debugMenu": "Menu debugowania", "bgTaskStarted": "Uruchomiono zadanie w tle - sprawdź logi.", "runBgCheckNow": "Wymuś sprawdzenie aktualizacji w tle", @@ -277,6 +291,34 @@ "onlyCheckInstalledOrTrackOnlyApps": "Sprawdzaj tylko zainstalowane i obserwowane aplikacje pod kątem aktualizacji", "supportFixedAPKURL": "Obsługuj stałe adresy URL APK", "selectX": "Wybierz {}", + "parallelDownloads": "Zezwalaj na równoległe pobierania", + "useShizuku": "Użyj Shizuku lub Sui, aby zainstalować", + "shizukuBinderNotFound": "Usługa Shizuku nie działa", + "shizukuOld": "Stara wersja Shizuku (<11) - zaktualizuj ją", + "shizukuOldAndroidWithADB": "Shizuku przez ADB działa na Androidzie 8.1+. Zaktualizuj Androida lub użyj zamiast tego Sui", + "shizukuPretendToBeGooglePlay": "Ustaw Google Play jako źródło instalacji (jeśli używana jest aplikacja Shizuku)", + "useSystemFont": "Czcionka systemowa", + "useVersionCodeAsOSVersion": "Użyj versionCode aplikacji jako wersji wykrytej przez system operacyjny", + "requestHeader": "Nagłówek żądania", + "useLatestAssetDateAsReleaseDate": "Użyj najnowszego przesłanego zasobu jako daty wydania", + "defaultPseudoVersioningMethod": "Domyślna metoda pseudo-wersji", + "partialAPKHash": "Częściowy Hash pliku apk", + "APKLinkHash": "Link Hash pliku apk", + "directAPKLink": "Bezpośredni link do pliku apk", + "pseudoVersionInUse": "Pseudo-wersja jest w użyciu", + "installed": "Zainstalowano", + "latest": "Najnowsza", + "invertRegEx": "Odwróć wyrażenie regularne", + "note": "Uwaga", + "selfHostedNote": "Wybierz \"{}\", aby uzyskać dostęp do samodzielnie hostowanych lub niestandardowych instancji dowolnego źródła.", + "badDownload": "Nie można przeanalizować pliku apk (jest niekompatybilny lub częściowo pobrany)", + "beforeNewInstallsShareToAppVerifier": "Udostępnij nowe aplikacje za pomocą weryfikatora aplikacji (jeśli jest dostępny)", + "appVerifierInstructionToast": "Udostępnij do weryfikatora aplikacji, a następnie wróć tutaj.", + "wiki": "Pomoc/Wiki", + "crowdsourcedConfigsLabel": "Baza konfiguracji", + "crowdsourcedConfigsShort": "Baza konfiguracji", + "allowInsecure": "Zezwalaj na niezabezpieczone żądania HTTP", + "stayOneVersionBehind": "Pozostań jedną wersję w tyle za najnowszą", "removeAppQuestion": { "one": "Usunąć aplikację?", "few": "Usunąć aplikacje?", @@ -349,73 +391,22 @@ "many": "{} i {} innych apek zostało zaktualizowanych.", "other": "{} i {} inne apki zostały zaktualizowane." }, - "xAndNMoreUpdatesPossiblyInstalled": { - "one": "{} i 1 inna apka mogły zostać zaktualizowane.", - "few": "{} i {} inne apki mogły zostać zaktualizowane.", - "many": "{} i {} innych apek mogło zostać zaktualizowanych.", - "other": "{} i {} inne apki mogły zostać zaktualizowane." - }, - "pseudoVersion": "pseudo-wersja", - "customLinkMessage": "Te linki działają na urządzeniach z zainstalowanym Obtainium", - "shareAppConfigLinks": "Udostępnij konfigurację aplikacji w formie linku", - "directAPKLink": "Bezpośredni link do pliku apk", - "pseudoVersionInUse": "Pseudo-wersja jest w użyciu", - "installed": "Zainstalowano", - "latest": "Najnowsza", - "invertRegEx": "Odwróć wyrażenie regularne", - "note": "Uwaga", - "standard": "Domyślny", - "custom": "Własny", - "useMaterialYou": "Material You", - "followSystemThemeExplanation": "Podążanie za motywem systemowym jest możliwe tylko przy użyciu aplikacji firm trzecich", - "appsNotUpdated": "Nie udało się zaktualizować aplikacji", - "xWasNotUpdatedToY": "Błąd aktualizacji {} do {}.", - "downloadX": "Pobierz {}", - "downloadedX": "Pobrano {}", - "releaseAsset": "Wydany pakiet", - "versionDetectionExplanation": "Uzgodnij ciąg wersji z wersją wykrytą przez system operacyjny", - "releaseTitleAsVersion": "Używaj nazwy wydania jako ciągu wersji", - "sortByLastLinkSegment": "Sortuj tylko według ostatniego segmentu łącza", - "filterByLinkText": "Filtruj linki według tekstu linku", - "intermediateLink": "Link pośredni", - "bgUpdatesWhileChargingOnly": "Wyłącz aktualizacje w tle, gdy urządzenie nie jest ładowane", - "trimVersionString": "Przytnij ciąg wersji za pomocą RegEx", - "matchGroupToUseForX": "Dopasuj grupę do użycia dla \"{}\"", - "includeSettings": "Dołącz ustawienia", - "takeFirstLink": "Wykorzystaj pierwszy link", - "skipSort": "Pomiń sortowanie", - "parallelDownloads": "Zezwalaj na równoległe pobierania", - "useShizuku": "Użyj Shizuku lub Sui, aby zainstalować", - "shizukuBinderNotFound": "Usługa Shizuku nie działa", - "shizukuOld": "Stara wersja Shizuku (<11) - zaktualizuj ją", - "shizukuOldAndroidWithADB": "Shizuku przez ADB działa na Androidzie 8.1+. Zaktualizuj Androida lub użyj zamiast tego Sui", - "shizukuPretendToBeGooglePlay": "Ustaw Google Play jako źródło instalacji (jeśli używana jest aplikacja Shizuku)", - "useSystemFont": "Czcionka systemowa", - "useVersionCodeAsOSVersion": "Użyj versionCode aplikacji jako wersji wykrytej przez system operacyjny", - "requestHeader": "Nagłówek żądania", - "useLatestAssetDateAsReleaseDate": "Użyj najnowszego przesłanego zasobu jako daty wydania", - "defaultPseudoVersioningMethod": "Domyślna metoda pseudo-wersji", - "partialAPKHash": "Częściowy Hash pliku apk", - "APKLinkHash": "Link Hash pliku apk", - "selfHostedNote": "Wybierz \"{}\", aby uzyskać dostęp do samodzielnie hostowanych lub niestandardowych instancji dowolnego źródła.", - "badDownload": "Nie można przeanalizować pliku apk (jest niekompatybilny lub częściowo pobrany)", - "beforeNewInstallsShareToAppVerifier": "Udostępnij nowe aplikacje za pomocą weryfikatora aplikacji (jeśli jest dostępny)", - "appVerifierInstructionToast": "Udostępnij do weryfikatora aplikacji, a następnie wróć tutaj.", - "wiki": "Pomoc/Wiki", - "crowdsourcedConfigsLabel": "Baza konfiguracji", - "crowdsourcedConfigsShort": "Baza konfiguracji", - "allowInsecure": "Zezwalaj na niezabezpieczone żądania HTTP", - "stayOneVersionBehind": "Pozostań jedną wersję w tyle za najnowszą", "xAndNMoreUpdatesFailed": { "one": "Błąd aktualizacji {} i 1 innej apki.", "few": "Błąd aktualizacji {} i {} innych apek.", "many": "Błąd aktualizacji {} i {} innych apek.", "other": "Błąd aktualizacji {} i {} innych apek." }, + "xAndNMoreUpdatesPossiblyInstalled": { + "one": "{} i 1 inna apka mogły zostać zaktualizowane.", + "few": "{} i {} inne apki mogły zostać zaktualizowane.", + "many": "{} i {} innych apek mogło zostać zaktualizowanych.", + "other": "{} i {} inne apki mogły zostać zaktualizowane." + }, "apk": { "one": "{} apk", "few": "{} apki", "many": "{} apek", "other": "{} apki" } -} \ No newline at end of file +} From 58710093ba8de48f97e46289fcf19b98bf598de0 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Fri, 25 Oct 2024 18:02:53 -0400 Subject: [PATCH 3/5] Add an exception to the translations/standardize.js --- assets/translations/standardize.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/assets/translations/standardize.js b/assets/translations/standardize.js index f852654..b077689 100644 --- a/assets/translations/standardize.js +++ b/assets/translations/standardize.js @@ -12,7 +12,8 @@ const neverAutoTranslate = { root: ['*'], obtainiumExportHyphenatedLowercase: ['*'], theme: ['de'], - appId: ['de'] + appId: ['de'], + placeholder: ['pl'] } const translateText = async (text, targetLang, authKey) => { From 8276a809a56487be569d73a2f00a009fa840d180 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Thu, 31 Oct 2024 19:50:04 -0400 Subject: [PATCH 4/5] Update packages, Flutter --- .flutter | 2 +- pubspec.lock | 40 ++++++++++++++++++++-------------------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/.flutter b/.flutter index 2663184..6031040 160000 --- a/.flutter +++ b/.flutter @@ -1 +1 @@ -Subproject commit 2663184aa79047d0a33a14a3b607954f8fdd8730 +Subproject commit 603104015dd692ea3403755b55d07813d5cf8965 diff --git a/pubspec.lock b/pubspec.lock index 81eba27..85b44dd 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -111,10 +111,10 @@ packages: dependency: "direct main" description: name: battery_plus - sha256: "4b6dc87ffa72f8d1e63ae17c8700ee374a462e521f0152e2c76cfff484610764" + sha256: "220c8f1961efb01d6870493b5ac5a80afaeaffc8757f7a11ed3025a8570d29e7" url: "https://pub.dev" source: hosted - version: "6.1.0" + version: "6.2.0" battery_plus_platform_interface: dependency: transitive description: @@ -151,10 +151,10 @@ packages: dependency: transitive description: name: cli_util - sha256: c05b7406fdabc7a49a3929d4af76bcaccbbffcbcdcf185b082e1ae07da323d19 + sha256: ff6785f7e9e3c38ac98b2fb035701789de90154024a75b6cb926445e83197d1c url: "https://pub.dev" source: hosted - version: "0.4.1" + version: "0.4.2" clock: dependency: transitive description: @@ -207,10 +207,10 @@ packages: dependency: transitive description: name: csslib - sha256: "706b5707578e0c1b4b7550f64078f0a0f19dec3f50a178ffae7006b0a9ca58fb" + sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e" url: "https://pub.dev" source: hosted - version: "1.0.0" + version: "1.0.2" cupertino_icons: dependency: "direct main" description: @@ -420,10 +420,10 @@ packages: dependency: "direct main" description: name: flutter_local_notifications - sha256: "49eeef364fddb71515bc78d5a8c51435a68bccd6e4d68e25a942c5e47761ae71" + sha256: "674173fd3c9eda9d4c8528da2ce0ea69f161577495a9cc835a2a4ecd7eadeb35" url: "https://pub.dev" source: hosted - version: "17.2.3" + version: "17.2.4" flutter_local_notifications_linux: dependency: transitive description: @@ -449,10 +449,10 @@ packages: dependency: "direct main" description: name: flutter_markdown - sha256: bd9c475d9aae256369edacafc29d1e74c81f78a10cdcdacbbbc9e3c43d009e4a + sha256: f0e599ba89c9946c8e051780f0ec99aba4ba15895e0380a7ab68f420046fc44e url: "https://pub.dev" source: hosted - version: "0.7.4" + version: "0.7.4+1" flutter_plugin_android_lifecycle: dependency: transitive description: @@ -515,10 +515,10 @@ packages: dependency: "direct main" description: name: html - sha256: "3a7812d5bcd2894edf53dfaf8cd640876cf6cef50a8f238745c8b8120ea74d3a" + sha256: "1fc58edeaec4307368c60d59b7e15b9d658b57d7f3125098b6294153c75337ec" url: "https://pub.dev" source: hosted - version: "0.15.4" + version: "0.15.5" http: dependency: "direct main" description: @@ -659,10 +659,10 @@ packages: dependency: "direct main" description: name: path_provider - sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378 + sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.1.5" path_provider_android: dependency: transitive description: @@ -819,10 +819,10 @@ packages: dependency: "direct main" description: name: share_plus - sha256: "334fcdf0ef9c0df0e3b428faebcac9568f35c747d59831474b2fc56e156d244e" + sha256: "3af2cda1752e5c24f2fc04b6083b40f013ffe84fb90472f30c6499a9213d5442" url: "https://pub.dev" source: hosted - version: "10.1.0" + version: "10.1.1" share_plus_platform_interface: dependency: transitive description: @@ -1049,10 +1049,10 @@ packages: dependency: transitive description: name: url_launcher_android - sha256: "8fc3bae0b68c02c47c5c86fa8bfa74471d42687b0eded01b78de87872db745e2" + sha256: "6fc2f56536ee873eeb867ad176ae15f304ccccc357848b351f6f0d8d4a40d193" url: "https://pub.dev" source: hosted - version: "6.3.12" + version: "6.3.14" url_launcher_ios: dependency: transitive description: @@ -1169,10 +1169,10 @@ packages: dependency: transitive description: name: win32 - sha256: "2735daae5150e8b1dfeb3eb0544b4d3af0061e9e82cef063adcd583bdae4306a" + sha256: "10169d3934549017f0ae278ccb07f828f9d6ea21573bab0fb77b0e1ef0fce454" url: "https://pub.dev" source: hosted - version: "5.7.0" + version: "5.7.2" win32_registry: dependency: transitive description: From 8cab348eedb9cee42fcbe510d691e8b18420eac9 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Fri, 1 Nov 2024 11:24:51 -0400 Subject: [PATCH 5/5] Build online but do not sign --- .github/workflows/release.yml | 38 ++++--------------- .github/workflows/temp.yml | 71 ----------------------------------- sign.sh | 38 +++++++++++++++++++ 3 files changed, 46 insertions(+), 101 deletions(-) delete mode 100644 .github/workflows/temp.yml create mode 100755 sign.sh diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index bc88098..022f8c1 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -6,9 +6,6 @@ on: beta: type: boolean description: Is beta? - draft: - type: boolean - description: Is draft? jobs: build: @@ -27,13 +24,6 @@ jobs: id: flutter_doctor run: | flutter doctor -v - - - name: Import GPG key - id: import_pgp_key - uses: crazy-max/ghaction-import-gpg@v6 - with: - gpg_private_key: ${{ secrets.PGP_KEY_BASE64 }} - passphrase: ${{ secrets.PGP_PASSPHRASE }} - name: Check submodule id: check_submodule @@ -57,24 +47,13 @@ jobs: for file in build/app/outputs/flutter-apk/app-*normal*.apk*; do mv "$file" "${file//-normal/}"; done flutter build apk --flavor fdroid -t lib/main_fdroid.dart && flutter build apk --split-per-abi --flavor fdroid -t lib/main_fdroid.dart rm ./build/app/outputs/flutter-apk/*.sha1 + cp ./sign.sh ./build/app/outputs/flutter-apk/ ls -l ./build/app/outputs/flutter-apk/ - - - name: Sign APKs - env: - KEYSTORE_BASE64: ${{ secrets.KEYSTORE_BASE64 }} - KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }} - PGP_PASSPHRASE: ${{ secrets.PGP_PASSPHRASE }} - run: | - echo "${KEYSTORE_BASE64}" | base64 -d > apksign.keystore - for apk in ./build/app/outputs/flutter-apk/*-release*.apk; do - unsignedFn=${apk/-release/-unsigned} - mv "$apk" "$unsignedFn" - ${ANDROID_HOME}/build-tools/$(ls ${ANDROID_HOME}/build-tools/ | tail -1)/apksigner sign --ks apksign.keystore --ks-pass pass:"${KEYSTORE_PASSWORD}" --out "${apk}" "${unsignedFn}" - sha256sum ${apk} | cut -d " " -f 1 > "$apk".sha256 - gpg --batch --pinentry-mode loopback --passphrase "${PGP_PASSPHRASE}" --sign --detach-sig "$apk".sha256 - done - rm apksign.keystore - PGP_KEY_FINGERPRINT="${{ steps.import_pgp_key.outputs.fingerprint }}" + + - name: Save Unsigned APKs as Action Artifacts + uses: actions/upload-artifact@v4 + with: + path: build/app/outputs/flutter-apk/* - name: Create Tag uses: mathieudutour/github-tag-action@v6.1 @@ -83,12 +62,11 @@ jobs: custom_tag: "${{ steps.extract_version.outputs.tag }}" tag_prefix: "" - - name: Create Release And Upload APKs + - name: Create Draft Release uses: ncipollo/release-action@v1 with: token: ${{ secrets.GH_ACCESS_TOKEN }} tag: "${{ steps.extract_version.outputs.tag }}" prerelease: "${{ steps.extract_version.outputs.beta }}" - draft: "${{ inputs.draft }}" - artifacts: ./build/app/outputs/flutter-apk/*-release*.apk* + draft: "true" generateReleaseNotes: true diff --git a/.github/workflows/temp.yml b/.github/workflows/temp.yml deleted file mode 100644 index 587a1fb..0000000 --- a/.github/workflows/temp.yml +++ /dev/null @@ -1,71 +0,0 @@ -name: Playing around (temp) - -on: - workflow_dispatch: - inputs: - beta: - type: boolean - description: Is beta? - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - - uses: actions/checkout@v3 - - uses: subosito/flutter-action@v2 - - uses: actions/setup-java@v4 - with: - distribution: 'temurin' # See 'Supported distributions' for available options - java-version: '17' - - - name: Flutter Doctor - id: flutter_doctor - run: | - flutter doctor -v - - - name: Check submodule - id: check_submodule - run: | - git checkout ${{ inputs.checkout }} - - - name: Extract Version - id: extract_version - run: | - VERSION=$(grep -oP "^version: [^\+]+" pubspec.yaml | tail -c +10) - echo "version=$VERSION" >> $GITHUB_OUTPUT - if [ ${{ inputs.beta }} == true ]; then BETA=true; else BETA=false; fi - echo "beta=$BETA" >> $GITHUB_OUTPUT - TAG="v$VERSION" - echo "tag=$TAG" >> $GITHUB_OUTPUT - - - name: Build APKs - run: | - sed -i 's/signingConfig signingConfigs.release//g' android/app/build.gradle - flutter build apk --flavor normal && flutter build apk --split-per-abi --flavor normal - for file in build/app/outputs/flutter-apk/app-*normal*.apk*; do mv "$file" "${file//-normal/}"; done - flutter build apk --flavor fdroid -t lib/main_fdroid.dart && flutter build apk --split-per-abi --flavor fdroid -t lib/main_fdroid.dart - rm ./build/app/outputs/flutter-apk/*.sha1 - ls -l ./build/app/outputs/flutter-apk/ - - - name: Save Unsigned APKs as Action Artifacts - uses: actions/upload-artifact@v4 - with: - path: build/app/outputs/flutter-apk/* - - #- name: Create Tag - # uses: mathieudutour/github-tag-action@v6.1 - # with: - # github_token: ${{ secrets.GH_ACCESS_TOKEN }} - # custom_tag: "${{ steps.extract_version.outputs.tag }}" - # tag_prefix: "" - - #- name: Create Draft Release - # uses: ncipollo/release-action@v1 - # with: - # token: ${{ secrets.GH_ACCESS_TOKEN }} - # tag: "${{ steps.extract_version.outputs.tag }}" - # prerelease: "${{ steps.extract_version.outputs.beta }}" - # draft: "true" - # generateReleaseNotes: true diff --git a/sign.sh b/sign.sh new file mode 100755 index 0000000..00bd038 --- /dev/null +++ b/sign.sh @@ -0,0 +1,38 @@ +#!/bin/bash +set -e + +# Script to sign unsigned APKs +# Assumptions: +# 1. Your PGP key is already imported on the locally running agent +# 2. An Android SDK is located at $ANDROID_HOME (or ~/Android/Sdk as fallback) + +usage() { + echo "sign.sh " + exit 1 +} + +if [ -z "$1" ] || [ -z "$2" ] || [ ! -f "$1" ] || [ ! -d "$2" ]; then + usage +fi + +KEYSTORE_LOCATION="$1" +BUILD_DIR="$2" + +read -s -p "Enter your keystore password: " KEYSTORE_PASSWORD + +if [ -z "$ANDROID_HOME" ]; then + ANDROID_HOME=~/Android/Sdk +fi +if [ ! -d "$ANDROID_HOME" ]; then + echo "Could not find Android SDK!" >&2 + exit 1 +fi + +for apk in "$BUILD_DIR"/*-release*.apk; do + unsignedApk=${apk/-release/-unsigned} + mv "$apk" "$unsignedApk" + ${ANDROID_HOME}/build-tools/$(ls ${ANDROID_HOME}/build-tools/ | tail -1)/apksigner sign --ks "$KEYSTORE_LOCATION" --ks-pass pass:"${KEYSTORE_PASSWORD}" --out "${apk}" "${unsignedApk}" + sha256sum ${apk} | cut -d " " -f 1 >"$apk".sha256 + gpg --batch --sign --detach-sig "$apk".sha256 + rm "$unsignedApk" +done