mirror of
https://github.com/ImranR98/Obtainium.git
synced 2025-08-22 22:19:29 +02:00
Merge pull request #1606 from ImranR98/dev
- Add more links to the settings page (#1554) - Support for more Huawei AppGallery URL schemes (#1570) - Fix HTML release asset download (#1578) - Fix non-APK GitHub release asset downloads (#1581) - Fix asset date UI (#1590)
This commit is contained in:
@@ -113,6 +113,7 @@
|
|||||||
"dark": "Tamna",
|
"dark": "Tamna",
|
||||||
"light": "Svijetla",
|
"light": "Svijetla",
|
||||||
"followSystem": "Pratite sistem",
|
"followSystem": "Pratite sistem",
|
||||||
|
"followSystemThemeExplanation": "Following system theme is possible only by using third-party applications",
|
||||||
"useBlackTheme": "Koristite čisto crnu tamnu temu",
|
"useBlackTheme": "Koristite čisto crnu tamnu temu",
|
||||||
"appSortBy": "Aplikacije sortirane po",
|
"appSortBy": "Aplikacije sortirane po",
|
||||||
"authorName": "Autor/Ime",
|
"authorName": "Autor/Ime",
|
||||||
@@ -309,6 +310,8 @@
|
|||||||
"badDownload": "The APK could not be parsed (incompatible or partial download)",
|
"badDownload": "The APK could not be parsed (incompatible or partial download)",
|
||||||
"beforeNewInstallsShareToAppVerifier": "Share new Apps with AppVerifier (if available)",
|
"beforeNewInstallsShareToAppVerifier": "Share new Apps with AppVerifier (if available)",
|
||||||
"appVerifierInstructionToast": "Share to AppVerifier, then return here when ready.",
|
"appVerifierInstructionToast": "Share to AppVerifier, then return here when ready.",
|
||||||
|
"wiki": "Help/Wiki",
|
||||||
|
"crowdsourcedConfigsLabel": "Crowdsourced App Configurations (use at your own risk)",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Želite li ukloniti aplikaciju?",
|
"one": "Želite li ukloniti aplikaciju?",
|
||||||
"other": "Želite li ukloniti aplikacije?"
|
"other": "Želite li ukloniti aplikacije?"
|
||||||
|
@@ -113,6 +113,7 @@
|
|||||||
"dark": "Tmavé",
|
"dark": "Tmavé",
|
||||||
"light": "Světlé",
|
"light": "Světlé",
|
||||||
"followSystem": "Jako systém",
|
"followSystem": "Jako systém",
|
||||||
|
"followSystemThemeExplanation": "Sledování motivu systému je možné pouze pomocí aplikací třetích stran.",
|
||||||
"useBlackTheme": "Použít čistě černé tmavé téma",
|
"useBlackTheme": "Použít čistě černé tmavé téma",
|
||||||
"appSortBy": "Seřadit podle",
|
"appSortBy": "Seřadit podle",
|
||||||
"authorName": "Autor/Jméno",
|
"authorName": "Autor/Jméno",
|
||||||
@@ -309,6 +310,8 @@
|
|||||||
"badDownload": "APK nelze analyzovat (nekompatibilní nebo částečné stažení)",
|
"badDownload": "APK nelze analyzovat (nekompatibilní nebo částečné stažení)",
|
||||||
"beforeNewInstallsShareToAppVerifier": "Sdílení nových aplikací s aplikací AppVerifier (pokud je k dispozici)",
|
"beforeNewInstallsShareToAppVerifier": "Sdílení nových aplikací s aplikací AppVerifier (pokud je k dispozici)",
|
||||||
"appVerifierInstructionToast": "Sdílejte do aplikace AppVerifier a po dokončení se sem vraťte.",
|
"appVerifierInstructionToast": "Sdílejte do aplikace AppVerifier a po dokončení se sem vraťte.",
|
||||||
|
"wiki": "Nápověda/Wiki",
|
||||||
|
"crowdsourcedConfigsLabel": "Konfigurace aplikací s využitím crowdsourcingu (použití na vlastní nebezpečí)",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Odstranit Apku?",
|
"one": "Odstranit Apku?",
|
||||||
"other": "Odstranit Apky?"
|
"other": "Odstranit Apky?"
|
||||||
|
@@ -310,6 +310,8 @@
|
|||||||
"badDownload": "Die APK konnte nicht geparst werden (inkompatibler oder teilweiser Download)",
|
"badDownload": "Die APK konnte nicht geparst werden (inkompatibler oder teilweiser Download)",
|
||||||
"beforeNewInstallsShareToAppVerifier": "Neue Apps mit AppVerifier teilen (falls verfügbar)",
|
"beforeNewInstallsShareToAppVerifier": "Neue Apps mit AppVerifier teilen (falls verfügbar)",
|
||||||
"appVerifierInstructionToast": "Geben Sie die Daten an AppVerifier weiter und kehren Sie dann hierher zurück, wenn Sie fertig sind.",
|
"appVerifierInstructionToast": "Geben Sie die Daten an AppVerifier weiter und kehren Sie dann hierher zurück, wenn Sie fertig sind.",
|
||||||
|
"wiki": "Hilfe/Wiki",
|
||||||
|
"crowdsourcedConfigsLabel": "Crowdsourced App Configurations (Verwendung auf eigene Gefahr)",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "App entfernen?",
|
"one": "App entfernen?",
|
||||||
"other": "Apps entfernen?"
|
"other": "Apps entfernen?"
|
||||||
|
@@ -310,6 +310,8 @@
|
|||||||
"badDownload": "The APK could not be parsed (incompatible or partial download)",
|
"badDownload": "The APK could not be parsed (incompatible or partial download)",
|
||||||
"beforeNewInstallsShareToAppVerifier": "Share new Apps with AppVerifier (if available)",
|
"beforeNewInstallsShareToAppVerifier": "Share new Apps with AppVerifier (if available)",
|
||||||
"appVerifierInstructionToast": "Share to AppVerifier, then return here when ready.",
|
"appVerifierInstructionToast": "Share to AppVerifier, then return here when ready.",
|
||||||
|
"wiki": "Help/Wiki",
|
||||||
|
"crowdsourcedConfigsLabel": "Crowdsourced App Configurations (use at your own risk)",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Remove App?",
|
"one": "Remove App?",
|
||||||
"other": "Remove Apps?"
|
"other": "Remove Apps?"
|
||||||
|
@@ -113,6 +113,7 @@
|
|||||||
"dark": "Oscuro",
|
"dark": "Oscuro",
|
||||||
"light": "Claro",
|
"light": "Claro",
|
||||||
"followSystem": "Seguir al sistema",
|
"followSystem": "Seguir al sistema",
|
||||||
|
"followSystemThemeExplanation": "Seguir el tema del sistema sólo es posible utilizando aplicaciones de terceros",
|
||||||
"useBlackTheme": "Negro puro en tema oscuro",
|
"useBlackTheme": "Negro puro en tema oscuro",
|
||||||
"appSortBy": "Ordenar aplicaciones por",
|
"appSortBy": "Ordenar aplicaciones por",
|
||||||
"authorName": "Autor/nombre",
|
"authorName": "Autor/nombre",
|
||||||
@@ -309,6 +310,8 @@
|
|||||||
"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 nuevas aplicaciones con AppVerifier (si está disponible)",
|
"beforeNewInstallsShareToAppVerifier": "Compartir nuevas aplicaciones con AppVerifier (si está disponible)",
|
||||||
"appVerifierInstructionToast": "Comparta con AppVerifier y vuelva aquí cuando esté listo.",
|
"appVerifierInstructionToast": "Comparta con AppVerifier y vuelva aquí cuando esté listo.",
|
||||||
|
"wiki": "Ayuda/Wiki",
|
||||||
|
"crowdsourcedConfigsLabel": "Crowdsourced App Configurations (uso bajo su propia responsabilidad)",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "¿Eliminar aplicación?",
|
"one": "¿Eliminar aplicación?",
|
||||||
"other": "¿Eliminar aplicaciones?"
|
"other": "¿Eliminar aplicaciones?"
|
||||||
|
@@ -113,6 +113,7 @@
|
|||||||
"dark": "تاریک",
|
"dark": "تاریک",
|
||||||
"light": "روشن",
|
"light": "روشن",
|
||||||
"followSystem": "هماهنگ با سیستم",
|
"followSystem": "هماهنگ با سیستم",
|
||||||
|
"followSystemThemeExplanation": "Following system theme is possible only by using third-party applications",
|
||||||
"useBlackTheme": "استفاده از تم تیره سیاه خالص",
|
"useBlackTheme": "استفاده از تم تیره سیاه خالص",
|
||||||
"appSortBy": "مرتب سازی برنامه بر اساس",
|
"appSortBy": "مرتب سازی برنامه بر اساس",
|
||||||
"authorName": "سازنده/اسم",
|
"authorName": "سازنده/اسم",
|
||||||
@@ -309,6 +310,8 @@
|
|||||||
"badDownload": "The APK could not be parsed (incompatible or partial download)",
|
"badDownload": "The APK could not be parsed (incompatible or partial download)",
|
||||||
"beforeNewInstallsShareToAppVerifier": "Share new Apps with AppVerifier (if available)",
|
"beforeNewInstallsShareToAppVerifier": "Share new Apps with AppVerifier (if available)",
|
||||||
"appVerifierInstructionToast": "Share to AppVerifier, then return here when ready.",
|
"appVerifierInstructionToast": "Share to AppVerifier, then return here when ready.",
|
||||||
|
"wiki": "Help/Wiki",
|
||||||
|
"crowdsourcedConfigsLabel": "Crowdsourced App Configurations (use at your own risk)",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "برنامه حذف شود؟",
|
"one": "برنامه حذف شود؟",
|
||||||
"other": "برنامه ها حذف شوند؟"
|
"other": "برنامه ها حذف شوند؟"
|
||||||
|
@@ -113,6 +113,7 @@
|
|||||||
"dark": "Sombre",
|
"dark": "Sombre",
|
||||||
"light": "Clair",
|
"light": "Clair",
|
||||||
"followSystem": "Suivre le système",
|
"followSystem": "Suivre le système",
|
||||||
|
"followSystemThemeExplanation": "Il n'est possible de suivre le thème du système qu'en utilisant des applications tierces.",
|
||||||
"useBlackTheme": "Utilisez le thème noir pur",
|
"useBlackTheme": "Utilisez le thème noir pur",
|
||||||
"appSortBy": "Applications triées par",
|
"appSortBy": "Applications triées par",
|
||||||
"authorName": "Auteur/Nom",
|
"authorName": "Auteur/Nom",
|
||||||
@@ -309,6 +310,8 @@
|
|||||||
"badDownload": "L'APK n'a pas pu être analysé (téléchargement incompatible ou partiel)",
|
"badDownload": "L'APK n'a pas pu être analysé (téléchargement incompatible ou partiel)",
|
||||||
"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 vous êtes prêt.",
|
"appVerifierInstructionToast": "Partagez avec AppVerifier, puis revenez ici lorsque vous êtes prêt.",
|
||||||
|
"wiki": "Aide/Wiki",
|
||||||
|
"crowdsourcedConfigsLabel": "Configurations d'applications par la foule (utilisation à vos risques et périls)",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Supprimer l'application ?",
|
"one": "Supprimer l'application ?",
|
||||||
"other": "Supprimer les applications ?"
|
"other": "Supprimer les applications ?"
|
||||||
|
@@ -113,6 +113,7 @@
|
|||||||
"dark": "Sötét",
|
"dark": "Sötét",
|
||||||
"light": "Világos",
|
"light": "Világos",
|
||||||
"followSystem": "Rendszer szerint",
|
"followSystem": "Rendszer szerint",
|
||||||
|
"followSystemThemeExplanation": "A következő rendszer téma csak harmadik féltől származó alkalmazások használatával lehetséges",
|
||||||
"useBlackTheme": "Használjon teljesen fekete sötét témát",
|
"useBlackTheme": "Használjon teljesen fekete sötét témát",
|
||||||
"appSortBy": "App rendezés...",
|
"appSortBy": "App rendezés...",
|
||||||
"authorName": "Szerző/Név",
|
"authorName": "Szerző/Név",
|
||||||
@@ -309,6 +310,8 @@
|
|||||||
"badDownload": "Az APK-t nem lehetett elemezni (inkompatibilis vagy részleges letöltés)",
|
"badDownload": "Az APK-t nem lehetett elemezni (inkompatibilis vagy részleges letöltés)",
|
||||||
"beforeNewInstallsShareToAppVerifier": "Új alkalmazások megosztása az AppVerifierrel (ha elérhető)",
|
"beforeNewInstallsShareToAppVerifier": "Új alkalmazások megosztása az AppVerifierrel (ha elérhető)",
|
||||||
"appVerifierInstructionToast": "Ossza meg az AppVerifierrel, majd térjen vissza ide, ha kész.",
|
"appVerifierInstructionToast": "Ossza meg az AppVerifierrel, majd térjen vissza ide, ha kész.",
|
||||||
|
"wiki": "Súgó/Wiki",
|
||||||
|
"crowdsourcedConfigsLabel": "Crowdsourced App Configurations (használat saját felelősségre)",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Eltávolítja az alkalmazást?",
|
"one": "Eltávolítja az alkalmazást?",
|
||||||
"other": "Eltávolítja az alkalmazásokat?"
|
"other": "Eltávolítja az alkalmazásokat?"
|
||||||
|
@@ -113,6 +113,7 @@
|
|||||||
"dark": "Scuro",
|
"dark": "Scuro",
|
||||||
"light": "Chiaro",
|
"light": "Chiaro",
|
||||||
"followSystem": "Segui il sistema",
|
"followSystem": "Segui il sistema",
|
||||||
|
"followSystemThemeExplanation": "È possibile seguire il tema di sistema solo utilizzando applicazioni di terze parti.",
|
||||||
"useBlackTheme": "Usa il tema nero puro",
|
"useBlackTheme": "Usa il tema nero puro",
|
||||||
"appSortBy": "App ordinate per",
|
"appSortBy": "App ordinate per",
|
||||||
"authorName": "Autore/Nome",
|
"authorName": "Autore/Nome",
|
||||||
@@ -309,6 +310,8 @@
|
|||||||
"badDownload": "Non è stato possibile analizzare l'APK (download incompatibile o parziale).",
|
"badDownload": "Non è stato possibile analizzare l'APK (download incompatibile o parziale).",
|
||||||
"beforeNewInstallsShareToAppVerifier": "Condividere le nuove applicazioni con AppVerifier (se disponibile)",
|
"beforeNewInstallsShareToAppVerifier": "Condividere le nuove applicazioni con AppVerifier (se disponibile)",
|
||||||
"appVerifierInstructionToast": "Condividete con AppVerifier, quindi tornate qui quando siete pronti.",
|
"appVerifierInstructionToast": "Condividete con AppVerifier, quindi tornate qui quando siete pronti.",
|
||||||
|
"wiki": "Aiuto/Wiki",
|
||||||
|
"crowdsourcedConfigsLabel": "Configurazioni di app in crowdsourcing (uso a proprio rischio)",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Rimuovere l'app?",
|
"one": "Rimuovere l'app?",
|
||||||
"other": "Rimuovere le app?"
|
"other": "Rimuovere le app?"
|
||||||
|
@@ -113,6 +113,7 @@
|
|||||||
"dark": "ダーク",
|
"dark": "ダーク",
|
||||||
"light": "ライト",
|
"light": "ライト",
|
||||||
"followSystem": "システムに従う",
|
"followSystem": "システムに従う",
|
||||||
|
"followSystemThemeExplanation": "以下のシステムテーマは、サードパーティのアプリケーションを使用することによってのみ可能です。",
|
||||||
"useBlackTheme": "ピュアブラックダークテーマを使用する",
|
"useBlackTheme": "ピュアブラックダークテーマを使用する",
|
||||||
"appSortBy": "アプリの並び方",
|
"appSortBy": "アプリの並び方",
|
||||||
"authorName": "作者名/アプリ名",
|
"authorName": "作者名/アプリ名",
|
||||||
@@ -309,6 +310,8 @@
|
|||||||
"badDownload": "APK を解析できませんでした(互換性がないか、部分的にダウンロードされています)。",
|
"badDownload": "APK を解析できませんでした(互換性がないか、部分的にダウンロードされています)。",
|
||||||
"beforeNewInstallsShareToAppVerifier": "AppVerifierで新しいアプリを共有する(利用可能な場合)",
|
"beforeNewInstallsShareToAppVerifier": "AppVerifierで新しいアプリを共有する(利用可能な場合)",
|
||||||
"appVerifierInstructionToast": "AppVerifierに共有し、準備ができたらここに戻ってください。",
|
"appVerifierInstructionToast": "AppVerifierに共有し、準備ができたらここに戻ってください。",
|
||||||
|
"wiki": "ヘルプ/ウィキ",
|
||||||
|
"crowdsourcedConfigsLabel": "クラウドソーシングによるアプリの設定(利用は自己責任で)",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "アプリを削除しますか?",
|
"one": "アプリを削除しますか?",
|
||||||
"other": "アプリを削除しますか?"
|
"other": "アプリを削除しますか?"
|
||||||
|
@@ -310,6 +310,8 @@
|
|||||||
"badDownload": "De APK kon niet worden verwerkt (incompatibele of gedeeltelijke download)",
|
"badDownload": "De APK kon niet worden verwerkt (incompatibele of gedeeltelijke download)",
|
||||||
"beforeNewInstallsShareToAppVerifier": "Nieuwe Apps delen met AppVerifier (indien beschikbaar)",
|
"beforeNewInstallsShareToAppVerifier": "Nieuwe Apps delen met AppVerifier (indien beschikbaar)",
|
||||||
"appVerifierInstructionToast": "Deel het met AppVerifier en keer daarna hier terug.",
|
"appVerifierInstructionToast": "Deel het met AppVerifier en keer daarna hier terug.",
|
||||||
|
"wiki": "Help/Wiki",
|
||||||
|
"crowdsourcedConfigsLabel": "Crowdsourced App-configuraties (gebruik op eigen risico)",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "App verwijderen?",
|
"one": "App verwijderen?",
|
||||||
"other": "Apps verwijderen?"
|
"other": "Apps verwijderen?"
|
||||||
|
@@ -113,6 +113,7 @@
|
|||||||
"dark": "Ciemny",
|
"dark": "Ciemny",
|
||||||
"light": "Jasny",
|
"light": "Jasny",
|
||||||
"followSystem": "Zgodny z systemem",
|
"followSystem": "Zgodny z systemem",
|
||||||
|
"followSystemThemeExplanation": "Podążanie za motywem systemowym jest możliwe tylko przy użyciu aplikacji firm trzecich",
|
||||||
"useBlackTheme": "Użyj czarnego motywu",
|
"useBlackTheme": "Użyj czarnego motywu",
|
||||||
"appSortBy": "Sortuj aplikacje według",
|
"appSortBy": "Sortuj aplikacje według",
|
||||||
"authorName": "Autor/Nazwa",
|
"authorName": "Autor/Nazwa",
|
||||||
@@ -309,6 +310,8 @@
|
|||||||
"badDownload": "Nie można przeanalizować pliku APK (niekompatybilny lub częściowo pobrany).",
|
"badDownload": "Nie można przeanalizować pliku APK (niekompatybilny lub częściowo pobrany).",
|
||||||
"beforeNewInstallsShareToAppVerifier": "Udostępnianie nowych aplikacji za pomocą AppVerifier (jeśli dostępne)",
|
"beforeNewInstallsShareToAppVerifier": "Udostępnianie nowych aplikacji za pomocą AppVerifier (jeśli dostępne)",
|
||||||
"appVerifierInstructionToast": "Udostępnij w AppVerifier, a następnie wróć tutaj, gdy będziesz gotowy.",
|
"appVerifierInstructionToast": "Udostępnij w AppVerifier, a następnie wróć tutaj, gdy będziesz gotowy.",
|
||||||
|
"wiki": "Pomoc/Wiki",
|
||||||
|
"crowdsourcedConfigsLabel": "Konfiguracje aplikacji pochodzące z crowdsourcingu (korzystanie na własne ryzyko)",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Usunąć aplikację?",
|
"one": "Usunąć aplikację?",
|
||||||
"few": "Usunąć aplikacje?",
|
"few": "Usunąć aplikacje?",
|
||||||
|
@@ -113,6 +113,7 @@
|
|||||||
"dark": "Escuro",
|
"dark": "Escuro",
|
||||||
"light": "Claro",
|
"light": "Claro",
|
||||||
"followSystem": "Padrão do sistema",
|
"followSystem": "Padrão do sistema",
|
||||||
|
"followSystemThemeExplanation": "O tema do sistema seguinte só é possível através da utilização de aplicações de terceiros",
|
||||||
"useBlackTheme": "Usar tema preto AMOLED",
|
"useBlackTheme": "Usar tema preto AMOLED",
|
||||||
"appSortBy": "Classificar aplicativo por",
|
"appSortBy": "Classificar aplicativo por",
|
||||||
"authorName": "Autor/Nome",
|
"authorName": "Autor/Nome",
|
||||||
@@ -309,6 +310,8 @@
|
|||||||
"badDownload": "Não foi possível analisar o APK (transferência incompatível ou parcial)",
|
"badDownload": "Não foi possível analisar o APK (transferência incompatível ou parcial)",
|
||||||
"beforeNewInstallsShareToAppVerifier": "Partilhar novas aplicações com o AppVerifier (se disponível)",
|
"beforeNewInstallsShareToAppVerifier": "Partilhar novas aplicações com o AppVerifier (se disponível)",
|
||||||
"appVerifierInstructionToast": "Partilhe com o AppVerifier e, em seguida, regresse aqui quando estiver pronto.",
|
"appVerifierInstructionToast": "Partilhe com o AppVerifier e, em seguida, regresse aqui quando estiver pronto.",
|
||||||
|
"wiki": "Ajuda/Wiki",
|
||||||
|
"crowdsourcedConfigsLabel": "Configurações de aplicações de crowdsourcing (utilização por sua conta e risco)",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Remover aplicativo?",
|
"one": "Remover aplicativo?",
|
||||||
"other": "Remover aplicativos?"
|
"other": "Remover aplicativos?"
|
||||||
|
@@ -310,6 +310,8 @@
|
|||||||
"badDownload": "APK не удалось разобрать (несовместимая или неполная загрузка)",
|
"badDownload": "APK не удалось разобрать (несовместимая или неполная загрузка)",
|
||||||
"beforeNewInstallsShareToAppVerifier": "Поделитесь новыми приложениями с AppVerifier (если доступно)",
|
"beforeNewInstallsShareToAppVerifier": "Поделитесь новыми приложениями с AppVerifier (если доступно)",
|
||||||
"appVerifierInstructionToast": "Поделитесь с AppVerifier, а затем вернитесь сюда, когда будете готовы.",
|
"appVerifierInstructionToast": "Поделитесь с AppVerifier, а затем вернитесь сюда, когда будете готовы.",
|
||||||
|
"wiki": "Помощь/Вики",
|
||||||
|
"crowdsourcedConfigsLabel": "Конфигурации приложений на основе краудсорсинга (используйте на свой страх и риск)",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Удалить приложение?",
|
"one": "Удалить приложение?",
|
||||||
"other": "Удалить приложения?"
|
"other": "Удалить приложения?"
|
||||||
|
@@ -113,6 +113,7 @@
|
|||||||
"dark": "Mörkt",
|
"dark": "Mörkt",
|
||||||
"light": "Ljust",
|
"light": "Ljust",
|
||||||
"followSystem": "Följ System",
|
"followSystem": "Följ System",
|
||||||
|
"followSystemThemeExplanation": "Följande systemtema är endast möjligt med hjälp av tredjepartsapplikationer",
|
||||||
"useBlackTheme": "Använd svart tema",
|
"useBlackTheme": "Använd svart tema",
|
||||||
"appSortBy": "Sortera Appar via",
|
"appSortBy": "Sortera Appar via",
|
||||||
"authorName": "Utvecklare/Namn",
|
"authorName": "Utvecklare/Namn",
|
||||||
@@ -309,6 +310,8 @@
|
|||||||
"badDownload": "APK kunde inte analyseras (inkompatibel eller partiell nedladdning)",
|
"badDownload": "APK kunde inte analyseras (inkompatibel eller partiell nedladdning)",
|
||||||
"beforeNewInstallsShareToAppVerifier": "Dela nya appar med AppVerifier (om tillgängligt)",
|
"beforeNewInstallsShareToAppVerifier": "Dela nya appar med AppVerifier (om tillgängligt)",
|
||||||
"appVerifierInstructionToast": "Dela till AppVerifier och återvänd sedan hit när du är klar.",
|
"appVerifierInstructionToast": "Dela till AppVerifier och återvänd sedan hit när du är klar.",
|
||||||
|
"wiki": "Hjälp/Wiki",
|
||||||
|
"crowdsourcedConfigsLabel": "Crowdsourcade appkonfigurationer (använd på egen risk)",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Ta Bort App?",
|
"one": "Ta Bort App?",
|
||||||
"other": "Ta Bort Appar?"
|
"other": "Ta Bort Appar?"
|
||||||
|
@@ -113,6 +113,7 @@
|
|||||||
"dark": "Koyu",
|
"dark": "Koyu",
|
||||||
"light": "Aydınlık",
|
"light": "Aydınlık",
|
||||||
"followSystem": "Sistemi Takip Et",
|
"followSystem": "Sistemi Takip Et",
|
||||||
|
"followSystemThemeExplanation": "Sistem temasını takip etmek yalnızca üçüncü taraf uygulamaları kullanarak mümkündür",
|
||||||
"useBlackTheme": "Saf siyah koyu temasını kullan",
|
"useBlackTheme": "Saf siyah koyu temasını kullan",
|
||||||
"appSortBy": "Uygulama Sıralama Ölçütü",
|
"appSortBy": "Uygulama Sıralama Ölçütü",
|
||||||
"authorName": "Yazar/Ad",
|
"authorName": "Yazar/Ad",
|
||||||
@@ -309,6 +310,8 @@
|
|||||||
"badDownload": "APK ayrıştırılamadı (uyumsuz veya kısmi indirme)",
|
"badDownload": "APK ayrıştırılamadı (uyumsuz veya kısmi indirme)",
|
||||||
"beforeNewInstallsShareToAppVerifier": "Yeni Uygulamaları AppVerifier ile paylaşın (varsa)",
|
"beforeNewInstallsShareToAppVerifier": "Yeni Uygulamaları AppVerifier ile paylaşın (varsa)",
|
||||||
"appVerifierInstructionToast": "AppVerifier ile paylaşın, hazır olduğunuzda buraya dönün.",
|
"appVerifierInstructionToast": "AppVerifier ile paylaşın, hazır olduğunuzda buraya dönün.",
|
||||||
|
"wiki": "Yardım/Wiki",
|
||||||
|
"crowdsourcedConfigsLabel": "Kitle Kaynaklı Uygulama Yapılandırmaları (riski size ait olmak üzere kullanın)",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Uygulamayı Kaldır?",
|
"one": "Uygulamayı Kaldır?",
|
||||||
"other": "Uygulamaları Kaldır?"
|
"other": "Uygulamaları Kaldır?"
|
||||||
|
@@ -113,6 +113,7 @@
|
|||||||
"dark": "Темна",
|
"dark": "Темна",
|
||||||
"light": "Світла",
|
"light": "Світла",
|
||||||
"followSystem": "Дотримуватися системи",
|
"followSystem": "Дотримуватися системи",
|
||||||
|
"followSystemThemeExplanation": "Зміна теми системи можлива лише за допомогою сторонніх додатків",
|
||||||
"useBlackTheme": "Використовувати чорну тему (Amoled)",
|
"useBlackTheme": "Використовувати чорну тему (Amoled)",
|
||||||
"appSortBy": "Сортувати застосунки за",
|
"appSortBy": "Сортувати застосунки за",
|
||||||
"authorName": "Автор/Назва",
|
"authorName": "Автор/Назва",
|
||||||
@@ -309,6 +310,8 @@
|
|||||||
"badDownload": "APK не вдалося розпарсити (несумісний або часткове завантаження)",
|
"badDownload": "APK не вдалося розпарсити (несумісний або часткове завантаження)",
|
||||||
"beforeNewInstallsShareToAppVerifier": "Діліться новими додатками з AppVerifier (якщо доступно)",
|
"beforeNewInstallsShareToAppVerifier": "Діліться новими додатками з AppVerifier (якщо доступно)",
|
||||||
"appVerifierInstructionToast": "Надішліть на AppVerifier, а потім поверніться сюди, коли будете готові.",
|
"appVerifierInstructionToast": "Надішліть на AppVerifier, а потім поверніться сюди, коли будете готові.",
|
||||||
|
"wiki": "Довідка/Вікі",
|
||||||
|
"crowdsourcedConfigsLabel": "Краудсорсингові конфігурації додатків (використовуйте на свій страх і ризик)",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Видалити застосунок?",
|
"one": "Видалити застосунок?",
|
||||||
"other": "Видалити застосунки?"
|
"other": "Видалити застосунки?"
|
||||||
|
@@ -113,6 +113,7 @@
|
|||||||
"dark": "Tối",
|
"dark": "Tối",
|
||||||
"light": "Sáng",
|
"light": "Sáng",
|
||||||
"followSystem": "Theo hệ thống",
|
"followSystem": "Theo hệ thống",
|
||||||
|
"followSystemThemeExplanation": "Following system theme is possible only by using third-party applications",
|
||||||
"useBlackTheme": "Nền đen",
|
"useBlackTheme": "Nền đen",
|
||||||
"appSortBy": "Sắp xếp ứng dụng",
|
"appSortBy": "Sắp xếp ứng dụng",
|
||||||
"authorName": "Tác giả",
|
"authorName": "Tác giả",
|
||||||
@@ -309,6 +310,8 @@
|
|||||||
"badDownload": "Không thể phân tích cú pháp APK (tải xuống một phần hoặc không tương thích)",
|
"badDownload": "Không thể phân tích cú pháp APK (tải xuống một phần hoặc không tương thích)",
|
||||||
"beforeNewInstallsShareToAppVerifier": "Chia sẻ ứng dụng mới với AppVerifier (nếu có)",
|
"beforeNewInstallsShareToAppVerifier": "Chia sẻ ứng dụng mới với AppVerifier (nếu có)",
|
||||||
"appVerifierInstructionToast": "Chia sẻ lên AppVerifier, sau đó quay lại đây khi sẵn sàng.",
|
"appVerifierInstructionToast": "Chia sẻ lên AppVerifier, sau đó quay lại đây khi sẵn sàng.",
|
||||||
|
"wiki": "Help/Wiki",
|
||||||
|
"crowdsourcedConfigsLabel": "Crowdsourced App Configurations (use at your own risk)",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Gỡ ứng dụng?",
|
"one": "Gỡ ứng dụng?",
|
||||||
"other": "Gỡ ứng dụng?"
|
"other": "Gỡ ứng dụng?"
|
||||||
|
@@ -310,6 +310,8 @@
|
|||||||
"badDownload": "无法解析 APK 文件(不兼容或文件不完整)",
|
"badDownload": "无法解析 APK 文件(不兼容或文件不完整)",
|
||||||
"beforeNewInstallsShareToAppVerifier": "通过 AppVerifier 校验新应用(如果可用)",
|
"beforeNewInstallsShareToAppVerifier": "通过 AppVerifier 校验新应用(如果可用)",
|
||||||
"appVerifierInstructionToast": "分享至 AppVerifier,完成后返回此处。",
|
"appVerifierInstructionToast": "分享至 AppVerifier,完成后返回此处。",
|
||||||
|
"wiki": "帮助/维基",
|
||||||
|
"crowdsourcedConfigsLabel": "众包应用程序配置(使用风险自负)",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "是否删除应用?",
|
"one": "是否删除应用?",
|
||||||
"other": "是否删除应用?"
|
"other": "是否删除应用?"
|
||||||
|
@@ -273,10 +273,11 @@ class GitHub extends AppSource {
|
|||||||
|
|
||||||
List<MapEntry<String, String>> getReleaseAssetUrls(dynamic release) =>
|
List<MapEntry<String, String>> getReleaseAssetUrls(dynamic release) =>
|
||||||
(release['assets'] as List<dynamic>?)?.map((e) {
|
(release['assets'] as List<dynamic>?)?.map((e) {
|
||||||
return (e['name'] != null) &&
|
var url = !e['name'].toString().toLowerCase().endsWith('.apk')
|
||||||
((e['url'] ?? e['browser_download_url']) != null)
|
? (e['browser_download_url'] ?? e['url'])
|
||||||
? MapEntry(e['name'] as String,
|
: (e['url'] ?? e['browser_download_url']);
|
||||||
(e['url'] ?? e['browser_download_url']) as String)
|
return (e['name'] != null) && (url != null)
|
||||||
|
? MapEntry(e['name'] as String, url as String)
|
||||||
: const MapEntry('', '');
|
: const MapEntry('', '');
|
||||||
}).toList() ??
|
}).toList() ??
|
||||||
[];
|
[];
|
||||||
|
@@ -6,7 +6,7 @@ import 'package:obtainium/providers/source_provider.dart';
|
|||||||
class HuaweiAppGallery extends AppSource {
|
class HuaweiAppGallery extends AppSource {
|
||||||
HuaweiAppGallery() {
|
HuaweiAppGallery() {
|
||||||
name = 'Huawei AppGallery';
|
name = 'Huawei AppGallery';
|
||||||
hosts = ['appgallery.huawei.com'];
|
hosts = ['appgallery.huawei.com', 'appgallery.cloud.huawei.com'];
|
||||||
versionDetectionDisallowed = true;
|
versionDetectionDisallowed = true;
|
||||||
showReleaseDateAsVersionToggle = true;
|
showReleaseDateAsVersionToggle = true;
|
||||||
}
|
}
|
||||||
@@ -14,7 +14,7 @@ class HuaweiAppGallery extends AppSource {
|
|||||||
@override
|
@override
|
||||||
String sourceSpecificStandardizeURL(String url) {
|
String sourceSpecificStandardizeURL(String url) {
|
||||||
RegExp standardUrlRegEx = RegExp(
|
RegExp standardUrlRegEx = RegExp(
|
||||||
'^https?://(www\\.)?${getSourceRegex(hosts)}/app/[^/]+',
|
'^https?://(www\\.)?${getSourceRegex(hosts)}(/#)?/(app|appdl)/[^/]+',
|
||||||
caseSensitive: false);
|
caseSensitive: false);
|
||||||
RegExpMatch? match = standardUrlRegEx.firstMatch(url);
|
RegExpMatch? match = standardUrlRegEx.firstMatch(url);
|
||||||
if (match == null) {
|
if (match == null) {
|
||||||
@@ -24,7 +24,7 @@ class HuaweiAppGallery extends AppSource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getDlUrl(String standardUrl) =>
|
getDlUrl(String standardUrl) =>
|
||||||
'https://${hosts[0].replaceAll('appgallery.', 'appgallery.cloud.')}/appdl/${standardUrl.split('/').last}';
|
'https://${hosts[0].replaceAll('appgallery.huawei', 'appgallery.cloud.huawei')}/appdl/${standardUrl.split('/').last}';
|
||||||
|
|
||||||
requestAppdlRedirect(
|
requestAppdlRedirect(
|
||||||
String dlUrl, Map<String, dynamic> additionalSettings) async {
|
String dlUrl, Map<String, dynamic> additionalSettings) async {
|
||||||
|
@@ -133,7 +133,7 @@ class _AppPageState extends State<AppPage> {
|
|||||||
child: Text(
|
child: Text(
|
||||||
app?.app.releaseDate == null
|
app?.app.releaseDate == null
|
||||||
? tr('changes')
|
? tr('changes')
|
||||||
: app!.app.releaseDate.toString(),
|
: app!.app.releaseDate!.toLocal().toString(),
|
||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
style:
|
style:
|
||||||
Theme.of(context).textTheme.labelSmall!.copyWith(
|
Theme.of(context).textTheme.labelSmall!.copyWith(
|
||||||
@@ -175,9 +175,8 @@ class _AppPageState extends State<AppPage> {
|
|||||||
tr('downloadX', args: [tr('releaseAsset').toLowerCase()]),
|
tr('downloadX', args: [tr('releaseAsset').toLowerCase()]),
|
||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
style: Theme.of(context).textTheme.labelSmall!.copyWith(
|
style: Theme.of(context).textTheme.labelSmall!.copyWith(
|
||||||
decoration:
|
decoration: TextDecoration.underline,
|
||||||
changeLogFn != null ? TextDecoration.underline : null,
|
fontStyle: FontStyle.italic,
|
||||||
fontStyle: changeLogFn != null ? FontStyle.italic : null,
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
@@ -437,7 +437,7 @@ class AppsPageState extends State<AppsPage> {
|
|||||||
? tr('changes')
|
? tr('changes')
|
||||||
: ''
|
: ''
|
||||||
: DateFormat('yyyy-MM-dd')
|
: DateFormat('yyyy-MM-dd')
|
||||||
.format(listedApps[appIndex].app.releaseDate!);
|
.format(listedApps[appIndex].app.releaseDate!.toLocal());
|
||||||
}
|
}
|
||||||
|
|
||||||
getSingleAppHorizTile(int index) {
|
getSingleAppHorizTile(int index) {
|
||||||
|
@@ -119,7 +119,7 @@ class _HomePageState extends State<HomePage> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Check initial link if app was in cold state (terminated)
|
// Check initial link if app was in cold state (terminated)
|
||||||
final appLink = await _appLinks.getInitialAppLink();
|
final appLink = await _appLinks.getInitialLink();
|
||||||
if (appLink != null) {
|
if (appLink != null) {
|
||||||
await interpretLink(appLink);
|
await interpretLink(appLink);
|
||||||
}
|
}
|
||||||
|
@@ -26,20 +26,33 @@ class SettingsPage extends StatefulWidget {
|
|||||||
|
|
||||||
class _SettingsPageState extends State<SettingsPage> {
|
class _SettingsPageState extends State<SettingsPage> {
|
||||||
List<int> updateIntervalNodes = [
|
List<int> updateIntervalNodes = [
|
||||||
15, 30, 60, 120, 180, 360, 720, 1440, 4320, 10080, 20160, 43200];
|
15,
|
||||||
|
30,
|
||||||
|
60,
|
||||||
|
120,
|
||||||
|
180,
|
||||||
|
360,
|
||||||
|
720,
|
||||||
|
1440,
|
||||||
|
4320,
|
||||||
|
10080,
|
||||||
|
20160,
|
||||||
|
43200
|
||||||
|
];
|
||||||
int updateInterval = 0;
|
int updateInterval = 0;
|
||||||
late SplineInterpolation updateIntervalInterpolator; // 🤓
|
late SplineInterpolation updateIntervalInterpolator; // 🤓
|
||||||
String updateIntervalLabel = tr('neverManualOnly');
|
String updateIntervalLabel = tr('neverManualOnly');
|
||||||
bool showIntervalLabel = true;
|
bool showIntervalLabel = true;
|
||||||
final Map<ColorSwatch<Object>, String> colorsNameMap =
|
final Map<ColorSwatch<Object>, String> colorsNameMap =
|
||||||
<ColorSwatch<Object>, String> {
|
<ColorSwatch<Object>, String>{
|
||||||
ColorTools.createPrimarySwatch(obtainiumThemeColor): 'Obtainium'
|
ColorTools.createPrimarySwatch(obtainiumThemeColor): 'Obtainium'
|
||||||
};
|
};
|
||||||
|
|
||||||
void initUpdateIntervalInterpolator() {
|
void initUpdateIntervalInterpolator() {
|
||||||
List<InterpolationNode> nodes = [];
|
List<InterpolationNode> nodes = [];
|
||||||
for (final (index, element) in updateIntervalNodes.indexed) {
|
for (final (index, element) in updateIntervalNodes.indexed) {
|
||||||
nodes.add(InterpolationNode(x: index.toDouble()+1, y: element.toDouble()));
|
nodes.add(
|
||||||
|
InterpolationNode(x: index.toDouble() + 1, y: element.toDouble()));
|
||||||
}
|
}
|
||||||
updateIntervalInterpolator = SplineInterpolation(nodes: nodes);
|
updateIntervalInterpolator = SplineInterpolation(nodes: nodes);
|
||||||
}
|
}
|
||||||
@@ -69,7 +82,7 @@ class _SettingsPageState extends State<SettingsPage> {
|
|||||||
int valRounded = (valInterpolated / 30).floor() * 30;
|
int valRounded = (valInterpolated / 30).floor() * 30;
|
||||||
updateInterval = valRounded;
|
updateInterval = valRounded;
|
||||||
updateIntervalLabel = plural('hour', valRounded / 60);
|
updateIntervalLabel = plural('hour', valRounded / 60);
|
||||||
} else if (valInterpolated < 7 * 24 * 60){
|
} else if (valInterpolated < 7 * 24 * 60) {
|
||||||
int valRounded = (valInterpolated / (12 * 60)).floor() * 12 * 60;
|
int valRounded = (valInterpolated / (12 * 60)).floor() * 12 * 60;
|
||||||
updateInterval = valRounded;
|
updateInterval = valRounded;
|
||||||
updateIntervalLabel = plural('day', valRounded / (24 * 60));
|
updateIntervalLabel = plural('day', valRounded / (24 * 60));
|
||||||
@@ -90,21 +103,18 @@ class _SettingsPageState extends State<SettingsPage> {
|
|||||||
|
|
||||||
var followSystemThemeExplanation = FutureBuilder(
|
var followSystemThemeExplanation = FutureBuilder(
|
||||||
builder: (ctx, val) {
|
builder: (ctx, val) {
|
||||||
return ((val.data?.version.sdkInt ?? 30) < 29) ?
|
return ((val.data?.version.sdkInt ?? 30) < 29)
|
||||||
Text(tr('followSystemThemeExplanation'),
|
? Text(tr('followSystemThemeExplanation'),
|
||||||
style: Theme.of(context).textTheme.labelSmall)
|
style: Theme.of(context).textTheme.labelSmall)
|
||||||
: const SizedBox.shrink();
|
: const SizedBox.shrink();
|
||||||
},
|
},
|
||||||
future: DeviceInfoPlugin().androidInfo
|
future: DeviceInfoPlugin().androidInfo);
|
||||||
);
|
|
||||||
|
|
||||||
Future<bool> colorPickerDialog() async {
|
Future<bool> colorPickerDialog() async {
|
||||||
return ColorPicker(
|
return ColorPicker(
|
||||||
color: settingsProvider.themeColor,
|
color: settingsProvider.themeColor,
|
||||||
onColorChanged: (Color color) =>
|
onColorChanged: (Color color) =>
|
||||||
setState(() =>
|
setState(() => settingsProvider.themeColor = color),
|
||||||
settingsProvider.themeColor = color
|
|
||||||
),
|
|
||||||
actionButtons: const ColorPickerActionButtons(
|
actionButtons: const ColorPickerActionButtons(
|
||||||
okButton: true,
|
okButton: true,
|
||||||
closeButton: true,
|
closeButton: true,
|
||||||
@@ -137,19 +147,17 @@ class _SettingsPageState extends State<SettingsPage> {
|
|||||||
showColorName: true,
|
showColorName: true,
|
||||||
materialNameTextStyle: Theme.of(context).textTheme.bodySmall,
|
materialNameTextStyle: Theme.of(context).textTheme.bodySmall,
|
||||||
colorNameTextStyle: Theme.of(context).textTheme.bodySmall,
|
colorNameTextStyle: Theme.of(context).textTheme.bodySmall,
|
||||||
copyPasteBehavior: const ColorPickerCopyPasteBehavior(longPressMenu: true),
|
copyPasteBehavior:
|
||||||
|
const ColorPickerCopyPasteBehavior(longPressMenu: true),
|
||||||
).showPickerDialog(
|
).showPickerDialog(
|
||||||
context,
|
context,
|
||||||
transitionBuilder: (BuildContext context,
|
transitionBuilder: (BuildContext context, Animation<double> a1,
|
||||||
Animation<double> a1, Animation<double> a2, Widget widget) {
|
Animation<double> a2, Widget widget) {
|
||||||
final double curvedValue = Curves.easeInCubic.transform(a1.value);
|
final double curvedValue = Curves.easeInCubic.transform(a1.value);
|
||||||
return Transform(
|
return Transform(
|
||||||
alignment: Alignment.center,
|
alignment: Alignment.center,
|
||||||
transform: Matrix4.diagonal3Values(curvedValue, curvedValue, 1),
|
transform: Matrix4.diagonal3Values(curvedValue, curvedValue, 1),
|
||||||
child: Opacity(
|
child: Opacity(opacity: curvedValue, child: widget),
|
||||||
opacity: curvedValue,
|
|
||||||
child: widget
|
|
||||||
),
|
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
transitionDuration: const Duration(milliseconds: 250),
|
transitionDuration: const Duration(milliseconds: 250),
|
||||||
@@ -157,46 +165,44 @@ class _SettingsPageState extends State<SettingsPage> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var colorPicker = ListTile(
|
var colorPicker = ListTile(
|
||||||
dense: true,
|
dense: true,
|
||||||
contentPadding: EdgeInsets.zero,
|
contentPadding: EdgeInsets.zero,
|
||||||
title: Text(tr('selectX', args: [tr('colour')])),
|
title: Text(tr('selectX', args: [tr('colour')])),
|
||||||
subtitle: Text("${ColorTools.nameThatColor(settingsProvider.themeColor)} "
|
subtitle: Text(
|
||||||
"(${ColorTools.materialNameAndCode(settingsProvider.themeColor,
|
"${ColorTools.nameThatColor(settingsProvider.themeColor)} "
|
||||||
colorSwatchNameMap: colorsNameMap)})"),
|
"(${ColorTools.materialNameAndCode(settingsProvider.themeColor, colorSwatchNameMap: colorsNameMap)})"),
|
||||||
trailing: ColorIndicator(
|
trailing: ColorIndicator(
|
||||||
width: 40,
|
width: 40,
|
||||||
height: 40,
|
height: 40,
|
||||||
borderRadius: 20,
|
borderRadius: 20,
|
||||||
color: settingsProvider.themeColor,
|
color: settingsProvider.themeColor,
|
||||||
onSelectFocus: false,
|
onSelectFocus: false,
|
||||||
onSelect: () async {
|
onSelect: () async {
|
||||||
final Color colorBeforeDialog = settingsProvider.themeColor;
|
final Color colorBeforeDialog = settingsProvider.themeColor;
|
||||||
if (!(await colorPickerDialog())) {
|
if (!(await colorPickerDialog())) {
|
||||||
setState(() {
|
setState(() {
|
||||||
settingsProvider.themeColor = colorBeforeDialog;
|
settingsProvider.themeColor = colorBeforeDialog;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}));
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
var useMaterialThemeSwitch = FutureBuilder(
|
var useMaterialThemeSwitch = FutureBuilder(
|
||||||
builder: (ctx, val) {
|
builder: (ctx, val) {
|
||||||
return ((val.data?.version.sdkInt ?? 0) >= 31) ?
|
return ((val.data?.version.sdkInt ?? 0) >= 31)
|
||||||
Row(
|
? Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
children: [
|
children: [
|
||||||
Flexible(child: Text(tr('useMaterialYou'))),
|
Flexible(child: Text(tr('useMaterialYou'))),
|
||||||
Switch(
|
Switch(
|
||||||
value: settingsProvider.useMaterialYou,
|
value: settingsProvider.useMaterialYou,
|
||||||
onChanged: (value) {
|
onChanged: (value) {
|
||||||
settingsProvider.useMaterialYou = value;
|
settingsProvider.useMaterialYou = value;
|
||||||
})
|
})
|
||||||
],
|
],
|
||||||
) : const SizedBox.shrink();
|
)
|
||||||
|
: const SizedBox.shrink();
|
||||||
},
|
},
|
||||||
future: DeviceInfoPlugin().androidInfo
|
future: DeviceInfoPlugin().androidInfo);
|
||||||
);
|
|
||||||
|
|
||||||
var sortDropdown = DropdownButtonFormField(
|
var sortDropdown = DropdownButtonFormField(
|
||||||
isExpanded: true,
|
isExpanded: true,
|
||||||
@@ -343,13 +349,20 @@ class _SettingsPageState extends State<SettingsPage> {
|
|||||||
),
|
),
|
||||||
//intervalDropdown,
|
//intervalDropdown,
|
||||||
height16,
|
height16,
|
||||||
if (showIntervalLabel) SizedBox(
|
if (showIntervalLabel)
|
||||||
child: Text("${tr('bgUpdateCheckInterval')}: $updateIntervalLabel")
|
SizedBox(
|
||||||
) else const SizedBox(height: 16),
|
child: Text(
|
||||||
|
"${tr('bgUpdateCheckInterval')}: $updateIntervalLabel"))
|
||||||
|
else
|
||||||
|
const SizedBox(height: 16),
|
||||||
intervalSlider,
|
intervalSlider,
|
||||||
FutureBuilder(
|
FutureBuilder(
|
||||||
builder: (ctx, val) {
|
builder: (ctx, val) {
|
||||||
return (settingsProvider.updateInterval > 0) && (((val.data?.version.sdkInt ?? 0) >= 30) || settingsProvider.useShizuku)
|
return (settingsProvider.updateInterval >
|
||||||
|
0) &&
|
||||||
|
(((val.data?.version.sdkInt ?? 0) >=
|
||||||
|
30) ||
|
||||||
|
settingsProvider.useShizuku)
|
||||||
? Column(
|
? Column(
|
||||||
crossAxisAlignment:
|
crossAxisAlignment:
|
||||||
CrossAxisAlignment.start,
|
CrossAxisAlignment.start,
|
||||||
@@ -491,33 +504,33 @@ class _SettingsPageState extends State<SettingsPage> {
|
|||||||
children: [
|
children: [
|
||||||
Flexible(
|
Flexible(
|
||||||
child: Column(
|
child: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: [
|
children: [
|
||||||
Text(tr(
|
Text(tr(
|
||||||
'beforeNewInstallsShareToAppVerifier')),
|
'beforeNewInstallsShareToAppVerifier')),
|
||||||
GestureDetector(
|
GestureDetector(
|
||||||
onTap: () {
|
onTap: () {
|
||||||
launchUrlString(
|
launchUrlString(
|
||||||
'https://github.com/soupslurpr/AppVerifier',
|
'https://github.com/soupslurpr/AppVerifier',
|
||||||
mode: LaunchMode
|
mode: LaunchMode
|
||||||
.externalApplication);
|
.externalApplication);
|
||||||
},
|
},
|
||||||
child: Text(
|
child: Text(
|
||||||
tr('about'),
|
tr('about'),
|
||||||
style: const TextStyle(
|
style: const TextStyle(
|
||||||
decoration:
|
decoration:
|
||||||
TextDecoration.underline,
|
TextDecoration.underline,
|
||||||
fontSize: 12),
|
fontSize: 12),
|
||||||
)),
|
)),
|
||||||
],
|
],
|
||||||
)),
|
)),
|
||||||
Switch(
|
Switch(
|
||||||
value: settingsProvider
|
value: settingsProvider
|
||||||
.beforeNewInstallsShareToAppVerifier,
|
.beforeNewInstallsShareToAppVerifier,
|
||||||
onChanged: (value) {
|
onChanged: (value) {
|
||||||
settingsProvider
|
settingsProvider
|
||||||
.beforeNewInstallsShareToAppVerifier =
|
.beforeNewInstallsShareToAppVerifier =
|
||||||
value;
|
value;
|
||||||
})
|
})
|
||||||
],
|
],
|
||||||
@@ -531,17 +544,31 @@ class _SettingsPageState extends State<SettingsPage> {
|
|||||||
value: settingsProvider.useShizuku,
|
value: settingsProvider.useShizuku,
|
||||||
onChanged: (useShizuku) {
|
onChanged: (useShizuku) {
|
||||||
if (useShizuku) {
|
if (useShizuku) {
|
||||||
ShizukuApkInstaller.checkPermission().then((resCode) {
|
ShizukuApkInstaller.checkPermission()
|
||||||
settingsProvider.useShizuku = resCode!.startsWith('granted');
|
.then((resCode) {
|
||||||
switch(resCode){
|
settingsProvider.useShizuku =
|
||||||
|
resCode!.startsWith('granted');
|
||||||
|
switch (resCode) {
|
||||||
case 'binder_not_found':
|
case 'binder_not_found':
|
||||||
showError(ObtainiumError(tr('shizukuBinderNotFound')), context);
|
showError(
|
||||||
|
ObtainiumError(tr(
|
||||||
|
'shizukuBinderNotFound')),
|
||||||
|
context);
|
||||||
case 'old_shizuku':
|
case 'old_shizuku':
|
||||||
showError(ObtainiumError(tr('shizukuOld')), context);
|
showError(
|
||||||
|
ObtainiumError(
|
||||||
|
tr('shizukuOld')),
|
||||||
|
context);
|
||||||
case 'old_android_with_adb':
|
case 'old_android_with_adb':
|
||||||
showError(ObtainiumError(tr('shizukuOldAndroidWithADB')), context);
|
showError(
|
||||||
|
ObtainiumError(tr(
|
||||||
|
'shizukuOldAndroidWithADB')),
|
||||||
|
context);
|
||||||
case 'denied':
|
case 'denied':
|
||||||
showError(ObtainiumError(tr('cancelled')), context);
|
showError(
|
||||||
|
ObtainiumError(
|
||||||
|
tr('cancelled')),
|
||||||
|
context);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
@@ -566,7 +593,8 @@ class _SettingsPageState extends State<SettingsPage> {
|
|||||||
color: Theme.of(context).colorScheme.primary),
|
color: Theme.of(context).colorScheme.primary),
|
||||||
),
|
),
|
||||||
DropdownButtonFormField(
|
DropdownButtonFormField(
|
||||||
decoration: InputDecoration(labelText: tr('theme')),
|
decoration:
|
||||||
|
InputDecoration(labelText: tr('theme')),
|
||||||
value: settingsProvider.theme,
|
value: settingsProvider.theme,
|
||||||
items: [
|
items: [
|
||||||
DropdownMenuItem(
|
DropdownMenuItem(
|
||||||
@@ -593,17 +621,17 @@ class _SettingsPageState extends State<SettingsPage> {
|
|||||||
height16,
|
height16,
|
||||||
if (settingsProvider.theme != ThemeSettings.light)
|
if (settingsProvider.theme != ThemeSettings.light)
|
||||||
Row(
|
Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
mainAxisAlignment:
|
||||||
children: [
|
MainAxisAlignment.spaceBetween,
|
||||||
Flexible(child: Text(tr('useBlackTheme'))),
|
children: [
|
||||||
Switch(
|
Flexible(child: Text(tr('useBlackTheme'))),
|
||||||
value: settingsProvider.useBlackTheme,
|
Switch(
|
||||||
onChanged: (value) {
|
value: settingsProvider.useBlackTheme,
|
||||||
settingsProvider.useBlackTheme = value;
|
onChanged: (value) {
|
||||||
}
|
settingsProvider.useBlackTheme =
|
||||||
)
|
value;
|
||||||
]
|
})
|
||||||
),
|
]),
|
||||||
height8,
|
height8,
|
||||||
useMaterialThemeSwitch,
|
useMaterialThemeSwitch,
|
||||||
if (!settingsProvider.useMaterialYou) colorPicker,
|
if (!settingsProvider.useMaterialYou) colorPicker,
|
||||||
@@ -624,28 +652,39 @@ class _SettingsPageState extends State<SettingsPage> {
|
|||||||
builder: (ctx, val) {
|
builder: (ctx, val) {
|
||||||
return (val.data?.version.sdkInt ?? 0) >= 34
|
return (val.data?.version.sdkInt ?? 0) >= 34
|
||||||
? Column(
|
? Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment:
|
||||||
children: [
|
CrossAxisAlignment.start,
|
||||||
height16,
|
children: [
|
||||||
Row(
|
height16,
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
Row(
|
||||||
children: [
|
mainAxisAlignment:
|
||||||
Flexible(child: Text(tr('useSystemFont'))),
|
MainAxisAlignment
|
||||||
Switch(
|
.spaceBetween,
|
||||||
value: settingsProvider.useSystemFont,
|
children: [
|
||||||
onChanged: (useSystemFont) {
|
Flexible(
|
||||||
if (useSystemFont) {
|
child: Text(tr(
|
||||||
NativeFeatures.loadSystemFont().then((val) {
|
'useSystemFont'))),
|
||||||
settingsProvider.useSystemFont = true;
|
Switch(
|
||||||
});
|
value: settingsProvider
|
||||||
} else {
|
.useSystemFont,
|
||||||
settingsProvider.useSystemFont = false;
|
onChanged:
|
||||||
}
|
(useSystemFont) {
|
||||||
})
|
if (useSystemFont) {
|
||||||
]
|
NativeFeatures
|
||||||
)
|
.loadSystemFont()
|
||||||
]
|
.then((val) {
|
||||||
)
|
settingsProvider
|
||||||
|
.useSystemFont =
|
||||||
|
true;
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
settingsProvider
|
||||||
|
.useSystemFont =
|
||||||
|
false;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
])
|
||||||
|
])
|
||||||
: const SizedBox.shrink();
|
: const SizedBox.shrink();
|
||||||
},
|
},
|
||||||
future: DeviceInfoPlugin().androidInfo),
|
future: DeviceInfoPlugin().androidInfo),
|
||||||
@@ -801,17 +840,31 @@ class _SettingsPageState extends State<SettingsPage> {
|
|||||||
Row(
|
Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
||||||
children: [
|
children: [
|
||||||
TextButton.icon(
|
IconButton(
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
launchUrlString(settingsProvider.sourceUrl,
|
launchUrlString(settingsProvider.sourceUrl,
|
||||||
mode: LaunchMode.externalApplication);
|
mode: LaunchMode.externalApplication);
|
||||||
},
|
},
|
||||||
icon: const Icon(Icons.code),
|
icon: const Icon(Icons.code),
|
||||||
label: Text(
|
tooltip: tr('appSource'),
|
||||||
tr('appSource'),
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
TextButton.icon(
|
IconButton(
|
||||||
|
onPressed: () {
|
||||||
|
launchUrlString('${settingsProvider.sourceUrl}/wiki',
|
||||||
|
mode: LaunchMode.externalApplication);
|
||||||
|
},
|
||||||
|
icon: const Icon(Icons.help_outline_rounded),
|
||||||
|
tooltip: tr('wiki'),
|
||||||
|
),
|
||||||
|
IconButton(
|
||||||
|
onPressed: () {
|
||||||
|
launchUrlString('https://apps.obtainium.imranr.dev/',
|
||||||
|
mode: LaunchMode.externalApplication);
|
||||||
|
},
|
||||||
|
icon: const Icon(Icons.apps_rounded),
|
||||||
|
tooltip: tr('crowdsourcedConfigsLabel'),
|
||||||
|
),
|
||||||
|
IconButton(
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
context.read<LogsProvider>().get().then((logs) {
|
context.read<LogsProvider>().get().then((logs) {
|
||||||
if (logs.isEmpty) {
|
if (logs.isEmpty) {
|
||||||
@@ -827,7 +880,7 @@ class _SettingsPageState extends State<SettingsPage> {
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
icon: const Icon(Icons.bug_report_outlined),
|
icon: const Icon(Icons.bug_report_outlined),
|
||||||
label: Text(tr('appLogs'))),
|
tooltip: tr('appLogs'))
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
const SizedBox(
|
const SizedBox(
|
||||||
|
@@ -142,19 +142,20 @@ List<MapEntry<String, int>> moveStrToEndMapEntryWithCount(
|
|||||||
return arr;
|
return arr;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<File> downloadFileWithRetry(
|
Future<File> downloadFileWithRetry(String url, String fileName,
|
||||||
String url, String fileNameNoExt, Function? onProgress, String destDir,
|
bool fileNameHasExt, Function? onProgress, String destDir,
|
||||||
{bool useExisting = true,
|
{bool useExisting = true,
|
||||||
Map<String, String>? headers,
|
Map<String, String>? headers,
|
||||||
int retries = 3}) async {
|
int retries = 3}) async {
|
||||||
try {
|
try {
|
||||||
return await downloadFile(url, fileNameNoExt, onProgress, destDir,
|
return await downloadFile(
|
||||||
|
url, fileName, fileNameHasExt, onProgress, destDir,
|
||||||
useExisting: useExisting, headers: headers);
|
useExisting: useExisting, headers: headers);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
if (retries > 0 && e is ClientException) {
|
if (retries > 0 && e is ClientException) {
|
||||||
await Future.delayed(const Duration(seconds: 5));
|
await Future.delayed(const Duration(seconds: 5));
|
||||||
return await downloadFileWithRetry(
|
return await downloadFileWithRetry(
|
||||||
url, fileNameNoExt, onProgress, destDir,
|
url, fileName, fileNameHasExt, onProgress, destDir,
|
||||||
useExisting: useExisting, headers: headers, retries: (retries - 1));
|
useExisting: useExisting, headers: headers, retries: (retries - 1));
|
||||||
} else {
|
} else {
|
||||||
rethrow;
|
rethrow;
|
||||||
@@ -201,8 +202,8 @@ Future<String> checkPartialDownloadHash(String url, int bytesToGrab,
|
|||||||
return hashListOfLists(bytes);
|
return hashListOfLists(bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<File> downloadFile(
|
Future<File> downloadFile(String url, String fileName, bool fileNameHasExt,
|
||||||
String url, String fileNameNoExt, Function? onProgress, String destDir,
|
Function? onProgress, String destDir,
|
||||||
{bool useExisting = true, Map<String, String>? headers}) async {
|
{bool useExisting = true, Map<String, String>? headers}) async {
|
||||||
// Send the initial request but cancel it as soon as you have the headers
|
// Send the initial request but cancel it as soon as you have the headers
|
||||||
var reqHeaders = headers ?? {};
|
var reqHeaders = headers ?? {};
|
||||||
@@ -222,7 +223,12 @@ Future<File> downloadFile(
|
|||||||
if (url.toLowerCase().endsWith('.apk') && ext != 'apk') {
|
if (url.toLowerCase().endsWith('.apk') && ext != 'apk') {
|
||||||
ext = 'apk';
|
ext = 'apk';
|
||||||
}
|
}
|
||||||
File downloadedFile = File('$destDir/$fileNameNoExt.$ext');
|
fileName = fileName.split('/').last; // Ensure the fileName is a file name
|
||||||
|
File downloadedFile = File('$destDir/$fileName.$ext');
|
||||||
|
if (fileNameHasExt) {
|
||||||
|
// If the user says the filename already has an ext, ignore whatever you inferred from above
|
||||||
|
downloadedFile = File('$destDir/$fileName');
|
||||||
|
}
|
||||||
|
|
||||||
bool rangeFeatureEnabled = false;
|
bool rangeFeatureEnabled = false;
|
||||||
if (resHeaders['accept-ranges']?.isNotEmpty == true) {
|
if (resHeaders['accept-ranges']?.isNotEmpty == true) {
|
||||||
@@ -435,8 +441,8 @@ class AppsProvider with ChangeNotifier {
|
|||||||
var headers = await source.getRequestHeaders(app.additionalSettings,
|
var headers = await source.getRequestHeaders(app.additionalSettings,
|
||||||
forAPKDownload: true);
|
forAPKDownload: true);
|
||||||
var downloadedFile = await downloadFileWithRetry(
|
var downloadedFile = await downloadFileWithRetry(
|
||||||
downloadUrl, fileNameNoExt,
|
downloadUrl, fileNameNoExt, false, headers: headers,
|
||||||
headers: headers, (double? progress) {
|
(double? progress) {
|
||||||
int? prog = progress?.ceil();
|
int? prog = progress?.ceil();
|
||||||
if (apps[app.id] != null) {
|
if (apps[app.id] != null) {
|
||||||
apps[app.id]!.downloadProgress = progress;
|
apps[app.id]!.downloadProgress = progress;
|
||||||
@@ -969,15 +975,8 @@ class AppsProvider with ChangeNotifier {
|
|||||||
if (!downloadsAccessible && exportDir != null) {
|
if (!downloadsAccessible && exportDir != null) {
|
||||||
downloadPath = exportDir.path;
|
downloadPath = exportDir.path;
|
||||||
}
|
}
|
||||||
await downloadFile(
|
await downloadFile(fileUrl.value, fileUrl.key, true,
|
||||||
fileUrl.value,
|
(double? progress) {
|
||||||
fileUrl.key
|
|
||||||
.split('.')
|
|
||||||
.reversed
|
|
||||||
.toList()
|
|
||||||
.sublist(1)
|
|
||||||
.reversed
|
|
||||||
.join('.'), (double? progress) {
|
|
||||||
notificationsProvider
|
notificationsProvider
|
||||||
.notify(DownloadNotification(fileUrl.key, progress?.ceil() ?? 0));
|
.notify(DownloadNotification(fileUrl.key, progress?.ceil() ?? 0));
|
||||||
}, downloadPath,
|
}, downloadPath,
|
||||||
|
68
pubspec.lock
68
pubspec.lock
@@ -47,18 +47,18 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: app_links
|
name: app_links
|
||||||
sha256: "42dc15aecf2618ace4ffb74a2e58a50e45cd1b9f2c17c8f0cafe4c297f08c815"
|
sha256: "1c2b9e9c56d80d17610bcbd111b37187875c5d0ded8654caa1bda14ea753d001"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.0.1"
|
version: "6.0.1"
|
||||||
archive:
|
archive:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: archive
|
name: archive
|
||||||
sha256: "22600aa1e926be775fa5fe7e6894e7fb3df9efda8891c73f70fb3262399a432d"
|
sha256: ecf4273855368121b1caed0d10d4513c7241dfc813f7d3c8933b36622ae9b265
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.4.10"
|
version: "3.5.1"
|
||||||
args:
|
args:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -79,10 +79,10 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: background_fetch
|
name: background_fetch
|
||||||
sha256: "81d0d4eeecd17c971335438a5a55554c8302f479f92c7f7bc7f147f75d3f6074"
|
sha256: "2fe367c9be0e256dadb75b8b637b0b58a2a2d2317b7c8420bb1ae8b41e23fde3"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.3.3"
|
version: "1.3.4"
|
||||||
boolean_selector:
|
boolean_selector:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -147,14 +147,6 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.0"
|
version: "2.0.0"
|
||||||
convert:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: convert
|
|
||||||
sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592"
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "3.1.1"
|
|
||||||
cross_file:
|
cross_file:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -271,10 +263,10 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: file_picker
|
name: file_picker
|
||||||
sha256: "45c70b43df893027e441a6fa0aacc8f484fb9f9c60c746dc8f1dc4f774cf55cd"
|
sha256: "29c90806ac5f5fb896547720b73b17ee9aed9bba540dc5d91fe29f8c5745b10a"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "8.0.2"
|
version: "8.0.3"
|
||||||
fixnum:
|
fixnum:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -340,10 +332,10 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: flutter_local_notifications
|
name: flutter_local_notifications
|
||||||
sha256: "8cdc719114ab1c86c64bb7a86d3a679674c3637edd229e3a994797d4a1504ce4"
|
sha256: "84a3af6c7fb43c85c3528b434dacc7a7ed4551d1209d93773bf6045cec9ace68"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "17.1.0"
|
version: "17.1.1"
|
||||||
flutter_local_notifications_linux:
|
flutter_local_notifications_linux:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -463,22 +455,14 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.18.1"
|
version: "0.18.1"
|
||||||
js:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: js
|
|
||||||
sha256: c1b2e9b5ea78c45e1a0788d29606ba27dc5f71f019f32ca5140f61ef071838cf
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "0.7.1"
|
|
||||||
json_annotation:
|
json_annotation:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: json_annotation
|
name: json_annotation
|
||||||
sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467
|
sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.8.1"
|
version: "4.9.0"
|
||||||
leak_tracker:
|
leak_tracker:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -635,10 +619,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: permission_handler_android
|
name: permission_handler_android
|
||||||
sha256: "1acac6bae58144b442f11e66621c062aead9c99841093c38f5bcdcc24c1c3474"
|
sha256: "8bb852cd759488893805c3161d0b2b5db55db52f773dbb014420b304055ba2c5"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "12.0.5"
|
version: "12.0.6"
|
||||||
permission_handler_apple:
|
permission_handler_apple:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -695,14 +679,6 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.8"
|
version: "2.1.8"
|
||||||
pointycastle:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: pointycastle
|
|
||||||
sha256: "79fbafed02cfdbe85ef3fd06c7f4bc2cbcba0177e61b765264853d4253b21744"
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "3.9.0"
|
|
||||||
provider:
|
provider:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@@ -825,10 +801,10 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: sqflite
|
name: sqflite
|
||||||
sha256: "5ce2e1a15e822c3b4bfb5400455775e421da7098eed8adc8f26298ada7c9308c"
|
sha256: a43e5a27235518c03ca238e7b4732cf35eabe863a369ceba6cbefa537a66f16d
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.3.3"
|
version: "2.3.3+1"
|
||||||
sqflite_common:
|
sqflite_common:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -889,10 +865,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: timezone
|
name: timezone
|
||||||
sha256: "1cfd8ddc2d1cfd836bc93e67b9be88c3adaeca6f40a00ca999104c30693cdca0"
|
sha256: a6ccda4a69a442098b602c44e61a1e2b4bf6f5516e875bbf0f427d5df14745d5
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.9.2"
|
version: "0.9.3"
|
||||||
typed_data:
|
typed_data:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1009,10 +985,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: webview_flutter_android
|
name: webview_flutter_android
|
||||||
sha256: f038ee2fae73b509dde1bc9d2c5a50ca92054282de17631a9a3d515883740934
|
sha256: dad3313c9ead95517bb1cae5e1c9d20ba83729d5a59e5e83c0a2d66203f27f91
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.16.0"
|
version: "3.16.1"
|
||||||
webview_flutter_platform_interface:
|
webview_flutter_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1033,10 +1009,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: win32
|
name: win32
|
||||||
sha256: "0a989dc7ca2bb51eac91e8fd00851297cfffd641aa7538b165c62637ca0eaa4a"
|
sha256: "0eaf06e3446824099858367950a813472af675116bf63f008a4c2a75ae13e9cb"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "5.4.0"
|
version: "5.5.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.6+2263
|
version: 1.1.7+2264
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: '>=3.0.0 <4.0.0'
|
sdk: '>=3.0.0 <4.0.0'
|
||||||
@@ -66,7 +66,7 @@ dependencies:
|
|||||||
connectivity_plus: ^6.0.1
|
connectivity_plus: ^6.0.1
|
||||||
shared_storage: ^0.8.0
|
shared_storage: ^0.8.0
|
||||||
crypto: ^3.0.3
|
crypto: ^3.0.3
|
||||||
app_links: ^4.0.0
|
app_links: ^6.0.1
|
||||||
background_fetch: ^1.2.1
|
background_fetch: ^1.2.1
|
||||||
equations: ^5.0.2
|
equations: ^5.0.2
|
||||||
flex_color_picker: ^3.4.1
|
flex_color_picker: ^3.4.1
|
||||||
|
Reference in New Issue
Block a user