mirror of
				https://github.com/ImranR98/Obtainium.git
				synced 2025-10-31 05:23:28 +01: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), | ||||||
| @@ -160,9 +168,9 @@ class _SettingsPageState extends State<SettingsPage> { | |||||||
|         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, | ||||||
| @@ -176,14 +184,12 @@ class _SettingsPageState extends State<SettingsPage> { | |||||||
|                   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'))), | ||||||
| @@ -193,10 +199,10 @@ class _SettingsPageState extends State<SettingsPage> { | |||||||
|                           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, | ||||||
| @@ -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: | ||||||
|  |                                       MainAxisAlignment.spaceBetween, | ||||||
|                                   children: [ |                                   children: [ | ||||||
|                                     Flexible(child: Text(tr('useBlackTheme'))), |                                     Flexible(child: Text(tr('useBlackTheme'))), | ||||||
|                                     Switch( |                                     Switch( | ||||||
|                                         value: settingsProvider.useBlackTheme, |                                         value: settingsProvider.useBlackTheme, | ||||||
|                                         onChanged: (value) { |                                         onChanged: (value) { | ||||||
|                                       settingsProvider.useBlackTheme = 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: | ||||||
|  |                                               CrossAxisAlignment.start, | ||||||
|                                           children: [ |                                           children: [ | ||||||
|                                               height16, |                                               height16, | ||||||
|                                               Row( |                                               Row( | ||||||
|                                         mainAxisAlignment: MainAxisAlignment.spaceBetween, |                                                   mainAxisAlignment: | ||||||
|  |                                                       MainAxisAlignment | ||||||
|  |                                                           .spaceBetween, | ||||||
|                                                   children: [ |                                                   children: [ | ||||||
|                                           Flexible(child: Text(tr('useSystemFont'))), |                                                     Flexible( | ||||||
|  |                                                         child: Text(tr( | ||||||
|  |                                                             'useSystemFont'))), | ||||||
|                                                     Switch( |                                                     Switch( | ||||||
|                                               value: settingsProvider.useSystemFont, |                                                         value: settingsProvider | ||||||
|                                               onChanged: (useSystemFont) { |                                                             .useSystemFont, | ||||||
|  |                                                         onChanged: | ||||||
|  |                                                             (useSystemFont) { | ||||||
|                                                           if (useSystemFont) { |                                                           if (useSystemFont) { | ||||||
|                                                   NativeFeatures.loadSystemFont().then((val) { |                                                             NativeFeatures | ||||||
|                                                     settingsProvider.useSystemFont = true; |                                                                     .loadSystemFont() | ||||||
|  |                                                                 .then((val) { | ||||||
|  |                                                               settingsProvider | ||||||
|  |                                                                       .useSystemFont = | ||||||
|  |                                                                   true; | ||||||
|                                                             }); |                                                             }); | ||||||
|                                                           } else { |                                                           } else { | ||||||
|                                                   settingsProvider.useSystemFont = false; |                                                             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'), |  | ||||||
|                     ), |                     ), | ||||||
|  |                     IconButton( | ||||||
|  |                       onPressed: () { | ||||||
|  |                         launchUrlString('${settingsProvider.sourceUrl}/wiki', | ||||||
|  |                             mode: LaunchMode.externalApplication); | ||||||
|  |                       }, | ||||||
|  |                       icon: const Icon(Icons.help_outline_rounded), | ||||||
|  |                       tooltip: tr('wiki'), | ||||||
|                     ), |                     ), | ||||||
|                     TextButton.icon( |                     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