diff --git a/assets/translations/bs.json b/assets/translations/bs.json index 6be1a39..132c2aa 100644 --- a/assets/translations/bs.json +++ b/assets/translations/bs.json @@ -296,6 +296,9 @@ "partialAPKHash": "Partial APK Hash", "APKLinkHash": "APK Link Hash", "directAPKLink": "Direct APK Link", + "pseudoVersionInUse": "A Pseudo-Version is in Use", + "installed": "Installed", + "latest": "Latest", "removeAppQuestion": { "one": "Želite li ukloniti aplikaciju?", "other": "Želite li ukloniti aplikacije?" diff --git a/assets/translations/cs.json b/assets/translations/cs.json index f4de726..92b5fef 100644 --- a/assets/translations/cs.json +++ b/assets/translations/cs.json @@ -296,6 +296,9 @@ "partialAPKHash": "Partial APK Hash", "APKLinkHash": "APK Link Hash", "directAPKLink": "Direct APK Link", + "pseudoVersionInUse": "A Pseudo-Version is in Use", + "installed": "Installed", + "latest": "Latest", "removeAppQuestion": { "one": "Odstranit Apku?", "other": "Odstranit Apky?" diff --git a/assets/translations/de.json b/assets/translations/de.json index 84d148b..d2abb03 100644 --- a/assets/translations/de.json +++ b/assets/translations/de.json @@ -298,6 +298,9 @@ "partialAPKHash": "Partial APK Hash", "APKLinkHash": "APK Link Hash", "directAPKLink": "Direct APK Link", + "pseudoVersionInUse": "A Pseudo-Version is in Use", + "installed": "Installed", + "latest": "Latest", "removeAppQuestion": { "one": "App entfernen?", "other": "Apps entfernen?" diff --git a/assets/translations/en.json b/assets/translations/en.json index f6f3811..7f801e1 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -298,6 +298,9 @@ "partialAPKHash": "Partial APK Hash", "APKLinkHash": "APK Link Hash", "directAPKLink": "Direct APK Link", + "pseudoVersionInUse": "A Pseudo-Version is in Use", + "installed": "Installed", + "latest": "Latest", "removeAppQuestion": { "one": "Remove App?", "other": "Remove Apps?" diff --git a/assets/translations/es.json b/assets/translations/es.json index 595e7d6..d8d2d8b 100644 --- a/assets/translations/es.json +++ b/assets/translations/es.json @@ -296,6 +296,9 @@ "partialAPKHash": "Partial APK Hash", "APKLinkHash": "APK Link Hash", "directAPKLink": "Direct APK Link", + "pseudoVersionInUse": "A Pseudo-Version is in Use", + "installed": "Installed", + "latest": "Latest", "removeAppQuestion": { "one": "¿Eliminar Aplicación?", "other": "¿Eliminar Aplicaciones?" diff --git a/assets/translations/fa.json b/assets/translations/fa.json index 46ea68b..4d35fc9 100644 --- a/assets/translations/fa.json +++ b/assets/translations/fa.json @@ -296,6 +296,9 @@ "partialAPKHash": "Partial APK Hash", "APKLinkHash": "APK Link Hash", "directAPKLink": "Direct APK Link", + "pseudoVersionInUse": "A Pseudo-Version is in Use", + "installed": "Installed", + "latest": "Latest", "removeAppQuestion": { "one": "برنامه حذف شود؟", "other": "برنامه ها حذف شوند؟" diff --git a/assets/translations/fr.json b/assets/translations/fr.json index ed255e3..6d17bd1 100644 --- a/assets/translations/fr.json +++ b/assets/translations/fr.json @@ -296,6 +296,9 @@ "partialAPKHash": "Partial APK Hash", "APKLinkHash": "APK Link Hash", "directAPKLink": "Direct APK Link", + "pseudoVersionInUse": "A Pseudo-Version is in Use", + "installed": "Installed", + "latest": "Latest", "removeAppQuestion": { "one": "Supprimer l'application ?", "other": "Supprimer les applications ?" diff --git a/assets/translations/hu.json b/assets/translations/hu.json index c50e2b9..ba7940a 100644 --- a/assets/translations/hu.json +++ b/assets/translations/hu.json @@ -296,6 +296,9 @@ "partialAPKHash": "Partial APK Hash", "APKLinkHash": "APK Link Hash", "directAPKLink": "Direct APK Link", + "pseudoVersionInUse": "A Pseudo-Version is in Use", + "installed": "Installed", + "latest": "Latest", "removeAppQuestion": { "one": "Eltávolítja az alkalmazást?", "other": "Eltávolítja az alkalmazást?" diff --git a/assets/translations/it.json b/assets/translations/it.json index e9de63c..1a8205b 100644 --- a/assets/translations/it.json +++ b/assets/translations/it.json @@ -296,6 +296,9 @@ "partialAPKHash": "Partial APK Hash", "APKLinkHash": "APK Link Hash", "directAPKLink": "Direct APK Link", + "pseudoVersionInUse": "A Pseudo-Version is in Use", + "installed": "Installed", + "latest": "Latest", "removeAppQuestion": { "one": "Rimuovere l'app?", "other": "Rimuovere le app?" diff --git a/assets/translations/ja.json b/assets/translations/ja.json index eb459d6..c15b127 100644 --- a/assets/translations/ja.json +++ b/assets/translations/ja.json @@ -298,6 +298,9 @@ "partialAPKHash": "Partial APK Hash", "APKLinkHash": "APK Link Hash", "directAPKLink": "Direct APK Link", + "pseudoVersionInUse": "A Pseudo-Version is in Use", + "installed": "Installed", + "latest": "Latest", "removeAppQuestion": { "one": "アプリを削除しますか?", "other": "アプリを削除しますか?" diff --git a/assets/translations/nl.json b/assets/translations/nl.json index e0f4546..e8b13cf 100644 --- a/assets/translations/nl.json +++ b/assets/translations/nl.json @@ -296,6 +296,9 @@ "partialAPKHash": "Partial APK Hash", "APKLinkHash": "APK Link Hash", "directAPKLink": "Direct APK Link", + "pseudoVersionInUse": "A Pseudo-Version is in Use", + "installed": "Installed", + "latest": "Latest", "removeAppQuestion": { "one": "App verwijderen?", "other": "Apps verwijderen?" diff --git a/assets/translations/pl.json b/assets/translations/pl.json index 4fead4e..7ed2a48 100644 --- a/assets/translations/pl.json +++ b/assets/translations/pl.json @@ -296,6 +296,9 @@ "partialAPKHash": "Partial APK Hash", "APKLinkHash": "APK Link Hash", "directAPKLink": "Direct APK Link", + "pseudoVersionInUse": "A Pseudo-Version is in Use", + "installed": "Installed", + "latest": "Latest", "removeAppQuestion": { "one": "Usunąć aplikację?", "few": "Usunąć aplikacje?", diff --git a/assets/translations/pt.json b/assets/translations/pt.json index 405aa74..9169f95 100644 --- a/assets/translations/pt.json +++ b/assets/translations/pt.json @@ -296,6 +296,9 @@ "partialAPKHash": "Partial APK Hash", "APKLinkHash": "APK Link Hash", "directAPKLink": "Direct APK Link", + "pseudoVersionInUse": "A Pseudo-Version is in Use", + "installed": "Installed", + "latest": "Latest", "removeAppQuestion": { "one": "Remover aplicativo?", "other": "Remover aplicativos?" diff --git a/assets/translations/ru.json b/assets/translations/ru.json index ce680f7..dbbaaaf 100644 --- a/assets/translations/ru.json +++ b/assets/translations/ru.json @@ -298,6 +298,9 @@ "partialAPKHash": "Partial APK Hash", "APKLinkHash": "APK Link Hash", "directAPKLink": "Direct APK Link", + "pseudoVersionInUse": "A Pseudo-Version is in Use", + "installed": "Installed", + "latest": "Latest", "removeAppQuestion": { "one": "Удалить приложение?", "other": "Удалить приложения?" diff --git a/assets/translations/sv.json b/assets/translations/sv.json index 58f8416..eb91710 100644 --- a/assets/translations/sv.json +++ b/assets/translations/sv.json @@ -282,6 +282,9 @@ "partialAPKHash": "Partial APK Hash", "APKLinkHash": "APK Link Hash", "directAPKLink": "Direct APK Link", + "pseudoVersionInUse": "A Pseudo-Version is in Use", + "installed": "Installed", + "latest": "Latest", "removeAppQuestion": { "one": "Ta Bort App?", "other": "Ta Bort Appar?" diff --git a/assets/translations/tr.json b/assets/translations/tr.json index cf655df..1d1720a 100644 --- a/assets/translations/tr.json +++ b/assets/translations/tr.json @@ -296,6 +296,9 @@ "partialAPKHash": "Partial APK Hash", "APKLinkHash": "APK Link Hash", "directAPKLink": "Direct APK Link", + "pseudoVersionInUse": "A Pseudo-Version is in Use", + "installed": "Installed", + "latest": "Latest", "removeAppQuestion": { "one": "Uygulamayı Kaldır?", "other": "Uygulamaları Kaldır?" diff --git a/assets/translations/vi.json b/assets/translations/vi.json index d3dfea4..c8f9c5f 100644 --- a/assets/translations/vi.json +++ b/assets/translations/vi.json @@ -294,6 +294,9 @@ "partialAPKHash": "Partial APK Hash", "APKLinkHash": "APK Link Hash", "directAPKLink": "Direct APK Link", + "pseudoVersionInUse": "A Pseudo-Version is in Use", + "installed": "Installed", + "latest": "Latest", "removeAppQuestion":{ "one": "Gỡ ứng dụng?", "other": "Gỡ ứng dụng?" diff --git a/assets/translations/zh.json b/assets/translations/zh.json index 993b130..2c5470c 100644 --- a/assets/translations/zh.json +++ b/assets/translations/zh.json @@ -298,6 +298,9 @@ "partialAPKHash": "Partial APK Hash", "APKLinkHash": "APK Link Hash", "directAPKLink": "Direct APK Link", + "pseudoVersionInUse": "A Pseudo-Version is in Use", + "installed": "Installed", + "latest": "Latest", "removeAppQuestion": { "one": "是否删除应用?", "other": "是否删除应用?" diff --git a/lib/components/generated_form.dart b/lib/components/generated_form.dart index 0882f45..c8d059a 100644 --- a/lib/components/generated_form.dart +++ b/lib/components/generated_form.dart @@ -384,6 +384,39 @@ class _GeneratedFormState extends State { ], ); } else if (widget.items[r][e] is GeneratedFormTagInput) { + onAddPressed() { + showDialog?>( + context: context, + builder: (BuildContext ctx) { + return GeneratedFormModal( + title: widget.items[r][e].label, + items: [ + [GeneratedFormTextField('label', label: tr('label'))] + ]); + }).then((value) { + String? label = value?['label']; + if (label != null) { + setState(() { + var temp = + values[fieldKey] as Map>?; + temp ??= {}; + if (temp[label] == null) { + var singleSelect = + (widget.items[r][e] as GeneratedFormTagInput) + .singleSelect; + var someSelected = temp.entries + .where((element) => element.value.value) + .isNotEmpty; + temp[label] = MapEntry(generateRandomLightColor().value, + !(someSelected && singleSelect)); + values[fieldKey] = temp; + someValueChanged(); + } + }); + } + }); + } + formInputs[r][e] = Column(crossAxisAlignment: CrossAxisAlignment.stretch, children: [ if ((values[fieldKey] as Map>?) @@ -409,14 +442,14 @@ class _GeneratedFormState extends State { (widget.items[r][e] as GeneratedFormTagInput).alignment, crossAxisAlignment: WrapCrossAlignment.center, children: [ - (values[fieldKey] as Map>?) - ?.isEmpty == - true - ? Text( - (widget.items[r][e] as GeneratedFormTagInput) - .emptyMessage, - ) - : const SizedBox.shrink(), + // (values[fieldKey] as Map>?) + // ?.isEmpty == + // true + // ? Text( + // (widget.items[r][e] as GeneratedFormTagInput) + // .emptyMessage, + // ) + // : const SizedBox.shrink(), ...(values[fieldKey] as Map>?) ?.entries .map((e2) { @@ -540,49 +573,26 @@ class _GeneratedFormState extends State { tooltip: tr('remove'), )) : const SizedBox.shrink(), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 4), - child: IconButton( - onPressed: () { - showDialog?>( - context: context, - builder: (BuildContext ctx) { - return GeneratedFormModal( - title: widget.items[r][e].label, - items: [ - [ - GeneratedFormTextField('label', - label: tr('label')) - ] - ]); - }).then((value) { - String? label = value?['label']; - if (label != null) { - setState(() { - var temp = values[fieldKey] - as Map>?; - temp ??= {}; - if (temp[label] == null) { - var singleSelect = (widget.items[r][e] - as GeneratedFormTagInput) - .singleSelect; - var someSelected = temp.entries - .where((element) => element.value.value) - .isNotEmpty; - temp[label] = MapEntry( - generateRandomLightColor().value, - !(someSelected && singleSelect)); - values[fieldKey] = temp; - someValueChanged(); - } - }); - } - }); - }, - icon: const Icon(Icons.add), - visualDensity: VisualDensity.compact, - tooltip: tr('add'), - )), + (values[fieldKey] as Map>?) + ?.isEmpty == + true + ? Padding( + padding: const EdgeInsets.symmetric(horizontal: 4), + child: TextButton.icon( + onPressed: onAddPressed, + icon: const Icon(Icons.add), + label: Text( + (widget.items[r][e] as GeneratedFormTagInput) + .label), + )) + : Padding( + padding: const EdgeInsets.symmetric(horizontal: 4), + child: IconButton( + onPressed: onAddPressed, + icon: const Icon(Icons.add), + visualDensity: VisualDensity.compact, + tooltip: tr('add'), + )), ], ) ]); diff --git a/lib/pages/app.dart b/lib/pages/app.dart index f603e37..ab957e7 100644 --- a/lib/pages/app.dart +++ b/lib/pages/app.dart @@ -69,112 +69,107 @@ class _AppPageState extends State { (app?.app.installedVersion != null && app?.app.additionalSettings['versionDetection'] != true); - getInfoColumn() => Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - GestureDetector( - onTap: () { - if (app?.app.url != null) { - launchUrlString(app?.app.url ?? '', - mode: LaunchMode.externalApplication); - } - }, - onLongPress: () { - Clipboard.setData(ClipboardData(text: app?.app.url ?? '')); - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text(tr('copiedToClipboard')), - )); - }, - child: Text( - app?.app.url ?? '', - textAlign: TextAlign.center, - style: const TextStyle( - decoration: TextDecoration.underline, - fontStyle: FontStyle.italic, - fontSize: 12), - )), - const SizedBox( - height: 32, - ), - Column( + getInfoColumn() { + String versionLines = ''; + bool installed = app?.app.installedVersion != null; + bool upToDate = app?.app.installedVersion == app?.app.latestVersion; + if (installed) { + versionLines = '${app?.app.installedVersion} ${tr('installed')}'; + if (upToDate) { + versionLines += '/${tr('latest')}'; + } + } else { + versionLines = tr('notInstalled'); + } + if (!upToDate) { + versionLines += '\n${app?.app.latestVersion} ${tr('latest')}'; + } + String infoLines = tr('lastUpdateCheckX', args: [ + app?.app.lastUpdateCheck == null + ? tr('never') + : '${app?.app.lastUpdateCheck?.toLocal()}' + ]); + if (trackOnly) { + infoLines = '${tr('xIsTrackOnly', args: [tr('app')])}\n$infoLines'; + } + if (installedVersionIsEstimate) { + infoLines = '${tr('pseudoVersionInUse')}\n$infoLines'; + } + return Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 24), + child: Column( children: [ - Text( - '${tr('latestVersionX', args: [ - app?.app.latestVersion ?? tr('unknown') - ])}\n${tr('installedVersionX', args: [ - app?.app.installedVersion ?? tr('none') - ])}${installedVersionIsEstimate ? '\n(${tr('pseudoVersion')})' : ''}', - textAlign: TextAlign.end, - style: Theme.of(context).textTheme.bodyLarge!, + const SizedBox( + height: 8, + ), + Text(versionLines, + textAlign: TextAlign.start, + style: Theme.of(context) + .textTheme + .bodyLarge! + .copyWith(fontWeight: FontWeight.bold)), + app?.app.releaseDate == null + ? const SizedBox.shrink() + : Text( + app!.app.releaseDate.toString(), + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.labelSmall, + ), + const SizedBox( + height: 8, ), ], ), - if (app?.app.installedVersion != null && - !isVersionDetectionStandard) - Column( - children: [ - const SizedBox( - height: 16, - ), - Text( - trackOnly ? tr('xIsTrackOnly', args: [tr('app')]) : '', - style: Theme.of(context).textTheme.labelSmall, + ), + Text( + infoLines, + textAlign: TextAlign.center, + style: const TextStyle(fontStyle: FontStyle.italic, fontSize: 12), + ), + const SizedBox( + height: 48, + ), + CategoryEditorSelector( + alignment: WrapAlignment.center, + preselected: app?.app.categories != null + ? app!.app.categories.toSet() + : {}, + onSelected: (categories) { + if (app != null) { + app.app.categories = categories; + appsProvider.saveApps([app.app]); + } + }), + if (app?.app.additionalSettings['about'] is String && + app?.app.additionalSettings['about'].isNotEmpty) + Column( + children: [ + const SizedBox( + height: 48, + ), + GestureDetector( + onLongPress: () { + Clipboard.setData(ClipboardData( + text: app?.app.additionalSettings['about'] ?? '')); + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: Text(tr('copiedToClipboard')), + )); + }, + child: Text( + app?.app.additionalSettings['about'], textAlign: TextAlign.center, - ) - ], - ), - const SizedBox( - height: 32, - ), - Text( - tr('lastUpdateCheckX', args: [ - app?.app.lastUpdateCheck == null - ? tr('never') - : '\n${app?.app.lastUpdateCheck?.toLocal()}' - ]), - textAlign: TextAlign.center, - style: const TextStyle(fontStyle: FontStyle.italic, fontSize: 12), - ), - const SizedBox( - height: 48, - ), - CategoryEditorSelector( - alignment: WrapAlignment.center, - preselected: app?.app.categories != null - ? app!.app.categories.toSet() - : {}, - onSelected: (categories) { - if (app != null) { - app.app.categories = categories; - appsProvider.saveApps([app.app]); - } - }), - if (app?.app.additionalSettings['about'] is String && - app?.app.additionalSettings['about'].isNotEmpty) - Column( - children: [ - const SizedBox( - height: 48, + style: const TextStyle(fontStyle: FontStyle.italic), ), - GestureDetector( - onLongPress: () { - Clipboard.setData(ClipboardData( - text: app?.app.additionalSettings['about'] ?? '')); - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text(tr('copiedToClipboard')), - )); - }, - child: Text( - app?.app.additionalSettings['about'], - textAlign: TextAlign.center, - style: const TextStyle(fontStyle: FontStyle.italic), - ), - ) - ], - ), - ], - ); + ) + ], + ), + ], + ); + } getFullInfoColumn() => Column( mainAxisAlignment: MainAxisAlignment.center, @@ -201,11 +196,26 @@ class _AppPageState extends State { textAlign: TextAlign.center, style: Theme.of(context).textTheme.displayLarge, ), - Text( - tr('byX', args: [app?.app.author ?? tr('unknown')]), - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.headlineMedium, - ), + GestureDetector( + onTap: () { + if (app?.app.url != null) { + launchUrlString(app?.app.url ?? '', + mode: LaunchMode.externalApplication); + } + }, + onLongPress: () { + Clipboard.setData(ClipboardData(text: app?.app.url ?? '')); + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: Text(tr('copiedToClipboard')), + )); + }, + child: Text( + tr('byX', args: [app?.app.author ?? tr('unknown')]), + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.headlineMedium!.copyWith( + decoration: TextDecoration.underline, + fontStyle: FontStyle.italic), + )), const SizedBox( height: 8, ), @@ -214,16 +224,6 @@ class _AppPageState extends State { textAlign: TextAlign.center, style: Theme.of(context).textTheme.labelSmall, ), - app?.app.releaseDate == null - ? const SizedBox.shrink() - : Text( - app!.app.releaseDate.toString(), - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.labelSmall, - ), - const SizedBox( - height: 32, - ), getInfoColumn(), const SizedBox(height: 150) ],