mirror of
https://github.com/ImranR98/Obtainium.git
synced 2025-08-29 01:09:30 +02:00
Compare commits
35 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
0e2a0b65ec | ||
|
5b79f399d1 | ||
|
2961d5ac17 | ||
|
4af4160aaa | ||
|
327f73cc9e | ||
|
e82170fec6 | ||
|
8922b1c048 | ||
|
e9550c6ff0 | ||
|
890c3682c4 | ||
|
a2c38968e1 | ||
|
a9c3ee4c54 | ||
|
36db226024 | ||
|
6fbdf62afa | ||
|
9344ebbb06 | ||
|
51b66ab983 | ||
|
7f2a9b6fa5 | ||
|
ac6bc4d786 | ||
|
acd30b516c | ||
|
5bc9234101 | ||
|
80d15f5232 | ||
|
eb7c2a9fc4 | ||
|
40175468b2 | ||
|
814b5a71bd | ||
|
38a1e43116 | ||
|
5064b78c79 | ||
|
767350e4e3 | ||
|
4caae51904 | ||
|
83616b7a79 | ||
|
52b2d0868c | ||
|
94f629859e | ||
|
773d3455ae | ||
|
919ab16528 | ||
|
268b89eaf6 | ||
|
9c9a264e39 | ||
|
e1e612455a |
2
.flutter
2
.flutter
Submodule .flutter updated: 603104015d...dec2ee5c1f
12
README.md
12
README.md
@@ -7,10 +7,12 @@ Get Android app updates straight from the source.
|
|||||||
Obtainium allows you to install and update apps directly from their releases pages, and receive notifications when new releases are made available.
|
Obtainium allows you to install and update apps directly from their releases pages, and receive notifications when new releases are made available.
|
||||||
|
|
||||||
More info:
|
More info:
|
||||||
- [Obtainium/wiki](https://github.com/ImranR98/Obtainium/wiki)
|
- [Obtainium Wiki](https://wiki.obtainium.imranr.dev/) ([repository](https://github.com/ImranR98/Obtainium-Wiki))
|
||||||
- [AppVerifier](https://github.com/soupslurpr/AppVerifier) - App verification tool (recommended, integrates with Obtainium)
|
- [AppVerifier](https://github.com/soupslurpr/AppVerifier) - App verification tool (recommended, integrates with Obtainium)
|
||||||
- [apps.obtainium.imranr.dev](https://apps.obtainium.imranr.dev/) - Crowdsourced app configurations
|
- [apps.obtainium.imranr.dev](https://apps.obtainium.imranr.dev/) - Crowdsourced app configurations ([repository](https://github.com/ImranR98/apps.obtainium.imranr.dev))
|
||||||
- [Side Of Burritos - You should use this instead of F-Droid | How to use app RSS feed](https://youtu.be/FFz57zNR_M0) - Original motivation for this app
|
- [Side Of Burritos - You should use this instead of F-Droid | How to use app RSS feed](https://youtu.be/FFz57zNR_M0) - Original motivation for this app
|
||||||
|
- [Website](https://obtainium.imranr.dev) ([repository](https://github.com/ImranR98/obtainium.imranr.dev))
|
||||||
|
- [Source code](https://github.com/ImranR98/Obtainium)
|
||||||
|
|
||||||
Currently supported App sources:
|
Currently supported App sources:
|
||||||
- Open Source - General:
|
- Open Source - General:
|
||||||
@@ -58,7 +60,11 @@ Or, contribute some configurations to the website by creating a PR at [this repo
|
|||||||
alt="Get it on F-Droid"
|
alt="Get it on F-Droid"
|
||||||
height="80">](https://f-droid.org/packages/dev.imranr.obtainium.fdroid/)
|
height="80">](https://f-droid.org/packages/dev.imranr.obtainium.fdroid/)
|
||||||
|
|
||||||
[PGP Public Key](https://keyserver.ubuntu.com/pks/lookup?search=contact%40imranr.dev&fingerprint=on&op=index)
|
Verification info:
|
||||||
|
- Package ID: `dev.imranr.obtainium`
|
||||||
|
- SHA-256 Hash of Signing Certificate: `B3:53:60:1F:6A:1D:5F:D6:60:3A:E2:F5:0B:E8:0C:F3:01:36:7B:86:B6:AB:8B:1F:66:24:3D:A9:6C:D5:73:62`
|
||||||
|
- Note: The above signature is also valid for the F-Droid flavour of Obtainium, thanks to [reproducible builds](https://f-droid.org/docs/Reproducible_Builds/).
|
||||||
|
- [PGP Public Key](https://keyserver.ubuntu.com/pks/lookup?search=contact%40imranr.dev&fingerprint=on&op=index) (to verify APK hashes)
|
||||||
|
|
||||||
## Limitations
|
## Limitations
|
||||||
- For some sources, data is gathered using Web scraping and can easily break due to changes in website design. In such cases, more reliable methods may be unavailable.
|
- For some sources, data is gathered using Web scraping and can easily break due to changes in website design. In such cases, more reliable methods may be unavailable.
|
||||||
|
@@ -114,7 +114,7 @@
|
|||||||
"light": "Hell",
|
"light": "Hell",
|
||||||
"followSystem": "System folgen",
|
"followSystem": "System folgen",
|
||||||
"followSystemThemeExplanation": "Das Folgen des Systemthemes ist unter Android < 10 nur mit Hilfe von Drittanbieterapps möglich",
|
"followSystemThemeExplanation": "Das Folgen des Systemthemes ist unter Android < 10 nur mit Hilfe von Drittanbieterapps möglich",
|
||||||
"useBlackTheme": "Pure Black Dark Theme verwenden",
|
"useBlackTheme": "Rein schwarzen Hintergrund verwenden",
|
||||||
"appSortBy": "App sortieren nach",
|
"appSortBy": "App sortieren nach",
|
||||||
"authorName": "Autor/Name",
|
"authorName": "Autor/Name",
|
||||||
"nameAuthor": "Name/Autor",
|
"nameAuthor": "Name/Autor",
|
||||||
|
@@ -258,10 +258,10 @@
|
|||||||
"bgUpdatesOnWiFiOnly": "Deshabilitar las actualizaciones en segundo plano sin WiFi",
|
"bgUpdatesOnWiFiOnly": "Deshabilitar las actualizaciones en segundo plano sin WiFi",
|
||||||
"bgUpdatesWhileChargingOnly": "Desactiva las actualizaciones en segundo plano cuando no estés cargando",
|
"bgUpdatesWhileChargingOnly": "Desactiva las actualizaciones en segundo plano cuando no estés cargando",
|
||||||
"autoSelectHighestVersionCode": "Auto selección del paquete APK con versión más reciente",
|
"autoSelectHighestVersionCode": "Auto selección del paquete APK con versión más reciente",
|
||||||
"versionExtractionRegEx": "Versión de extracción regex",
|
"versionExtractionRegEx": "Versión de extracción RegEx",
|
||||||
"trimVersionString": "Recortar cadena de versión con RegEx",
|
"trimVersionString": "Recortar cadena de versión con RegEx",
|
||||||
"matchGroupToUseForX": "Grupo de coincidencia a utilizar para \"{}\"",
|
"matchGroupToUseForX": "Grupo de coincidencia a utilizar para \"{}\"",
|
||||||
"matchGroupToUse": "Grupo a usar para versión de extracción regex",
|
"matchGroupToUse": "Grupo a usar para versión de extracción RegEx",
|
||||||
"highlightTouchTargets": "Resaltar objetivos menos obvios",
|
"highlightTouchTargets": "Resaltar objetivos menos obvios",
|
||||||
"pickExportDir": "Directorio para exportar",
|
"pickExportDir": "Directorio para exportar",
|
||||||
"autoExportOnChanges": "Auto exportar cuando haya cambios",
|
"autoExportOnChanges": "Auto exportar cuando haya cambios",
|
||||||
@@ -275,7 +275,7 @@
|
|||||||
"debugMenu": "Menu Depurar",
|
"debugMenu": "Menu Depurar",
|
||||||
"bgTaskStarted": "Iniciada tarea en segundo plano; revise los registros.",
|
"bgTaskStarted": "Iniciada tarea en segundo plano; revise los registros.",
|
||||||
"runBgCheckNow": "Ejecutar verficiación de actualizaciones en segundo plano",
|
"runBgCheckNow": "Ejecutar verficiación de actualizaciones en segundo plano",
|
||||||
"versionExtractWholePage": "Aplicar la versión de extracción regex a la página entera",
|
"versionExtractWholePage": "Aplicar la versión de extracción RegEx a la página entera",
|
||||||
"installing": "Instalando",
|
"installing": "Instalando",
|
||||||
"skipUpdateNotifications": "No notificar sobre actualizaciones",
|
"skipUpdateNotifications": "No notificar sobre actualizaciones",
|
||||||
"updatesAvailableNotifChannel": "Actualizaciones disponibles",
|
"updatesAvailableNotifChannel": "Actualizaciones disponibles",
|
||||||
@@ -310,10 +310,10 @@
|
|||||||
"note": "Nota",
|
"note": "Nota",
|
||||||
"selfHostedNote": "El desplegable «{}» puede usarse para acceder a instancias autoalojadas/personalizadas de cualquier fuente.",
|
"selfHostedNote": "El desplegable «{}» puede usarse para acceder a instancias autoalojadas/personalizadas de cualquier fuente.",
|
||||||
"badDownload": "No se ha podido analizar el APK (incompatible o descarga parcial)",
|
"badDownload": "No se ha podido analizar el APK (incompatible o descarga parcial)",
|
||||||
"beforeNewInstallsShareToAppVerifier": "Compartir aplicaciones nuevas con AppVerifier (si está disponible)",
|
"beforeNewInstallsShareToAppVerifier": "Compartir aplicaciones nuevas con AppVerifier (si está instalado)",
|
||||||
"appVerifierInstructionToast": "Comparta con AppVerifier y vuelva aquí cuando esté listo.",
|
"appVerifierInstructionToast": "Compartir con AppVerifier y vuelver aquí cuando esté listo.",
|
||||||
"wiki": "Ayuda/Wiki",
|
"wiki": "Ayuda/Wiki",
|
||||||
"crowdsourcedConfigsLabel": "Crowdsourced App Configurations (uso bajo su propia responsabilidad)",
|
"crowdsourcedConfigsLabel": "Crowdsourced App Configurations (use bajo su responsabilidad)",
|
||||||
"crowdsourcedConfigsShort": "Configuración de aplicaciones por crowdsourcing",
|
"crowdsourcedConfigsShort": "Configuración de aplicaciones por crowdsourcing",
|
||||||
"allowInsecure": "Permitir peticiones HTTP inseguras",
|
"allowInsecure": "Permitir peticiones HTTP inseguras",
|
||||||
"stayOneVersionBehind": "Mantenerse una versión por detrás de la última",
|
"stayOneVersionBehind": "Mantenerse una versión por detrás de la última",
|
||||||
|
@@ -313,8 +313,8 @@
|
|||||||
"beforeNewInstallsShareToAppVerifier": "Partager les nouvelles applications avec AppVerifier (si disponible)",
|
"beforeNewInstallsShareToAppVerifier": "Partager les nouvelles applications avec AppVerifier (si disponible)",
|
||||||
"appVerifierInstructionToast": "Partagez avec AppVerifier, puis revenez ici lorsque tout est prêt.",
|
"appVerifierInstructionToast": "Partagez avec AppVerifier, puis revenez ici lorsque tout est prêt.",
|
||||||
"wiki": "Aide/Wiki",
|
"wiki": "Aide/Wiki",
|
||||||
"crowdsourcedConfigsLabel": "Configurations d'applis communautaire (à utiliser à vos risques et périls)",
|
"crowdsourcedConfigsLabel": "Configuration d'applis communautaire (à utiliser à vos risques et périls)",
|
||||||
"crowdsourcedConfigsShort": "Configuration d'applis communautaire",
|
"crowdsourcedConfigsShort": "Applis communautaires",
|
||||||
"allowInsecure": "Autoriser les requêtes HTTP non sécurisées",
|
"allowInsecure": "Autoriser les requêtes HTTP non sécurisées",
|
||||||
"stayOneVersionBehind": "Rester à une version de la dernière",
|
"stayOneVersionBehind": "Rester à une version de la dernière",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
|
@@ -213,7 +213,7 @@
|
|||||||
"releaseDateAsVersion": "Használja a kiadás dátumát verzió-karakterláncként",
|
"releaseDateAsVersion": "Használja a kiadás dátumát verzió-karakterláncként",
|
||||||
"releaseTitleAsVersion": "Használja a kiadás címét verzió-karakterláncként",
|
"releaseTitleAsVersion": "Használja a kiadás címét verzió-karakterláncként",
|
||||||
"releaseDateAsVersionExplanation": "Ezt a beállítást csak olyan alkalmazásoknál szabad használni, ahol a verzió-érzékelés nem működik megfelelően, de elérhető a kiadás dátuma.",
|
"releaseDateAsVersionExplanation": "Ezt a beállítást csak olyan alkalmazásoknál szabad használni, ahol a verzió-érzékelés nem működik megfelelően, de elérhető a kiadás dátuma.",
|
||||||
"changes": "Változások",
|
"changes": "Változáslista",
|
||||||
"releaseDate": "Kiadás dátuma",
|
"releaseDate": "Kiadás dátuma",
|
||||||
"importFromURLsInFile": "Importálás fájlban található webcímből (pl. OPML)",
|
"importFromURLsInFile": "Importálás fájlban található webcímből (pl. OPML)",
|
||||||
"versionDetectionExplanation": "A verzió-karakterlánc egyeztetése az rendszer által érzékelt verzióval",
|
"versionDetectionExplanation": "A verzió-karakterlánc egyeztetése az rendszer által érzékelt verzióval",
|
||||||
|
@@ -147,21 +147,21 @@
|
|||||||
"noNewUpdates": "新しいアップデートはありません",
|
"noNewUpdates": "新しいアップデートはありません",
|
||||||
"xHasAnUpdate": "{} のアップデートが利用可能です。",
|
"xHasAnUpdate": "{} のアップデートが利用可能です。",
|
||||||
"appsUpdated": "アプリをアップデートしました",
|
"appsUpdated": "アプリをアップデートしました",
|
||||||
"appsNotUpdated": "アプリケーションの更新に失敗",
|
"appsNotUpdated": "アプリのアップデートに失敗しました",
|
||||||
"appsUpdatedNotifDescription": "1つまたは複数のAppのアップデートがバックグラウンドで適用されたことをユーザーに通知する",
|
"appsUpdatedNotifDescription": "1つまたは複数のAppのアップデートがバックグラウンドで適用されたことをユーザーに通知する",
|
||||||
"xWasUpdatedToY": "{} が {} にアップデートされました",
|
"xWasUpdatedToY": "{} が {} にアップデートされました",
|
||||||
"xWasNotUpdatedToY": "への更新に失敗しました。",
|
"xWasNotUpdatedToY": "{} の {} へのアップデートに失敗しました",
|
||||||
"errorCheckingUpdates": "アップデート確認中のエラー",
|
"errorCheckingUpdates": "アップデート確認中のエラー",
|
||||||
"errorCheckingUpdatesNotifDescription": "バックグラウンドでのアップデート確認に失敗した際に表示される通知",
|
"errorCheckingUpdatesNotifDescription": "バックグラウンドでのアップデート確認に失敗した際に表示される通知",
|
||||||
"appsRemoved": "削除されたアプリ",
|
"appsRemoved": "削除されたアプリ",
|
||||||
"appsRemovedNotifDescription": "アプリの読み込み中にエラーが発生したため、1つまたは複数のアプリが削除されたことをユーザーに通知する",
|
"appsRemovedNotifDescription": "アプリの読み込み中にエラーが発生したため、1つまたは複数のアプリが削除されたことをユーザーに通知する",
|
||||||
"xWasRemovedDueToErrorY": "このエラーのため、{} は削除されました: {}",
|
"xWasRemovedDueToErrorY": "このエラーのため、{} は削除されました: {}",
|
||||||
"completeAppInstallation": "アプリのインストールを完了する",
|
"completeAppInstallation": "アプリのインストールを完了する",
|
||||||
"obtainiumMustBeOpenToInstallApps": "アプリをインストールするにはObtainiumが開いている必要があります",
|
"obtainiumMustBeOpenToInstallApps": "アプリをインストールするにはObtainiumを開く必要があります",
|
||||||
"completeAppInstallationNotifDescription": "アプリのインストールを完了するために、Obtainiumに戻る必要があります",
|
"completeAppInstallationNotifDescription": "アプリのインストールを完了するために、Obtainiumに戻る必要があります",
|
||||||
"checkingForUpdates": "アップデートを確認中",
|
"checkingForUpdates": "アップデートを確認中",
|
||||||
"checkingForUpdatesNotifDescription": "アップデートを確認する際に表示される一時的な通知",
|
"checkingForUpdatesNotifDescription": "アップデートを確認する際に表示される一時的な通知",
|
||||||
"pleaseAllowInstallPerm": "Obtainiumによるアプリのインストールを許可してください。",
|
"pleaseAllowInstallPerm": "Obtainiumによるアプリのインストールを許可してください",
|
||||||
"trackOnly": "追跡のみ",
|
"trackOnly": "追跡のみ",
|
||||||
"errorWithHttpStatusCode": "エラー {}",
|
"errorWithHttpStatusCode": "エラー {}",
|
||||||
"versionCorrectionDisabled": "バージョン補正無効 (プラグインが動作していません)",
|
"versionCorrectionDisabled": "バージョン補正無効 (プラグインが動作していません)",
|
||||||
@@ -211,7 +211,7 @@
|
|||||||
"uninstallFromDevice": "デバイスからアンインストールする",
|
"uninstallFromDevice": "デバイスからアンインストールする",
|
||||||
"onlyWorksWithNonVersionDetectApps": "バージョン検出を無効にしているアプリにのみ動作します。",
|
"onlyWorksWithNonVersionDetectApps": "バージョン検出を無効にしているアプリにのみ動作します。",
|
||||||
"releaseDateAsVersion": "リリース日をバージョンとして使用する",
|
"releaseDateAsVersion": "リリース日をバージョンとして使用する",
|
||||||
"releaseTitleAsVersion": "リリースタイトルをバージョン文字列として使用",
|
"releaseTitleAsVersion": "リリースタイトルをバージョンとして使用する",
|
||||||
"releaseDateAsVersionExplanation": "このオプションは、バージョン検出が正しく機能しないアプリで、リリース日が利用可能な場合にのみ使用する必要があります。",
|
"releaseDateAsVersionExplanation": "このオプションは、バージョン検出が正しく機能しないアプリで、リリース日が利用可能な場合にのみ使用する必要があります。",
|
||||||
"changes": "変更点",
|
"changes": "変更点",
|
||||||
"releaseDate": "リリース日",
|
"releaseDate": "リリース日",
|
||||||
@@ -256,7 +256,7 @@
|
|||||||
"intermediateLink": "中間リンク",
|
"intermediateLink": "中間リンク",
|
||||||
"exemptFromBackgroundUpdates": "バックグラウンドアップデートを行わない (有効な場合)",
|
"exemptFromBackgroundUpdates": "バックグラウンドアップデートを行わない (有効な場合)",
|
||||||
"bgUpdatesOnWiFiOnly": "WiFiを使用していない場合、バックグラウンドアップデートを無効にする",
|
"bgUpdatesOnWiFiOnly": "WiFiを使用していない場合、バックグラウンドアップデートを無効にする",
|
||||||
"bgUpdatesWhileChargingOnly": "非充電時にバックグラウンド更新を無効にする",
|
"bgUpdatesWhileChargingOnly": "非充電時にバックグラウンドアップデートを無効にする",
|
||||||
"autoSelectHighestVersionCode": "最も高いバージョンコードのAPKを自動で選択する",
|
"autoSelectHighestVersionCode": "最も高いバージョンコードのAPKを自動で選択する",
|
||||||
"versionExtractionRegEx": "バージョン抽出の正規表現",
|
"versionExtractionRegEx": "バージョン抽出の正規表現",
|
||||||
"trimVersionString": "正規表現でバージョン文字列をトリムする",
|
"trimVersionString": "正規表現でバージョン文字列をトリムする",
|
||||||
@@ -316,7 +316,7 @@
|
|||||||
"crowdsourcedConfigsLabel": "クラウドソーシングによるアプリの設定(利用は自己責任で)",
|
"crowdsourcedConfigsLabel": "クラウドソーシングによるアプリの設定(利用は自己責任で)",
|
||||||
"crowdsourcedConfigsShort": "クラウドソーシングによるアプリの設定",
|
"crowdsourcedConfigsShort": "クラウドソーシングによるアプリの設定",
|
||||||
"allowInsecure": "安全でないHTTPリクエストを許可する",
|
"allowInsecure": "安全でないHTTPリクエストを許可する",
|
||||||
"stayOneVersionBehind": "最新バージョンから1つ遅れ",
|
"stayOneVersionBehind": "最新のバージョンから1つ前のものを使用する",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "アプリを削除しますか?",
|
"one": "アプリを削除しますか?",
|
||||||
"other": "アプリを削除しますか?"
|
"other": "アプリを削除しますか?"
|
||||||
@@ -358,23 +358,23 @@
|
|||||||
"other": "{n} 個のログをクリアしました (前 = {before}, 後 = {after})"
|
"other": "{n} 個のログをクリアしました (前 = {before}, 後 = {after})"
|
||||||
},
|
},
|
||||||
"xAndNMoreUpdatesAvailable": {
|
"xAndNMoreUpdatesAvailable": {
|
||||||
"one": "{} とさらに {} 個のアプリのアップデートが利用可能です。",
|
"one": "{} とさらに 1 個のアプリのアップデートが利用可能です。",
|
||||||
"other": "{} とさらに {} 個のアプリのアップデートが利用可能です。"
|
"other": "{} とさらに {} 個のアプリのアップデートが利用可能です。"
|
||||||
},
|
},
|
||||||
"xAndNMoreUpdatesInstalled": {
|
"xAndNMoreUpdatesInstalled": {
|
||||||
"one": "{} とさらに {} 個のアプリがアップデートされました。",
|
"one": "{} とさらに 1 個のアプリがアップデートされました。",
|
||||||
"other": "{} とさらに {} 個のアプリがアップデートされました。"
|
"other": "{} とさらに {} 個のアプリがアップデートされました。"
|
||||||
},
|
},
|
||||||
"xAndNMoreUpdatesFailed": {
|
"xAndNMoreUpdatesFailed": {
|
||||||
"one": "更新に失敗しました。",
|
"one": "{} とさらに 1 個のアプリのアップデートに失敗しました。",
|
||||||
"other": "アプリのアップデートに失敗しました。"
|
"other": "{} とさらに {} 個のアプリのアップデートに失敗しました。"
|
||||||
},
|
},
|
||||||
"xAndNMoreUpdatesPossiblyInstalled": {
|
"xAndNMoreUpdatesPossiblyInstalled": {
|
||||||
"one": "{} とさらに 1 個のアプリがアップデートされた可能性があります。",
|
"one": "{} とさらに 1 個のアプリがアップデートされた可能性があります。",
|
||||||
"other": "{} とさらに {} 個のアプリがアップデートされた可能性があります。"
|
"other": "{} とさらに {} 個のアプリがアップデートされた可能性があります。"
|
||||||
},
|
},
|
||||||
"apk": {
|
"apk": {
|
||||||
"one": "{}APK",
|
"one": "{} APK",
|
||||||
"other": "{}APK"
|
"other": "{} APK"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<p>Obtainium allows you to install and update Apps directly from their releases pages, and receive notifications when new releases are made available.</p>
|
<p>Obtainium allows you to install and update Apps directly from their releases pages, and receive notifications when new releases are made available.</p>
|
||||||
<p>Read the <a href="https://github.com/ImranR98/Obtainium/wiki">Wiki</a></p>
|
<p>Read the <a href="https://wiki.obtainium.imranr.dev/">Wiki</a></p>
|
||||||
<p>
|
<p>
|
||||||
<b>Currently supported App sources:</b>
|
<b>Currently supported App sources:</b>
|
||||||
</p>
|
</p>
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<p>Obtainium позволяет вам устанавливать и обновлять приложения прямо с их объявлений о выпусках и получать уведомления о новых выпусках.</p>
|
<p>Obtainium позволяет вам устанавливать и обновлять приложения прямо с их объявлений о выпусках и получать уведомления о новых выпусках.</p>
|
||||||
<p>Для деталей читайте <a href="https://github.com/ImranR98/Obtainium/wiki">Вики</a></p>
|
<p>Для деталей читайте <a href="https://wiki.obtainium.imranr.dev/">Вики</a></p>
|
||||||
<p>
|
<p>
|
||||||
<b>Поддерживаемые источники приложений:</b>
|
<b>Поддерживаемые источники приложений:</b>
|
||||||
</p>
|
</p>
|
||||||
|
@@ -5,6 +5,8 @@ import 'package:html/parser.dart';
|
|||||||
import 'package:http/http.dart';
|
import 'package:http/http.dart';
|
||||||
import 'package:obtainium/components/generated_form.dart';
|
import 'package:obtainium/components/generated_form.dart';
|
||||||
import 'package:obtainium/custom_errors.dart';
|
import 'package:obtainium/custom_errors.dart';
|
||||||
|
import 'package:obtainium/providers/apps_provider.dart';
|
||||||
|
import 'package:obtainium/providers/settings_provider.dart';
|
||||||
import 'package:obtainium/providers/source_provider.dart';
|
import 'package:obtainium/providers/source_provider.dart';
|
||||||
|
|
||||||
class APKMirror extends AppSource {
|
class APKMirror extends AppSource {
|
||||||
@@ -31,6 +33,16 @@ class APKMirror extends AppSource {
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<Map<String, String>?> getRequestHeaders(
|
||||||
|
Map<String, dynamic> additionalSettings,
|
||||||
|
{bool forAPKDownload = false}) async {
|
||||||
|
return {
|
||||||
|
"User-Agent":
|
||||||
|
"Obtainium/${(await getInstalledInfo(obtainiumId))?.versionName ?? '1.0.0'}"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) {
|
String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) {
|
||||||
RegExp standardUrlRegEx = RegExp(
|
RegExp standardUrlRegEx = RegExp(
|
||||||
|
@@ -105,11 +105,7 @@ class APKPure extends AppSource {
|
|||||||
.map((e) => e.text.trim())
|
.map((e) => e.text.trim())
|
||||||
.map((t) => t == 'APKs' ? 'APK' : t) ??
|
.map((t) => t == 'APKs' ? 'APK' : t) ??
|
||||||
[];
|
[];
|
||||||
String type = types.isEmpty
|
String type = types.isEmpty ? 'APK' : types.first;
|
||||||
? 'APK'
|
|
||||||
: types.length == 1
|
|
||||||
? types.first
|
|
||||||
: types.last;
|
|
||||||
String? dateString = apkInfo
|
String? dateString = apkInfo
|
||||||
?.querySelector('div.info-bottom span.time')
|
?.querySelector('div.info-bottom span.time')
|
||||||
?.text
|
?.text
|
||||||
|
@@ -42,19 +42,16 @@ class Uptodown extends AppSource {
|
|||||||
String? version = html.querySelector('div.version')?.innerHtml;
|
String? version = html.querySelector('div.version')?.innerHtml;
|
||||||
String? name = html.querySelector('#detail-app-name')?.innerHtml.trim();
|
String? name = html.querySelector('#detail-app-name')?.innerHtml.trim();
|
||||||
String? author = html.querySelector('#author-link')?.innerHtml.trim();
|
String? author = html.querySelector('#author-link')?.innerHtml.trim();
|
||||||
var detailElements = html.querySelectorAll('#technical-information td');
|
var detailElements = html
|
||||||
String? appId = (detailElements.elementAtOrNull(2))?.innerHtml.trim();
|
.querySelectorAll('#technical-information td')
|
||||||
String? dateStr = (detailElements.elementAtOrNull(29))?.innerHtml.trim();
|
.map((e) => e.innerHtml.trim())
|
||||||
|
.where((e) => !e.startsWith('<'))
|
||||||
|
.toList();
|
||||||
|
String? appId = detailElements.elementAtOrNull(0);
|
||||||
|
String? dateStr = detailElements.elementAtOrNull(6);
|
||||||
String? fileId =
|
String? fileId =
|
||||||
html.querySelector('#detail-app-name')?.attributes['data-file-id'];
|
html.querySelector('#detail-app-name')?.attributes['data-file-id'];
|
||||||
String? extension = html
|
String? extension = detailElements.elementAtOrNull(7)?.toLowerCase();
|
||||||
.querySelectorAll('td')
|
|
||||||
.where((e) => e.text.toLowerCase().trim() == 'file type')
|
|
||||||
.firstOrNull
|
|
||||||
?.nextElementSibling
|
|
||||||
?.text
|
|
||||||
.toLowerCase()
|
|
||||||
.trim();
|
|
||||||
return Map.fromEntries([
|
return Map.fromEntries([
|
||||||
MapEntry('version', version),
|
MapEntry('version', version),
|
||||||
MapEntry('appId', appId),
|
MapEntry('appId', appId),
|
||||||
|
@@ -886,7 +886,7 @@ class _SettingsPageState extends State<SettingsPage> {
|
|||||||
),
|
),
|
||||||
IconButton(
|
IconButton(
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
launchUrlString('${settingsProvider.sourceUrl}/wiki',
|
launchUrlString('https://wiki.obtainium.imranr.dev/',
|
||||||
mode: LaunchMode.externalApplication);
|
mode: LaunchMode.externalApplication);
|
||||||
},
|
},
|
||||||
icon: const Icon(Icons.help_outline_rounded),
|
icon: const Icon(Icons.help_outline_rounded),
|
||||||
|
@@ -516,11 +516,29 @@ class AppsProvider with ChangeNotifier {
|
|||||||
.listSync()
|
.listSync()
|
||||||
.where((e) => e.path.toLowerCase().endsWith('.apk'))
|
.where((e) => e.path.toLowerCase().endsWith('.apk'))
|
||||||
.toList();
|
.toList();
|
||||||
|
|
||||||
|
FileSystemEntity? temp;
|
||||||
|
apks.removeWhere((element) {
|
||||||
|
bool res = element.uri.pathSegments.last.startsWith(app.id);
|
||||||
|
if (res) {
|
||||||
|
temp = element;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
});
|
||||||
|
if (temp != null) {
|
||||||
|
apks = [
|
||||||
|
temp!,
|
||||||
|
...apks,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
for (var i = 0; i < apks.length; i++) {
|
for (var i = 0; i < apks.length; i++) {
|
||||||
try {
|
try {
|
||||||
newInfo = await pm.getPackageArchiveInfo(
|
newInfo =
|
||||||
archiveFilePath: apks.first.path);
|
await pm.getPackageArchiveInfo(archiveFilePath: apks[i].path);
|
||||||
|
if (newInfo != null) {
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
if (i == apks.length - 1) {
|
if (i == apks.length - 1) {
|
||||||
rethrow;
|
rethrow;
|
||||||
@@ -644,28 +662,47 @@ class AppsProvider with ChangeNotifier {
|
|||||||
var somethingInstalled = false;
|
var somethingInstalled = false;
|
||||||
try {
|
try {
|
||||||
MultiAppMultiError errors = MultiAppMultiError();
|
MultiAppMultiError errors = MultiAppMultiError();
|
||||||
|
List<File> APKFiles = [];
|
||||||
for (var file in dir.extracted
|
for (var file in dir.extracted
|
||||||
.listSync(recursive: true, followLinks: false)
|
.listSync(recursive: true, followLinks: false)
|
||||||
.whereType<File>()) {
|
.whereType<File>()) {
|
||||||
if (file.path.toLowerCase().endsWith('.apk')) {
|
if (file.path.toLowerCase().endsWith('.apk')) {
|
||||||
try {
|
APKFiles.add(file);
|
||||||
somethingInstalled = somethingInstalled ||
|
|
||||||
await installApk(
|
|
||||||
DownloadedApk(dir.appId, file), firstTimeWithContext,
|
|
||||||
needsBGWorkaround: needsBGWorkaround,
|
|
||||||
shizukuPretendToBeGooglePlay: shizukuPretendToBeGooglePlay);
|
|
||||||
} catch (e) {
|
|
||||||
logs.add(
|
|
||||||
'Could not install APK from XAPK \'${file.path}\': ${e.toString()}');
|
|
||||||
errors.add(dir.appId, e, appName: apps[dir.appId]?.name);
|
|
||||||
}
|
|
||||||
} else if (file.path.toLowerCase().endsWith('.obb')) {
|
} else if (file.path.toLowerCase().endsWith('.obb')) {
|
||||||
await moveObbFile(file, dir.appId);
|
await moveObbFile(file, dir.appId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (somethingInstalled) {
|
|
||||||
|
File? temp;
|
||||||
|
APKFiles.removeWhere((element) {
|
||||||
|
bool res = element.uri.pathSegments.last.startsWith(dir.appId);
|
||||||
|
if (res) {
|
||||||
|
temp = element;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
});
|
||||||
|
if (temp != null) {
|
||||||
|
APKFiles = [
|
||||||
|
temp!,
|
||||||
|
...APKFiles,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
await installApk(
|
||||||
|
DownloadedApk(dir.appId, APKFiles[0]), firstTimeWithContext,
|
||||||
|
needsBGWorkaround: needsBGWorkaround,
|
||||||
|
shizukuPretendToBeGooglePlay: shizukuPretendToBeGooglePlay,
|
||||||
|
additionalAPKs: APKFiles.sublist(1)
|
||||||
|
.map((a) => DownloadedApk(dir.appId, a))
|
||||||
|
.toList());
|
||||||
|
somethingInstalled = true;
|
||||||
dir.file.delete(recursive: true);
|
dir.file.delete(recursive: true);
|
||||||
} else if (errors.idsByErrorString.isNotEmpty) {
|
} catch (e) {
|
||||||
|
logs.add('Could not install APKs from XAPK: ${e.toString()}');
|
||||||
|
errors.add(dir.appId, e, appName: apps[dir.appId]?.name);
|
||||||
|
}
|
||||||
|
if (errors.idsByErrorString.isNotEmpty) {
|
||||||
throw errors;
|
throw errors;
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
@@ -677,7 +714,8 @@ class AppsProvider with ChangeNotifier {
|
|||||||
Future<bool> installApk(
|
Future<bool> installApk(
|
||||||
DownloadedApk file, BuildContext? firstTimeWithContext,
|
DownloadedApk file, BuildContext? firstTimeWithContext,
|
||||||
{bool needsBGWorkaround = false,
|
{bool needsBGWorkaround = false,
|
||||||
bool shizukuPretendToBeGooglePlay = false}) async {
|
bool shizukuPretendToBeGooglePlay = false,
|
||||||
|
List<DownloadedApk> additionalAPKs = const []}) async {
|
||||||
if (firstTimeWithContext != null &&
|
if (firstTimeWithContext != null &&
|
||||||
settingsProvider.beforeNewInstallsShareToAppVerifier &&
|
settingsProvider.beforeNewInstallsShareToAppVerifier &&
|
||||||
(await getInstalledInfo('dev.soupslurpr.appverifier')) != null) {
|
(await getInstalledInfo('dev.soupslurpr.appverifier')) != null) {
|
||||||
@@ -693,6 +731,7 @@ class AppsProvider with ChangeNotifier {
|
|||||||
if (newInfo == null) {
|
if (newInfo == null) {
|
||||||
try {
|
try {
|
||||||
file.file.deleteSync(recursive: true);
|
file.file.deleteSync(recursive: true);
|
||||||
|
additionalAPKs.forEach((a) => a.file.deleteSync(recursive: true));
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
//
|
//
|
||||||
} finally {
|
} finally {
|
||||||
@@ -720,8 +759,10 @@ class AppsProvider with ChangeNotifier {
|
|||||||
}
|
}
|
||||||
int? code;
|
int? code;
|
||||||
if (!settingsProvider.useShizuku) {
|
if (!settingsProvider.useShizuku) {
|
||||||
code =
|
var allAPKs = [file.file.path];
|
||||||
await AndroidPackageInstaller.installApk(apkFilePath: file.file.path);
|
allAPKs.addAll(additionalAPKs.map((a) => a.file.path));
|
||||||
|
code = await AndroidPackageInstaller.installApk(
|
||||||
|
apkFilePath: allAPKs.join(','));
|
||||||
} else {
|
} else {
|
||||||
code = await ShizukuApkInstaller.installAPK(file.file.uri.toString(),
|
code = await ShizukuApkInstaller.installAPK(file.file.uri.toString(),
|
||||||
shizukuPretendToBeGooglePlay ? "com.android.vending" : "");
|
shizukuPretendToBeGooglePlay ? "com.android.vending" : "");
|
||||||
@@ -1036,8 +1077,17 @@ class AppsProvider with ChangeNotifier {
|
|||||||
if (apps[id]!.app.apkUrls.isNotEmpty ||
|
if (apps[id]!.app.apkUrls.isNotEmpty ||
|
||||||
apps[id]!.app.otherAssetUrls.isNotEmpty) {
|
apps[id]!.app.otherAssetUrls.isNotEmpty) {
|
||||||
// ignore: use_build_context_synchronously
|
// ignore: use_build_context_synchronously
|
||||||
fileUrl = await confirmAppFileUrl(apps[id]!.app, context, true,
|
MapEntry<String, String>? tempFileUrl = await confirmAppFileUrl(
|
||||||
|
apps[id]!.app, context, true,
|
||||||
evenIfSingleChoice: true);
|
evenIfSingleChoice: true);
|
||||||
|
if (tempFileUrl != null) {
|
||||||
|
fileUrl = MapEntry(
|
||||||
|
tempFileUrl.key,
|
||||||
|
await (SourceProvider().getSource(apps[id]!.app.url,
|
||||||
|
overrideSource: apps[id]!.app.overrideSource))
|
||||||
|
.apkUrlPrefetchModifier(tempFileUrl.value, apps[id]!.app.url,
|
||||||
|
apps[id]!.app.additionalSettings));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (fileUrl != null) {
|
if (fileUrl != null) {
|
||||||
filesToDownload.add(MapEntry(fileUrl, apps[id]!.app));
|
filesToDownload.add(MapEntry(fileUrl, apps[id]!.app));
|
||||||
@@ -1050,18 +1100,7 @@ class AppsProvider with ChangeNotifier {
|
|||||||
|
|
||||||
Future<void> downloadFn(MapEntry<String, String> fileUrl, App app) async {
|
Future<void> downloadFn(MapEntry<String, String> fileUrl, App app) async {
|
||||||
try {
|
try {
|
||||||
var exportDir = await settingsProvider.getExportDir();
|
|
||||||
String downloadPath = '${await getStorageRootPath()}/Download';
|
String downloadPath = '${await getStorageRootPath()}/Download';
|
||||||
bool downloadsAccessible = false;
|
|
||||||
try {
|
|
||||||
Directory(downloadPath).listSync();
|
|
||||||
downloadsAccessible = true;
|
|
||||||
} catch (e) {
|
|
||||||
//
|
|
||||||
}
|
|
||||||
if (!downloadsAccessible && exportDir != null) {
|
|
||||||
downloadPath = exportDir.path;
|
|
||||||
}
|
|
||||||
await downloadFile(fileUrl.value, fileUrl.key, true,
|
await downloadFile(fileUrl.value, fileUrl.key, true,
|
||||||
(double? progress) {
|
(double? progress) {
|
||||||
notificationsProvider
|
notificationsProvider
|
||||||
|
70
pubspec.lock
70
pubspec.lock
@@ -14,7 +14,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
path: "."
|
path: "."
|
||||||
ref: main
|
ref: main
|
||||||
resolved-ref: ba2aa7a11edc2649d1d80c25ed9291521262f714
|
resolved-ref: bcad19e964d377da8816718032e5dbf6dd16ba3a
|
||||||
url: "https://github.com/ImranR98/android_package_installer"
|
url: "https://github.com/ImranR98/android_package_installer"
|
||||||
source: git
|
source: git
|
||||||
version: "0.0.1"
|
version: "0.0.1"
|
||||||
@@ -231,10 +231,10 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: device_info_plus
|
name: device_info_plus
|
||||||
sha256: c4af09051b4f0508f6c1dc0a5c085bf014d5c9a4a0678ce1799c2b4d716387a0
|
sha256: f545ffbadee826f26f2e1a0f0cbd667ae9a6011cc0f77c0f8f00a969655e6e95
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "11.1.0"
|
version: "11.1.1"
|
||||||
device_info_plus_platform_interface:
|
device_info_plus_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -303,10 +303,10 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: file_picker
|
name: file_picker
|
||||||
sha256: aac85f20436608e01a6ffd1fdd4e746a7f33c93a2c83752e626bdfaea139b877
|
sha256: "16dc141db5a2ccc6520ebb6a2eb5945b1b09e95085c021d9f914f8ded7f1465c"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "8.1.3"
|
version: "8.1.4"
|
||||||
fixnum:
|
fixnum:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -420,26 +420,26 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: flutter_local_notifications
|
name: flutter_local_notifications
|
||||||
sha256: "674173fd3c9eda9d4c8528da2ce0ea69f161577495a9cc835a2a4ecd7eadeb35"
|
sha256: ef41ae901e7529e52934feba19ed82827b11baa67336829564aeab3129460610
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "17.2.4"
|
version: "18.0.1"
|
||||||
flutter_local_notifications_linux:
|
flutter_local_notifications_linux:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: flutter_local_notifications_linux
|
name: flutter_local_notifications_linux
|
||||||
sha256: c49bd06165cad9beeb79090b18cd1eb0296f4bf4b23b84426e37dd7c027fc3af
|
sha256: "8f685642876742c941b29c32030f6f4f6dacd0e4eaecb3efbb187d6a3812ca01"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.0.1"
|
version: "5.0.0"
|
||||||
flutter_local_notifications_platform_interface:
|
flutter_local_notifications_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: flutter_local_notifications_platform_interface
|
name: flutter_local_notifications_platform_interface
|
||||||
sha256: "85f8d07fe708c1bdcf45037f2c0109753b26ae077e9d9e899d55971711a4ea66"
|
sha256: "6c5b83c86bf819cdb177a9247a3722067dd8cc6313827ce7c77a4b238a26fd52"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "7.2.0"
|
version: "8.0.0"
|
||||||
flutter_localizations:
|
flutter_localizations:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description: flutter
|
description: flutter
|
||||||
@@ -449,10 +449,10 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: flutter_markdown
|
name: flutter_markdown
|
||||||
sha256: f0e599ba89c9946c8e051780f0ec99aba4ba15895e0380a7ab68f420046fc44e
|
sha256: "999a4e3cb3e1532a971c86d6c73a480264f6a687959d4887cb4e2990821827e4"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.7.4+1"
|
version: "0.7.4+2"
|
||||||
flutter_plugin_android_lifecycle:
|
flutter_plugin_android_lifecycle:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -731,10 +731,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: permission_handler_html
|
name: permission_handler_html
|
||||||
sha256: af26edbbb1f2674af65a8f4b56e1a6f526156bc273d0e65dd8075fab51c78851
|
sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.1.3+2"
|
version: "0.1.3+5"
|
||||||
permission_handler_platform_interface:
|
permission_handler_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -819,10 +819,10 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: share_plus
|
name: share_plus
|
||||||
sha256: "3af2cda1752e5c24f2fc04b6083b40f013ffe84fb90472f30c6499a9213d5442"
|
sha256: "9c9bafd4060728d7cdb2464c341743adbd79d327cb067ec7afb64583540b47c8"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "10.1.1"
|
version: "10.1.2"
|
||||||
share_plus_platform_interface:
|
share_plus_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -835,10 +835,10 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: shared_preferences
|
name: shared_preferences
|
||||||
sha256: "746e5369a43170c25816cc472ee016d3a66bc13fcf430c0bc41ad7b4b2922051"
|
sha256: "95f9997ca1fb9799d494d0cb2a780fd7be075818d59f00c43832ed112b158a82"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.3.2"
|
version: "2.3.3"
|
||||||
shared_preferences_android:
|
shared_preferences_android:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -929,10 +929,10 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: sqflite
|
name: sqflite
|
||||||
sha256: "79a297dc3cc137e758c6a4baf83342b039e5a6d2436fcdf3f96a00adaaf2ad62"
|
sha256: "2d7299468485dca85efeeadf5d38986909c5eb0cd71fd3db2c2f000e6c9454bb"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.4.0"
|
version: "2.4.1"
|
||||||
sqflite_android:
|
sqflite_android:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -945,18 +945,18 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: sqflite_common
|
name: sqflite_common
|
||||||
sha256: "4468b24876d673418a7b7147e5a08a715b4998a7ae69227acafaab762e0e5490"
|
sha256: "761b9740ecbd4d3e66b8916d784e581861fd3c3553eda85e167bc49fdb68f709"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.5.4+5"
|
version: "2.5.4+6"
|
||||||
sqflite_darwin:
|
sqflite_darwin:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: sqflite_darwin
|
name: sqflite_darwin
|
||||||
sha256: "769733dddf94622d5541c73e4ddc6aa7b252d865285914b6fcd54a63c4b4f027"
|
sha256: "96a698e2bc82bd770a4d6aab00b42396a7c63d9e33513a56945cbccb594c2474"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.4.1-1"
|
version: "2.4.1"
|
||||||
sqflite_platform_interface:
|
sqflite_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1017,10 +1017,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: timezone
|
name: timezone
|
||||||
sha256: "2236ec079a174ce07434e89fcd3fcda430025eb7692244139a9cf54fdcf1fc7d"
|
sha256: ffc9d5f4d1193534ef051f9254063fa53d588609418c84299956c3db9383587d
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.9.4"
|
version: "0.10.0"
|
||||||
typed_data:
|
typed_data:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1065,10 +1065,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: url_launcher_linux
|
name: url_launcher_linux
|
||||||
sha256: e2b9622b4007f97f504cd64c0128309dfb978ae66adbe944125ed9e1750f06af
|
sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.2.0"
|
version: "3.2.1"
|
||||||
url_launcher_macos:
|
url_launcher_macos:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1145,10 +1145,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: webview_flutter_android
|
name: webview_flutter_android
|
||||||
sha256: "74693a212d990b32e0b7055d27db973a18abf31c53942063948cdfaaef9787ba"
|
sha256: "285cedfd9441267f6cca8843458620b5fda1af75b04f5818d0441acda5d7df19"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.0.0"
|
version: "4.1.0"
|
||||||
webview_flutter_platform_interface:
|
webview_flutter_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1161,18 +1161,18 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: webview_flutter_wkwebview
|
name: webview_flutter_wkwebview
|
||||||
sha256: d4034901d96357beb1b6717ebf7d583c88e40cfc6eb85fe76dd1bf0979a9f251
|
sha256: b7e92f129482460951d96ef9a46b49db34bd2e1621685de26e9eaafd9674e7eb
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.16.0"
|
version: "3.16.3"
|
||||||
win32:
|
win32:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: win32
|
name: win32
|
||||||
sha256: "10169d3934549017f0ae278ccb07f828f9d6ea21573bab0fb77b0e1ef0fce454"
|
sha256: "84ba388638ed7a8cb3445a320c8273136ab2631cd5f2c57888335504ddab1bc2"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "5.7.2"
|
version: "5.8.0"
|
||||||
win32_registry:
|
win32_registry:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@@ -17,7 +17,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
|
|||||||
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
|
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
|
||||||
# In Windows, build-name is used as the major, minor, and patch parts
|
# In Windows, build-name is used as the major, minor, and patch parts
|
||||||
# of the product and file versions while build-number is used as the build suffix.
|
# of the product and file versions while build-number is used as the build suffix.
|
||||||
version: 1.1.29+2286
|
version: 1.1.32+2289
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: '>=3.0.0 <4.0.0'
|
sdk: '>=3.0.0 <4.0.0'
|
||||||
@@ -38,7 +38,7 @@ dependencies:
|
|||||||
cupertino_icons: ^1.0.5
|
cupertino_icons: ^1.0.5
|
||||||
path_provider: ^2.0.11
|
path_provider: ^2.0.11
|
||||||
flutter_fgbg: ^0.6.0
|
flutter_fgbg: ^0.6.0
|
||||||
flutter_local_notifications: ^17.0.0
|
flutter_local_notifications: ^18.0.0
|
||||||
provider: ^6.0.3
|
provider: ^6.0.3
|
||||||
http: ^1.0.0
|
http: ^1.0.0
|
||||||
webview_flutter: ^4.0.0
|
webview_flutter: ^4.0.0
|
||||||
|
Reference in New Issue
Block a user