From 0199efd649e24138291fa1fe754af630bb2a3ef4 Mon Sep 17 00:00:00 2001
From: Valentin REVERSAT
Date: Thu, 18 May 2023 14:02:45 +0200
Subject: [PATCH 1/6] feat(tablet-ui): add a layout when the app is running on
a tablet
---
lib/chabo.dart | 3 +
lib/dialogs/chabo_about_dialog.dart | 283 ------------------
.../chabo_about_dialog.dart | 197 ++++++++++++
.../chabo_about_dialog/close_button.dart | 29 ++
.../chabo_about_dialog/page_links_widget.dart | 115 +++++++
.../chabo_about_dialog/web_links_widget.dart | 48 +++
lib/dialogs/forecast_information_dialog.dart | 116 +++----
lib/helpers/device_helper.dart | 31 ++
lib/screens/forecast_screen.dart | 126 +++++---
lib/widgets/ad_banner_widget.dart | 13 +-
.../floating_actions_widget.dart | 14 +-
.../forecast/status_widget/status_widget.dart | 1 +
.../forecast/status_widget/text_widget.dart | 6 +-
13 files changed, 604 insertions(+), 378 deletions(-)
delete mode 100644 lib/dialogs/chabo_about_dialog.dart
create mode 100644 lib/dialogs/chabo_about_dialog/chabo_about_dialog.dart
create mode 100644 lib/dialogs/chabo_about_dialog/close_button.dart
create mode 100644 lib/dialogs/chabo_about_dialog/page_links_widget.dart
create mode 100644 lib/dialogs/chabo_about_dialog/web_links_widget.dart
create mode 100644 lib/helpers/device_helper.dart
diff --git a/lib/chabo.dart b/lib/chabo.dart
index 47be7d02..28951ee3 100644
--- a/lib/chabo.dart
+++ b/lib/chabo.dart
@@ -5,6 +5,7 @@ import 'package:chabo/bloc/scroll_status/scroll_status_bloc.dart';
import 'package:chabo/bloc/status/status_bloc.dart';
import 'package:chabo/bloc/theme/theme_bloc.dart';
import 'package:chabo/cubits/floating_actions_cubit.dart';
+import 'package:chabo/helpers/device_helper.dart';
import 'package:chabo/screens/forecast_screen.dart';
import 'package:chabo/service/notification_service.dart';
import 'package:chabo/service/storage_service.dart';
@@ -27,6 +28,8 @@ class Chabo extends StatelessWidget {
@override
Widget build(BuildContext context) {
+ DeviceHelper.computePreferredOrientation(context);
+
return MultiBlocProvider(
providers: [
/// Bloc intended to manage the theme of the App
diff --git a/lib/dialogs/chabo_about_dialog.dart b/lib/dialogs/chabo_about_dialog.dart
deleted file mode 100644
index a3b4c502..00000000
--- a/lib/dialogs/chabo_about_dialog.dart
+++ /dev/null
@@ -1,283 +0,0 @@
-import 'package:chabo/const.dart';
-import 'package:chabo/custom_properties.dart';
-import 'package:chabo/screens/changelog_screen.dart';
-import 'package:flutter/material.dart';
-import 'package:flutter_gen/gen_l10n/app_localizations.dart';
-import 'package:font_awesome_flutter/font_awesome_flutter.dart';
-import 'package:package_info_plus/package_info_plus.dart';
-
-class ChaboAboutDialog extends StatelessWidget {
- final Widget _iconWidget = Padding(
- padding: const EdgeInsets.all(5),
- child: SizedBox(
- height: 60,
- width: 60,
- child: Image.asset(Const.appLogoPath),
- ),
- );
-
- ChaboAboutDialog({Key? key}) : super(key: key);
-
- @override
- Widget build(BuildContext context) {
- final colorScheme = Theme.of(context).colorScheme;
- final textTheme = Theme.of(context).textTheme;
-
- return FutureBuilder(
- builder: (context, snapshot) {
- if (snapshot.connectionState == ConnectionState.waiting) {
- return const Center(child: CircularProgressIndicator());
- }
- if (snapshot.connectionState == ConnectionState.none &&
- snapshot.data == null) {
- return Text(AppLocalizations.of(context)!.unableAppInfo);
- }
-
- return AlertDialog(
- insetPadding: const EdgeInsets.symmetric(horizontal: 20),
- titlePadding: const EdgeInsets.all(20),
- contentPadding: const EdgeInsets.symmetric(horizontal: 20),
- actionsPadding: const EdgeInsets.fromLTRB(0, 10, 20, 20),
- title: Row(
- crossAxisAlignment: CrossAxisAlignment.center,
- children: [
- IconTheme(
- data: Theme.of(context).iconTheme,
- child: Container(
- decoration: const BoxDecoration(
- color: Colors.white,
- borderRadius: BorderRadius.all(
- Radius.circular(
- CustomProperties.borderRadius,
- ),
- ),
- ),
- child: _iconWidget,
- ),
- ),
- Expanded(
- child: Padding(
- padding: const EdgeInsets.symmetric(horizontal: 16.0),
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Row(
- children: [
- Text(
- snapshot.data!.appName,
- style: Theme.of(context)
- .textTheme
- .headlineSmall!
- .copyWith(
- fontWeight: FontWeight.bold,
- fontSize: 30,
- ),
- ),
- Text(
- ' | v${snapshot.data!.version} (${snapshot.data!.buildNumber})',
- style: textTheme.bodyMedium,
- ),
- ],
- ),
- Text(
- Const.legalLease,
- style: textTheme.bodySmall!.copyWith(),
- ),
- ],
- ),
- ),
- ),
- ],
- ),
- shape: RoundedRectangleBorder(
- borderRadius: BorderRadius.circular(
- CustomProperties.borderRadius,
- ),
- ),
- content: ListBody(
- children: [
- Text(
- AppLocalizations.of(context)!.appDescription,
- style: textTheme.bodyLarge,
- ),
- const SizedBox(
- height: 15,
- ),
- Text(
- AppLocalizations.of(context)!.disclaimer,
- style: Theme.of(context)
- .textTheme
- .bodyMedium
- ?.copyWith(fontStyle: FontStyle.italic),
- ),
- const SizedBox(
- height: 15,
- ),
- Wrap(
- alignment: WrapAlignment.center,
- spacing: 10,
- runSpacing: 10,
- children: Const.usefulLinks
- .map(
- (link) => ElevatedButton(
- onPressed: () => link.launchURL(),
- child: Row(
- mainAxisSize: MainAxisSize.min,
- children: [
- Icon(
- link.iconData,
- size: 20,
- ),
- const SizedBox(
- width: 10,
- ),
- Padding(
- padding:
- const EdgeInsets.symmetric(vertical: 8.0),
- child: Text(
- AppLocalizations.of(context)!.selectAboutDialog(
- link.translationKey,
- ),
- ),
- ),
- const SizedBox(
- width: 10,
- ),
- ],
- ),
- ),
- )
- .toList(),
- ),
- const SizedBox(
- height: 10,
- ),
- Wrap(
- spacing: 10,
- runSpacing: 5,
- alignment: WrapAlignment.center,
- children: [
- ElevatedButton(
- style: ButtonStyle(
- backgroundColor: MaterialStateProperty.all(
- colorScheme.secondaryContainer,
- ),
- foregroundColor: MaterialStateProperty.all(
- colorScheme.onSecondaryContainer,
- ),
- ),
- onPressed: () => Navigator.push(
- context,
- MaterialPageRoute(
- builder: (context) => const ChangeLogScreen(),
- ),
- ),
- child: Row(
- mainAxisSize: MainAxisSize.min,
- children: [
- const Icon(
- FontAwesomeIcons.codeMerge,
- size: 20,
- ),
- const SizedBox(
- width: 10,
- ),
- Padding(
- padding: const EdgeInsets.symmetric(vertical: 8.0),
- child: Text(
- AppLocalizations.of(context)!.selectAboutDialog(
- 'changelog',
- ),
- ),
- ),
- ],
- ),
- ),
- ElevatedButton(
- style: ButtonStyle(
- backgroundColor: MaterialStateProperty.all(
- colorScheme.secondaryContainer,
- ),
- foregroundColor: MaterialStateProperty.all(
- colorScheme.onSecondaryContainer,
- ),
- ),
- onPressed: () {
- showLicensePage(
- context: context,
- applicationName: snapshot.data!.appName,
- applicationVersion:
- 'v${snapshot.data!.version}+${snapshot.data!.buildNumber}',
- applicationIcon: Padding(
- padding: const EdgeInsets.all(8.0),
- child: IconTheme(
- data: Theme.of(context).iconTheme,
- child: Container(
- decoration: const BoxDecoration(
- color: Colors.white,
- borderRadius: BorderRadius.all(
- Radius.circular(
- CustomProperties.borderRadius,
- ),
- ),
- ),
- child: _iconWidget,
- ),
- ),
- ),
- applicationLegalese: Const.legalLease,
- );
- },
- child: Row(
- mainAxisSize: MainAxisSize.min,
- children: [
- const Icon(
- FontAwesomeIcons.fileLines,
- size: 20,
- ),
- const SizedBox(
- width: 10,
- ),
- Padding(
- padding: const EdgeInsets.symmetric(vertical: 8.0),
- child: Text(
- AppLocalizations.of(context)!
- .selectAboutDialog('licenses'),
- ),
- ),
- ],
- ),
- ),
- ],
- ),
- ],
- ),
- actions: [
- ElevatedButton.icon(
- style: ButtonStyle(
- backgroundColor: MaterialStateProperty.all(Colors.white),
- foregroundColor: MaterialStateProperty.all(
- Theme.of(context).primaryColor,
- ),
- shape: MaterialStateProperty.all(
- RoundedRectangleBorder(
- borderRadius: BorderRadius.circular(
- CustomProperties.borderRadius,
- ),
- ),
- ),
- ),
- onPressed: () => {Navigator.pop(context)},
- icon: const Icon(Icons.close),
- label: Text(
- MaterialLocalizations.of(context).closeButtonLabel,
- ),
- ),
- ],
- scrollable: true,
- );
- },
- future: PackageInfo.fromPlatform(),
- );
- }
-}
diff --git a/lib/dialogs/chabo_about_dialog/chabo_about_dialog.dart b/lib/dialogs/chabo_about_dialog/chabo_about_dialog.dart
new file mode 100644
index 00000000..a90e79cc
--- /dev/null
+++ b/lib/dialogs/chabo_about_dialog/chabo_about_dialog.dart
@@ -0,0 +1,197 @@
+import 'package:chabo/const.dart';
+import 'package:chabo/custom_properties.dart';
+import 'package:chabo/helpers/device_helper.dart';
+import 'package:chabo/screens/changelog_screen.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_gen/gen_l10n/app_localizations.dart';
+import 'package:font_awesome_flutter/font_awesome_flutter.dart';
+import 'package:package_info_plus/package_info_plus.dart';
+
+part 'close_button.dart';
+
+part 'page_links_widget.dart';
+
+part 'web_links_widget.dart';
+
+class ChaboAboutDialog extends StatelessWidget {
+ final Widget _iconWidget = Padding(
+ padding: const EdgeInsets.all(5),
+ child: SizedBox(
+ height: 60,
+ width: 60,
+ child: Image.asset(Const.appLogoPath),
+ ),
+ );
+
+ ChaboAboutDialog({Key? key}) : super(key: key);
+
+ @override
+ Widget build(BuildContext context) {
+ final textTheme = Theme.of(context).textTheme;
+
+ return FutureBuilder(
+ builder: (context, snapshot) {
+ if (snapshot.connectionState == ConnectionState.waiting) {
+ return const Center(child: CircularProgressIndicator());
+ }
+ if (snapshot.connectionState == ConnectionState.none &&
+ snapshot.data == null) {
+ return Text(AppLocalizations.of(context)!.unableAppInfo);
+ }
+
+ return AlertDialog(
+ insetPadding: const EdgeInsets.symmetric(horizontal: 20),
+ titlePadding: const EdgeInsets.all(20),
+ contentPadding: const EdgeInsets.symmetric(
+ horizontal: 20,
+ ),
+ actionsPadding: const EdgeInsets.fromLTRB(0, 10, 20, 20),
+ title: Row(
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ IconTheme(
+ data: Theme.of(context).iconTheme,
+ child: Container(
+ decoration: const BoxDecoration(
+ color: Colors.white,
+ borderRadius: BorderRadius.all(
+ Radius.circular(
+ CustomProperties.borderRadius,
+ ),
+ ),
+ ),
+ child: _iconWidget,
+ ),
+ ),
+ Expanded(
+ child: Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 16.0),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Row(
+ children: [
+ Text(
+ snapshot.data!.appName,
+ style: Theme.of(context)
+ .textTheme
+ .headlineSmall!
+ .copyWith(
+ fontWeight: FontWeight.bold,
+ fontSize: 30,
+ ),
+ ),
+ Text(
+ ' | v${snapshot.data!.version} (${snapshot.data!.buildNumber})',
+ style: textTheme.bodyMedium,
+ ),
+ ],
+ ),
+ Text(
+ Const.legalLease,
+ style: textTheme.bodySmall!.copyWith(),
+ ),
+ ],
+ ),
+ ),
+ ),
+ !DeviceHelper.isPortrait(context)
+ ? const _CloseButton()
+ : const SizedBox.shrink(),
+ ],
+ ),
+ shape: RoundedRectangleBorder(
+ borderRadius: BorderRadius.circular(
+ CustomProperties.borderRadius,
+ ),
+ ),
+ content: Container(
+ constraints: DeviceHelper.isMobile(context)
+ ? DeviceHelper.isPortrait(context)
+ ? null
+ : BoxConstraints(
+ maxWidth: MediaQuery.of(context).size.width / 1.2,
+ )
+ : BoxConstraints(
+ maxWidth: MediaQuery.of(context).size.width / 1.9,
+ ),
+ child: DeviceHelper.isPortrait(context)
+ ? Column(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Text(
+ AppLocalizations.of(context)!.appDescription,
+ style: textTheme.bodyLarge,
+ ),
+ const SizedBox(
+ height: 15,
+ ),
+ Text(
+ AppLocalizations.of(context)!.disclaimer,
+ style: Theme.of(context)
+ .textTheme
+ .bodyMedium
+ ?.copyWith(fontStyle: FontStyle.italic),
+ ),
+ const SizedBox(
+ height: 15,
+ ),
+ _PageLinksWidget(
+ packageInfo: snapshot.data!,
+ iconWidget: _iconWidget,
+ ),
+ const SizedBox(
+ height: 15,
+ ),
+ const _WebLinksWidget(),
+ ],
+ )
+ : Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Flexible(
+ child: Column(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Text(
+ AppLocalizations.of(context)!.appDescription,
+ style: textTheme.bodyLarge,
+ ),
+ const SizedBox(
+ height: 15,
+ ),
+ Text(
+ AppLocalizations.of(context)!.disclaimer,
+ style: Theme.of(context)
+ .textTheme
+ .bodyMedium
+ ?.copyWith(fontStyle: FontStyle.italic),
+ ),
+ const SizedBox(
+ height: 15,
+ ),
+ _PageLinksWidget(
+ packageInfo: snapshot.data!,
+ iconWidget: _iconWidget,
+ ),
+ const SizedBox(
+ height: 15,
+ ),
+ ],
+ ),
+ ),
+ const Flexible(
+ child: _WebLinksWidget(),
+ ),
+ ],
+ ),
+ ),
+ scrollable: true,
+ actions:
+ DeviceHelper.isPortrait(context) ? [const _CloseButton()] : [],
+ );
+ },
+ future: PackageInfo.fromPlatform(),
+ );
+ }
+}
diff --git a/lib/dialogs/chabo_about_dialog/close_button.dart b/lib/dialogs/chabo_about_dialog/close_button.dart
new file mode 100644
index 00000000..c5ad6805
--- /dev/null
+++ b/lib/dialogs/chabo_about_dialog/close_button.dart
@@ -0,0 +1,29 @@
+part of 'chabo_about_dialog.dart';
+
+class _CloseButton extends StatelessWidget {
+ const _CloseButton({Key? key}) : super(key: key);
+
+ @override
+ Widget build(BuildContext context) {
+ return ElevatedButton.icon(
+ style: ButtonStyle(
+ backgroundColor: MaterialStateProperty.all(Colors.white),
+ foregroundColor: MaterialStateProperty.all(
+ Theme.of(context).primaryColor,
+ ),
+ shape: MaterialStateProperty.all(
+ RoundedRectangleBorder(
+ borderRadius: BorderRadius.circular(
+ CustomProperties.borderRadius,
+ ),
+ ),
+ ),
+ ),
+ onPressed: () => {Navigator.pop(context)},
+ icon: const Icon(Icons.close),
+ label: Text(
+ MaterialLocalizations.of(context).closeButtonLabel,
+ ),
+ );
+ }
+}
diff --git a/lib/dialogs/chabo_about_dialog/page_links_widget.dart b/lib/dialogs/chabo_about_dialog/page_links_widget.dart
new file mode 100644
index 00000000..78cafdb6
--- /dev/null
+++ b/lib/dialogs/chabo_about_dialog/page_links_widget.dart
@@ -0,0 +1,115 @@
+part of 'chabo_about_dialog.dart';
+
+class _PageLinksWidget extends StatelessWidget {
+ final PackageInfo packageInfo;
+ final Widget iconWidget;
+
+ const _PageLinksWidget({
+ Key? key,
+ required this.packageInfo,
+ required this.iconWidget,
+ }) : super(key: key);
+
+ @override
+ Widget build(BuildContext context) {
+ final colorScheme = Theme.of(context).colorScheme;
+
+ return Wrap(
+ spacing: 10,
+ runSpacing: 5,
+ alignment: WrapAlignment.center,
+ children: [
+ ElevatedButton(
+ style: ButtonStyle(
+ backgroundColor: MaterialStateProperty.all(
+ colorScheme.secondaryContainer,
+ ),
+ foregroundColor: MaterialStateProperty.all(
+ colorScheme.onSecondaryContainer,
+ ),
+ ),
+ onPressed: () => Navigator.push(
+ context,
+ MaterialPageRoute(
+ builder: (context) => const ChangeLogScreen(),
+ ),
+ ),
+ child: Row(
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ const Icon(
+ FontAwesomeIcons.codeMerge,
+ size: 20,
+ ),
+ const SizedBox(
+ width: 10,
+ ),
+ Padding(
+ padding: const EdgeInsets.symmetric(vertical: 8.0),
+ child: Text(
+ AppLocalizations.of(context)!.selectAboutDialog(
+ 'changelog',
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ElevatedButton(
+ style: ButtonStyle(
+ backgroundColor: MaterialStateProperty.all(
+ colorScheme.secondaryContainer,
+ ),
+ foregroundColor: MaterialStateProperty.all(
+ colorScheme.onSecondaryContainer,
+ ),
+ ),
+ onPressed: () {
+ showLicensePage(
+ context: context,
+ applicationName: packageInfo.appName,
+ applicationVersion:
+ 'v${packageInfo.version}+${packageInfo.buildNumber}',
+ applicationIcon: Padding(
+ padding: const EdgeInsets.all(8.0),
+ child: IconTheme(
+ data: Theme.of(context).iconTheme,
+ child: Container(
+ decoration: const BoxDecoration(
+ color: Colors.white,
+ borderRadius: BorderRadius.all(
+ Radius.circular(
+ CustomProperties.borderRadius,
+ ),
+ ),
+ ),
+ child: iconWidget,
+ ),
+ ),
+ ),
+ applicationLegalese: Const.legalLease,
+ );
+ },
+ child: Row(
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ const Icon(
+ FontAwesomeIcons.fileLines,
+ size: 20,
+ ),
+ const SizedBox(
+ width: 10,
+ ),
+ Padding(
+ padding: const EdgeInsets.symmetric(vertical: 8.0),
+ child: Text(
+ AppLocalizations.of(context)!.selectAboutDialog('licenses'),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ],
+ );
+ }
+}
diff --git a/lib/dialogs/chabo_about_dialog/web_links_widget.dart b/lib/dialogs/chabo_about_dialog/web_links_widget.dart
new file mode 100644
index 00000000..f9003c2f
--- /dev/null
+++ b/lib/dialogs/chabo_about_dialog/web_links_widget.dart
@@ -0,0 +1,48 @@
+part of 'chabo_about_dialog.dart';
+
+class _WebLinksWidget extends StatelessWidget {
+ const _WebLinksWidget({Key? key}) : super(key: key);
+
+ @override
+ Widget build(BuildContext context) {
+ return Column(
+ children: [
+ Wrap(
+ alignment: WrapAlignment.center,
+ spacing: 10,
+ runSpacing: 10,
+ children: Const.usefulLinks
+ .map(
+ (link) => ElevatedButton(
+ onPressed: () => link.launchURL(),
+ child: Row(
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ Icon(
+ link.iconData,
+ size: 20,
+ ),
+ const SizedBox(
+ width: 10,
+ ),
+ Padding(
+ padding: const EdgeInsets.symmetric(vertical: 8.0),
+ child: Text(
+ AppLocalizations.of(context)!.selectAboutDialog(
+ link.translationKey,
+ ),
+ ),
+ ),
+ const SizedBox(
+ width: 10,
+ ),
+ ],
+ ),
+ ),
+ )
+ .toList(),
+ ),
+ ],
+ );
+ }
+}
diff --git a/lib/dialogs/forecast_information_dialog.dart b/lib/dialogs/forecast_information_dialog.dart
index f0856532..bb750130 100644
--- a/lib/dialogs/forecast_information_dialog.dart
+++ b/lib/dialogs/forecast_information_dialog.dart
@@ -1,5 +1,6 @@
import 'package:chabo/custom_properties.dart';
import 'package:chabo/helpers/custom_page_routes.dart';
+import 'package:chabo/helpers/device_helper.dart';
import 'package:chabo/models/abstract_forecast.dart';
import 'package:chabo/screens/notification_screen/notification_screen.dart';
import 'package:flutter/material.dart';
@@ -66,70 +67,79 @@ class ForecastInformationDialog extends StatelessWidget {
CustomProperties.borderRadius,
),
),
- content: Column(
- mainAxisSize: MainAxisSize.min,
- children: [
- Padding(
- padding: const EdgeInsets.all(20),
- child: forecast.getInformationWidget(context),
- ),
- if (forecast.interferingTimeSlots.isNotEmpty)
- Container(
- padding: const EdgeInsets.all(5),
- decoration: BoxDecoration(
- color: Theme.of(context).colorScheme.primary,
- borderRadius: const BorderRadius.only(
- bottomLeft: Radius.circular(
- 15.0,
- ),
- bottomRight: Radius.circular(
- 15.0,
+ content: Container(
+ constraints: DeviceHelper.isMobile(context)
+ ? DeviceHelper.isPortrait(context)
+ ? null
+ : BoxConstraints(
+ maxWidth: MediaQuery.of(context).size.width * 0.5,
+ )
+ : BoxConstraints(maxWidth: MediaQuery.of(context).size.width * 0.5),
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ Padding(
+ padding: const EdgeInsets.all(20),
+ child: forecast.getInformationWidget(context),
+ ),
+ if (forecast.interferingTimeSlots.isNotEmpty)
+ Container(
+ padding: const EdgeInsets.all(5),
+ decoration: BoxDecoration(
+ color: Theme.of(context).colorScheme.primary,
+ borderRadius: const BorderRadius.only(
+ bottomLeft: Radius.circular(
+ 15.0,
+ ),
+ bottomRight: Radius.circular(
+ 15.0,
+ ),
),
),
- ),
- child: Padding(
- padding: const EdgeInsets.symmetric(horizontal: 10),
- child: Row(
- mainAxisAlignment: MainAxisAlignment.spaceEvenly,
- children: [
- Flexible(
- child: Text(
- AppLocalizations.of(context)!
- .favoriteSlotsInterferenceWarning,
- overflow: TextOverflow.clip,
- style: TextStyle(
- color: Theme.of(context).cardColor,
+ child: Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 10),
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+ children: [
+ Flexible(
+ child: Text(
+ AppLocalizations.of(context)!
+ .favoriteSlotsInterferenceWarning,
+ overflow: TextOverflow.clip,
+ style: TextStyle(
+ color: Theme.of(context).cardColor,
+ ),
),
),
- ),
- ElevatedButton(
- style: ButtonStyle(
- backgroundColor: MaterialStateProperty.all(
- colorScheme.secondaryContainer,
- ),
- foregroundColor: MaterialStateProperty.all(
- colorScheme.onSecondaryContainer,
+ ElevatedButton(
+ style: ButtonStyle(
+ backgroundColor: MaterialStateProperty.all(
+ colorScheme.secondaryContainer,
+ ),
+ foregroundColor: MaterialStateProperty.all(
+ colorScheme.onSecondaryContainer,
+ ),
),
- ),
- onPressed: () => {
- Navigator.of(context).pop(),
- Navigator.of(context).push(
- BottomToTopPageRoute(
- builder: (context) => const NotificationScreen(
- highlightTimeSlots: true,
+ onPressed: () => {
+ Navigator.of(context).pop(),
+ Navigator.of(context).push(
+ BottomToTopPageRoute(
+ builder: (context) => const NotificationScreen(
+ highlightTimeSlots: true,
+ ),
),
),
+ },
+ child: const Icon(
+ Icons.notifications_active,
),
- },
- child: const Icon(
- Icons.notifications_active,
),
- ),
- ],
+ ],
+ ),
),
),
- ),
- ],
+ ],
+ ),
),
);
}
diff --git a/lib/helpers/device_helper.dart b/lib/helpers/device_helper.dart
new file mode 100644
index 00000000..d789b130
--- /dev/null
+++ b/lib/helpers/device_helper.dart
@@ -0,0 +1,31 @@
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+
+class DeviceHelper {
+ static computePreferredOrientation(BuildContext context) {
+ if (isMobile(context)) {
+ SystemChrome.setPreferredOrientations([
+ DeviceOrientation.portraitUp,
+ DeviceOrientation.landscapeLeft,
+ DeviceOrientation.landscapeRight,
+ ]);
+ } else {
+ SystemChrome.setPreferredOrientations([
+ DeviceOrientation.landscapeLeft,
+ DeviceOrientation.landscapeRight,
+ ]);
+ }
+ }
+
+ static isPortrait(BuildContext context) {
+ return MediaQuery.of(context).orientation == Orientation.portrait;
+ }
+
+ static isMobile(BuildContext context) {
+ var shortestSide = MediaQuery.of(context).size.shortestSide;
+
+ return shortestSide < 600;
+ }
+}
+
+enum Device { portrait, landscape }
diff --git a/lib/screens/forecast_screen.dart b/lib/screens/forecast_screen.dart
index 5aa65064..e7090a42 100644
--- a/lib/screens/forecast_screen.dart
+++ b/lib/screens/forecast_screen.dart
@@ -5,6 +5,7 @@ import 'package:chabo/bloc/status/status_bloc.dart';
import 'package:chabo/cubits/floating_actions_cubit.dart';
import 'package:chabo/custom_properties.dart';
import 'package:chabo/custom_widget_state.dart';
+import 'package:chabo/helpers/device_helper.dart';
import 'package:chabo/misc/no_scaling_animation.dart';
import 'package:chabo/screens/error_screen.dart';
import 'package:chabo/widgets/ad_banner_widget.dart';
@@ -39,13 +40,17 @@ class _ForecastScreenState extends CustomWidgetState {
const Expanded(
child: FloatingActionsWidget(),
),
- Padding(
- padding: EdgeInsets.only(
- left: state.isRightHanded ? 32 : 0,
- right: state.isRightHanded ? 0 : 32,
- top: 5,
- ),
- child: const AdBannerWidget(),
+ Row(
+ children: [
+ Padding(
+ padding: EdgeInsets.only(
+ left: state.isRightHanded ? 32 : 0,
+ right: state.isRightHanded ? 0 : 32,
+ top: 5,
+ ),
+ child: const AdBannerWidget(),
+ ),
+ ],
),
],
),
@@ -132,36 +137,85 @@ class _ForecastScreenState extends CustomWidgetState {
},
child: BlocBuilder(
builder: (context, state) {
- return CustomScrollView(
- physics: const BouncingScrollPhysics(),
- slivers: [
- SliverAppBar(
- pinned: true,
- snap: false,
- stretch: true,
- collapsedHeight: 250,
- expandedHeight: 250,
- shadowColor: Colors.black,
- backgroundColor: Theme.of(context)
- .colorScheme
- .surfaceVariant,
- shape: const RoundedRectangleBorder(
- borderRadius: BorderRadius.vertical(
- bottom: Radius.circular(
- CustomProperties.borderRadius * 2,
+ return DeviceHelper.isPortrait(context)
+ ? CustomScrollView(
+ physics: const BouncingScrollPhysics(),
+ slivers: [
+ SliverAppBar(
+ pinned: true,
+ snap: false,
+ stretch: true,
+ collapsedHeight: 250,
+ expandedHeight: 250,
+ shadowColor: Colors.black,
+ backgroundColor: Theme.of(context)
+ .colorScheme
+ .surfaceVariant,
+ shape: const RoundedRectangleBorder(
+ borderRadius: BorderRadius.vertical(
+ bottom: Radius.circular(
+ CustomProperties.borderRadius * 2,
+ ),
+ ),
+ ),
+ flexibleSpace: const FlexibleSpaceBar(
+ titlePadding: EdgeInsets.zero,
+ centerTitle: true,
+ expandedTitleScale: 1,
+ title: StatusWidget(),
+ ),
),
- ),
- ),
- flexibleSpace: const FlexibleSpaceBar(
- titlePadding: EdgeInsets.zero,
- centerTitle: true,
- expandedTitleScale: 1,
- title: StatusWidget(),
- ),
- ),
- const ForecastListWidget(),
- ],
- );
+ const ForecastListWidget(),
+ ],
+ )
+ : Row(
+ children: [
+ Flexible(
+ flex: !DeviceHelper.isMobile(context)
+ ? 2
+ : 1,
+ child: Column(
+ children: [
+ Container(
+ decoration: BoxDecoration(
+ color: Theme.of(context)
+ .colorScheme
+ .surfaceVariant,
+ borderRadius:
+ const BorderRadius.vertical(
+ bottom: Radius.circular(
+ CustomProperties
+ .borderRadius *
+ 2,
+ ),
+ ),
+ ),
+ constraints: BoxConstraints(
+ minHeight:
+ DeviceHelper.isMobile(
+ context,
+ )
+ ? 270
+ : 380,
+ ),
+ child: const StatusWidget(),
+ ),
+ const SizedBox(
+ height: 50,
+ ),
+ ],
+ ),
+ ),
+ const Flexible(
+ child: CustomScrollView(
+ physics: BouncingScrollPhysics(),
+ slivers: [
+ ForecastListWidget(),
+ ],
+ ),
+ ),
+ ],
+ );
},
),
),
diff --git a/lib/widgets/ad_banner_widget.dart b/lib/widgets/ad_banner_widget.dart
index 3822e6da..0a9a7a43 100644
--- a/lib/widgets/ad_banner_widget.dart
+++ b/lib/widgets/ad_banner_widget.dart
@@ -1,6 +1,7 @@
import 'dart:developer' as developer;
import 'package:chabo/helpers/ad_helper.dart';
+import 'package:chabo/helpers/device_helper.dart';
import 'package:flutter/material.dart';
import 'package:google_mobile_ads/google_mobile_ads.dart';
@@ -56,11 +57,21 @@ class _AdBannerWidgetState extends State {
@override
Widget build(BuildContext context) {
+ final screenWidth = MediaQuery.of(context).size.width;
+
return _ad != null
? Card(
child: Container(
key: const ValueKey('adContent'),
- height: 55,
+ constraints: BoxConstraints(
+ maxHeight: 55,
+ maxWidth: DeviceHelper.isPortrait(context)
+ ? screenWidth / 1.11
+ //ignore: avoid-nested-conditional-expressions
+ : !DeviceHelper.isMobile(context)
+ ? screenWidth / 1.55
+ : screenWidth / 2.13,
+ ),
alignment: Alignment.center,
child: AnimatedSize(
curve: Curves.ease,
diff --git a/lib/widgets/floating_actions/floating_actions_widget.dart b/lib/widgets/floating_actions/floating_actions_widget.dart
index f2b92a97..cbdf7501 100644
--- a/lib/widgets/floating_actions/floating_actions_widget.dart
+++ b/lib/widgets/floating_actions/floating_actions_widget.dart
@@ -2,8 +2,9 @@ import 'dart:ui';
import 'package:chabo/cubits/floating_actions_cubit.dart';
import 'package:chabo/custom_properties.dart';
-import 'package:chabo/dialogs/chabo_about_dialog.dart';
+import 'package:chabo/dialogs/chabo_about_dialog/chabo_about_dialog.dart';
import 'package:chabo/helpers/custom_page_routes.dart';
+import 'package:chabo/helpers/device_helper.dart';
import 'package:chabo/screens/notification_screen/notification_screen.dart';
import 'package:chabo/widgets/floating_actions/floating_actions_item.dart';
import 'package:chabo/widgets/theme_switcher_widget.dart';
@@ -62,7 +63,10 @@ class _FloatingActionsWidgetState extends State
sigmaY: CustomProperties.blurSigmaY,
),
child: Wrap(
- direction: Axis.vertical,
+ direction: DeviceHelper.isMobile(context) &&
+ !DeviceHelper.isPortrait(context)
+ ? Axis.horizontal
+ : Axis.vertical,
crossAxisAlignment: state.isRightHanded
? WrapCrossAlignment.end
: WrapCrossAlignment.start,
@@ -91,8 +95,10 @@ class _FloatingActionsWidgetState extends State
onPressed: () {
showModalBottomSheet(
useSafeArea: true,
- constraints: const BoxConstraints(
- minWidth: double.infinity,
+ constraints: BoxConstraints(
+ minWidth: DeviceHelper.isPortrait(context)
+ ? double.infinity
+ : MediaQuery.of(context).size.width / 3,
),
enableDrag: false,
context: context,
diff --git a/lib/widgets/forecast/status_widget/status_widget.dart b/lib/widgets/forecast/status_widget/status_widget.dart
index e01945a1..1c08ffc1 100644
--- a/lib/widgets/forecast/status_widget/status_widget.dart
+++ b/lib/widgets/forecast/status_widget/status_widget.dart
@@ -5,6 +5,7 @@ import 'package:chabo/bloc/status/status_bloc.dart';
import 'package:chabo/custom_properties.dart';
import 'package:chabo/custom_widget_state.dart';
import 'package:chabo/extensions/duration_extension.dart';
+import 'package:chabo/helpers/device_helper.dart';
import 'package:chabo/widgets/forecast/forecast_list_item_widget/forecast_list_item_widget.dart';
import 'package:chabo/widgets/progress_indicator/custom_circular_progress_indicator.dart';
import 'package:chabo/widgets/progress_indicator/custom_progress_bar_indicator.dart';
diff --git a/lib/widgets/forecast/status_widget/text_widget.dart b/lib/widgets/forecast/status_widget/text_widget.dart
index 96f38cce..2c1e1d22 100644
--- a/lib/widgets/forecast/status_widget/text_widget.dart
+++ b/lib/widgets/forecast/status_widget/text_widget.dart
@@ -53,7 +53,11 @@ class _TextWidget extends StatelessWidget {
style: Theme.of(context).textTheme.headlineLarge?.copyWith(
color: statusState.foregroundColor,
fontWeight: FontWeight.bold,
- fontSize: 30,
+ fontSize: DeviceHelper.isMobile(context)
+ ? 30
+ : DeviceHelper.isPortrait(context)
+ ? 30
+ : 55,
),
),
),
From b9e671fe8b34dcff5976fe97ac2f9b50a5e0e5e3 Mon Sep 17 00:00:00 2001
From: Valentin REVERSAT
Date: Thu, 18 May 2023 14:07:45 +0200
Subject: [PATCH 2/6] chore(readme): add codecov badge
---
README.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/README.md b/README.md
index a866f235..9767eb9b 100644
--- a/README.md
+++ b/README.md
@@ -4,6 +4,7 @@
+
Mobile app to track the schedules of the [Chaban Delmas bridge](https://fr.wikipedia.org/wiki/Pont_Jacques-Chaban-Delmas) located in Bordeaux, France.
From e86f5529d1c9449f16bf3e1289dd819ddfc9550a Mon Sep 17 00:00:00 2001
From: Valentin REVERSAT
Date: Thu, 18 May 2023 14:09:15 +0200
Subject: [PATCH 3/6] fix(ci): fix unused code error
---
lib/helpers/device_helper.dart | 2 --
1 file changed, 2 deletions(-)
diff --git a/lib/helpers/device_helper.dart b/lib/helpers/device_helper.dart
index d789b130..05651911 100644
--- a/lib/helpers/device_helper.dart
+++ b/lib/helpers/device_helper.dart
@@ -27,5 +27,3 @@ class DeviceHelper {
return shortestSide < 600;
}
}
-
-enum Device { portrait, landscape }
From d96e5a02a5d63f80c0df9d705175b656dfebadd6 Mon Sep 17 00:00:00 2001
From: Valentin REVERSAT
Date: Thu, 18 May 2023 14:14:27 +0200
Subject: [PATCH 4/6] chore(naming): rename `ForecastListItemWidget` to
`ForecastWidget`
---
lib/widgets/forecast/forecast_list_widget.dart | 4 ++--
.../closing_info_widget.dart | 2 +-
.../duration_widget.dart | 2 +-
.../forecast_widget.dart} | 4 ++--
.../leading_icon_widget.dart | 2 +-
.../opening_info_widget.dart | 2 +-
.../time_slot_warning_widget.dart | 2 +-
lib/widgets/forecast/status_widget/current_status_widget.dart | 2 +-
lib/widgets/forecast/status_widget/status_widget.dart | 2 +-
9 files changed, 11 insertions(+), 11 deletions(-)
rename lib/widgets/forecast/{forecast_list_item_widget => forecast_widget}/closing_info_widget.dart (95%)
rename lib/widgets/forecast/{forecast_list_item_widget => forecast_widget}/duration_widget.dart (94%)
rename lib/widgets/forecast/{forecast_list_item_widget/forecast_list_item_widget.dart => forecast_widget/forecast_widget.dart} (98%)
rename lib/widgets/forecast/{forecast_list_item_widget => forecast_widget}/leading_icon_widget.dart (95%)
rename lib/widgets/forecast/{forecast_list_item_widget => forecast_widget}/opening_info_widget.dart (95%)
rename lib/widgets/forecast/{forecast_list_item_widget => forecast_widget}/time_slot_warning_widget.dart (94%)
diff --git a/lib/widgets/forecast/forecast_list_widget.dart b/lib/widgets/forecast/forecast_list_widget.dart
index eb5fea70..3d0ef8a6 100644
--- a/lib/widgets/forecast/forecast_list_widget.dart
+++ b/lib/widgets/forecast/forecast_list_widget.dart
@@ -2,7 +2,7 @@ import 'package:chabo/bloc/forecast/forecast_bloc.dart';
import 'package:chabo/bloc/notification/notification_bloc.dart';
import 'package:chabo/bloc/scroll_status/scroll_status_bloc.dart';
import 'package:chabo/models/abstract_forecast.dart';
-import 'package:chabo/widgets/forecast/forecast_list_item_widget/forecast_list_item_widget.dart';
+import 'package:chabo/widgets/forecast/forecast_widget/forecast_widget.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:intl/intl.dart';
@@ -42,7 +42,7 @@ class _ForecastListWidgetState extends State {
.computeSlotInterference(timeSlotState.timeSlotsValue);
return !forecast.hasPassed()
- ? ForecastListItemWidget(
+ ? ForecastWidget(
key: GlobalObjectKey(forecast.hashCode),
isCurrent: forecast == forecastState.currentForecast,
hasPassed: forecast.hasPassed(),
diff --git a/lib/widgets/forecast/forecast_list_item_widget/closing_info_widget.dart b/lib/widgets/forecast/forecast_widget/closing_info_widget.dart
similarity index 95%
rename from lib/widgets/forecast/forecast_list_item_widget/closing_info_widget.dart
rename to lib/widgets/forecast/forecast_widget/closing_info_widget.dart
index 4c99e900..3acfa86e 100644
--- a/lib/widgets/forecast/forecast_list_item_widget/closing_info_widget.dart
+++ b/lib/widgets/forecast/forecast_widget/closing_info_widget.dart
@@ -1,4 +1,4 @@
-part of 'forecast_list_item_widget.dart';
+part of 'forecast_widget.dart';
class _ClosingInfoWidget extends StatelessWidget {
final AbstractForecast forecast;
diff --git a/lib/widgets/forecast/forecast_list_item_widget/duration_widget.dart b/lib/widgets/forecast/forecast_widget/duration_widget.dart
similarity index 94%
rename from lib/widgets/forecast/forecast_list_item_widget/duration_widget.dart
rename to lib/widgets/forecast/forecast_widget/duration_widget.dart
index c6e1a027..3e8f920a 100644
--- a/lib/widgets/forecast/forecast_list_item_widget/duration_widget.dart
+++ b/lib/widgets/forecast/forecast_widget/duration_widget.dart
@@ -1,4 +1,4 @@
-part of 'forecast_list_item_widget.dart';
+part of 'forecast_widget.dart';
class _DurationWidget extends StatelessWidget {
final AbstractForecast forecast;
diff --git a/lib/widgets/forecast/forecast_list_item_widget/forecast_list_item_widget.dart b/lib/widgets/forecast/forecast_widget/forecast_widget.dart
similarity index 98%
rename from lib/widgets/forecast/forecast_list_item_widget/forecast_list_item_widget.dart
rename to lib/widgets/forecast/forecast_widget/forecast_widget.dart
index 027c3239..bf4b410d 100644
--- a/lib/widgets/forecast/forecast_list_item_widget/forecast_list_item_widget.dart
+++ b/lib/widgets/forecast/forecast_widget/forecast_widget.dart
@@ -20,7 +20,7 @@ part 'opening_info_widget.dart';
part 'time_slot_warning_widget.dart';
-class ForecastListItemWidget extends StatelessWidget {
+class ForecastWidget extends StatelessWidget {
final AbstractForecast forecast;
final Function()? onTap;
final bool hasPassed;
@@ -29,7 +29,7 @@ class ForecastListItemWidget extends StatelessWidget {
final int index;
final Color? backgroundColor;
- const ForecastListItemWidget({
+ const ForecastWidget({
Key? key,
required this.forecast,
required this.index,
diff --git a/lib/widgets/forecast/forecast_list_item_widget/leading_icon_widget.dart b/lib/widgets/forecast/forecast_widget/leading_icon_widget.dart
similarity index 95%
rename from lib/widgets/forecast/forecast_list_item_widget/leading_icon_widget.dart
rename to lib/widgets/forecast/forecast_widget/leading_icon_widget.dart
index dbb0d5bb..5823f0df 100644
--- a/lib/widgets/forecast/forecast_list_item_widget/leading_icon_widget.dart
+++ b/lib/widgets/forecast/forecast_widget/leading_icon_widget.dart
@@ -1,4 +1,4 @@
-part of 'forecast_list_item_widget.dart';
+part of 'forecast_widget.dart';
class _LeadingIconWidget extends StatelessWidget {
final AbstractForecast forecast;
diff --git a/lib/widgets/forecast/forecast_list_item_widget/opening_info_widget.dart b/lib/widgets/forecast/forecast_widget/opening_info_widget.dart
similarity index 95%
rename from lib/widgets/forecast/forecast_list_item_widget/opening_info_widget.dart
rename to lib/widgets/forecast/forecast_widget/opening_info_widget.dart
index 6bbab2ad..032c53db 100644
--- a/lib/widgets/forecast/forecast_list_item_widget/opening_info_widget.dart
+++ b/lib/widgets/forecast/forecast_widget/opening_info_widget.dart
@@ -1,4 +1,4 @@
-part of 'forecast_list_item_widget.dart';
+part of 'forecast_widget.dart';
class _OpeningInfoWidget extends StatelessWidget {
final AbstractForecast forecast;
diff --git a/lib/widgets/forecast/forecast_list_item_widget/time_slot_warning_widget.dart b/lib/widgets/forecast/forecast_widget/time_slot_warning_widget.dart
similarity index 94%
rename from lib/widgets/forecast/forecast_list_item_widget/time_slot_warning_widget.dart
rename to lib/widgets/forecast/forecast_widget/time_slot_warning_widget.dart
index 8aad2713..bf3853c5 100644
--- a/lib/widgets/forecast/forecast_list_item_widget/time_slot_warning_widget.dart
+++ b/lib/widgets/forecast/forecast_widget/time_slot_warning_widget.dart
@@ -1,4 +1,4 @@
-part of 'forecast_list_item_widget.dart';
+part of 'forecast_widget.dart';
class _TimeSlotWarningWidget extends StatelessWidget {
const _TimeSlotWarningWidget({Key? key}) : super(key: key);
diff --git a/lib/widgets/forecast/status_widget/current_status_widget.dart b/lib/widgets/forecast/status_widget/current_status_widget.dart
index a09d64f2..64c41377 100644
--- a/lib/widgets/forecast/status_widget/current_status_widget.dart
+++ b/lib/widgets/forecast/status_widget/current_status_widget.dart
@@ -33,7 +33,7 @@ class _CurrentStatusWidget extends StatelessWidget {
padding: const EdgeInsets.symmetric(
horizontal: 10,
),
- child: ForecastListItemWidget(
+ child: ForecastWidget(
onTap: () => {
BlocProvider.of(
context,
diff --git a/lib/widgets/forecast/status_widget/status_widget.dart b/lib/widgets/forecast/status_widget/status_widget.dart
index 1c08ffc1..f3587644 100644
--- a/lib/widgets/forecast/status_widget/status_widget.dart
+++ b/lib/widgets/forecast/status_widget/status_widget.dart
@@ -6,7 +6,7 @@ import 'package:chabo/custom_properties.dart';
import 'package:chabo/custom_widget_state.dart';
import 'package:chabo/extensions/duration_extension.dart';
import 'package:chabo/helpers/device_helper.dart';
-import 'package:chabo/widgets/forecast/forecast_list_item_widget/forecast_list_item_widget.dart';
+import 'package:chabo/widgets/forecast/forecast_widget/forecast_widget.dart';
import 'package:chabo/widgets/progress_indicator/custom_circular_progress_indicator.dart';
import 'package:chabo/widgets/progress_indicator/custom_progress_bar_indicator.dart';
import 'package:flutter/material.dart';
From 6211549b5bba84a3ff9b29fd240f649d3e11548b Mon Sep 17 00:00:00 2001
From: Valentin REVERSAT
Date: Thu, 18 May 2023 15:04:17 +0200
Subject: [PATCH 5/6] fix(ui): set isMobile detection to a greater threshold
---
lib/helpers/device_helper.dart | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/helpers/device_helper.dart b/lib/helpers/device_helper.dart
index 05651911..352cea29 100644
--- a/lib/helpers/device_helper.dart
+++ b/lib/helpers/device_helper.dart
@@ -24,6 +24,6 @@ class DeviceHelper {
static isMobile(BuildContext context) {
var shortestSide = MediaQuery.of(context).size.shortestSide;
- return shortestSide < 600;
+ return shortestSide < 620;
}
}
From 244073e08e9a99245d48b538df0780dd0824925d Mon Sep 17 00:00:00 2001
From: Valentin REVERSAT
Date: Thu, 18 May 2023 15:19:13 +0200
Subject: [PATCH 6/6] chore(playstore): upgrade screenshots
---
.../images/sevenInchScreenshots/1_en-GB.png | Bin 292856 -> 121214 bytes
.../images/sevenInchScreenshots/2_en-GB.png | Bin 629465 -> 273660 bytes
.../images/sevenInchScreenshots/3_en-GB.png | Bin 289229 -> 121277 bytes
.../images/sevenInchScreenshots/4_en-GB.png | Bin 203007 -> 103766 bytes
.../images/tenInchScreenshots/1_en-GB.png | Bin 292856 -> 339118 bytes
.../images/tenInchScreenshots/2_en-GB.png | Bin 629465 -> 967171 bytes
.../images/tenInchScreenshots/3_en-GB.png | Bin 289229 -> 334644 bytes
.../images/tenInchScreenshots/4_en-GB.png | Bin 203007 -> 177351 bytes
.../{1_en-GB.png => 1_en-US.png} | Bin
.../{2_en-GB.png => 2_en-US.png} | Bin
.../{3_en-GB.png => 3_en-US.png} | Bin
.../{4_en-GB.png => 4_en-US.png} | Bin
.../images/sevenInchScreenshots/1_en-GB.png | Bin 292856 -> 0 bytes
.../images/sevenInchScreenshots/1_en-US.png | Bin 0 -> 121214 bytes
.../images/sevenInchScreenshots/2_en-GB.png | Bin 629465 -> 0 bytes
.../images/sevenInchScreenshots/2_en-US.png | Bin 0 -> 273660 bytes
.../images/sevenInchScreenshots/3_en-GB.png | Bin 289229 -> 0 bytes
.../images/sevenInchScreenshots/3_en-US.png | Bin 0 -> 121277 bytes
.../images/sevenInchScreenshots/4_en-GB.png | Bin 203007 -> 0 bytes
.../images/sevenInchScreenshots/4_en-US.png | Bin 0 -> 103766 bytes
.../images/tenInchScreenshots/1_en-GB.png | Bin 292856 -> 0 bytes
.../images/tenInchScreenshots/1_en-US.png | Bin 0 -> 339118 bytes
.../images/tenInchScreenshots/2_en-GB.png | Bin 629465 -> 0 bytes
.../images/tenInchScreenshots/2_en-US.png | Bin 0 -> 967171 bytes
.../images/tenInchScreenshots/3_en-GB.png | Bin 289229 -> 0 bytes
.../images/tenInchScreenshots/3_en-US.png | Bin 0 -> 334644 bytes
.../images/tenInchScreenshots/4_en-GB.png | Bin 203007 -> 0 bytes
.../images/tenInchScreenshots/4_en-US.png | Bin 0 -> 177351 bytes
.../images/sevenInchScreenshots/1_es-ES.png | Bin 282383 -> 116997 bytes
.../images/sevenInchScreenshots/2_es-ES.png | Bin 603372 -> 257754 bytes
.../images/sevenInchScreenshots/3_es-ES.png | Bin 277044 -> 116671 bytes
.../images/sevenInchScreenshots/4_es-ES.png | Bin 189125 -> 105857 bytes
.../images/tenInchScreenshots/1_es-ES.png | Bin 282383 -> 329064 bytes
.../images/tenInchScreenshots/2_es-ES.png | Bin 603372 -> 912665 bytes
.../images/tenInchScreenshots/3_es-ES.png | Bin 277044 -> 324224 bytes
.../images/tenInchScreenshots/4_es-ES.png | Bin 189125 -> 176050 bytes
.../images/sevenInchScreenshots/1_fr-FR.png | Bin 275477 -> 113244 bytes
.../images/sevenInchScreenshots/2_fr-FR.png | Bin 616878 -> 264429 bytes
.../images/sevenInchScreenshots/3_fr-FR.png | Bin 269643 -> 112637 bytes
.../images/sevenInchScreenshots/4_fr-FR.png | Bin 207794 -> 105534 bytes
.../images/tenInchScreenshots/1_fr-FR.png | Bin 275477 -> 322110 bytes
.../images/tenInchScreenshots/2_fr-FR.png | Bin 616878 -> 901517 bytes
.../images/tenInchScreenshots/3_fr-FR.png | Bin 269643 -> 316380 bytes
.../images/tenInchScreenshots/4_fr-FR.png | Bin 207794 -> 170460 bytes
44 files changed, 0 insertions(+), 0 deletions(-)
rename android/fastlane/metadata/android/en-US/images/phoneScreenshots/{1_en-GB.png => 1_en-US.png} (100%)
rename android/fastlane/metadata/android/en-US/images/phoneScreenshots/{2_en-GB.png => 2_en-US.png} (100%)
rename android/fastlane/metadata/android/en-US/images/phoneScreenshots/{3_en-GB.png => 3_en-US.png} (100%)
rename android/fastlane/metadata/android/en-US/images/phoneScreenshots/{4_en-GB.png => 4_en-US.png} (100%)
delete mode 100644 android/fastlane/metadata/android/en-US/images/sevenInchScreenshots/1_en-GB.png
create mode 100644 android/fastlane/metadata/android/en-US/images/sevenInchScreenshots/1_en-US.png
delete mode 100644 android/fastlane/metadata/android/en-US/images/sevenInchScreenshots/2_en-GB.png
create mode 100644 android/fastlane/metadata/android/en-US/images/sevenInchScreenshots/2_en-US.png
delete mode 100644 android/fastlane/metadata/android/en-US/images/sevenInchScreenshots/3_en-GB.png
create mode 100644 android/fastlane/metadata/android/en-US/images/sevenInchScreenshots/3_en-US.png
delete mode 100644 android/fastlane/metadata/android/en-US/images/sevenInchScreenshots/4_en-GB.png
create mode 100644 android/fastlane/metadata/android/en-US/images/sevenInchScreenshots/4_en-US.png
delete mode 100644 android/fastlane/metadata/android/en-US/images/tenInchScreenshots/1_en-GB.png
create mode 100644 android/fastlane/metadata/android/en-US/images/tenInchScreenshots/1_en-US.png
delete mode 100644 android/fastlane/metadata/android/en-US/images/tenInchScreenshots/2_en-GB.png
create mode 100644 android/fastlane/metadata/android/en-US/images/tenInchScreenshots/2_en-US.png
delete mode 100644 android/fastlane/metadata/android/en-US/images/tenInchScreenshots/3_en-GB.png
create mode 100644 android/fastlane/metadata/android/en-US/images/tenInchScreenshots/3_en-US.png
delete mode 100644 android/fastlane/metadata/android/en-US/images/tenInchScreenshots/4_en-GB.png
create mode 100644 android/fastlane/metadata/android/en-US/images/tenInchScreenshots/4_en-US.png
diff --git a/android/fastlane/metadata/android/en-GB/images/sevenInchScreenshots/1_en-GB.png b/android/fastlane/metadata/android/en-GB/images/sevenInchScreenshots/1_en-GB.png
index 11cdfedfed5cc4cffb9589e5507319ebacbfe0ed..5b425b2198731f00f6268fc582dcc4d6d1bed078 100644
GIT binary patch
literal 121214
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