Compare commits

...

2 Commits

Author SHA1 Message Date
37118b7991 Allow to use webview & open ios app store link on ios
All checks were successful
gestemps/comptaplanapp/pipeline/head This commit looks good
2022-01-19 22:05:50 +01:00
Jenkins release
912f527bdd Bump to build Update pubspec for version 1.0.0+67
66
2022-01-19 20:15:30 +01:00
7 changed files with 166 additions and 38 deletions

2
Jenkinsfile vendored
View File

@ -10,6 +10,7 @@ pipeline {
string(name: 'APP_PACKAGE_ID', defaultValue: 'comptaplan.app', description: 'Application package id used as android identifier')
string(name: 'APP_BUNDLE_ID', defaultValue: 'comptaplan_app', description: 'Application bundle id used as ios identifier')
string(name: 'APP_TITLE', defaultValue: 'My Comptaplan', description: 'Application title')
string(name: 'APP_URI', defaultValue: 'https://my.comptaplan.be', description: 'Application uri')
string(name: 'APP_COLOR', defaultValue: 'blue', description: 'Application color (blue, teal, ...)')
string(name: 'BUILD_MODE', defaultValue: 'debug', description: 'Flutter build mode (debug/release)')
string(name: 'ANDROID_SIGNING_KEYSTORE_CREDENTIAL', defaultValue: 'jenkins-gestemps-android-service-secret-keystore')
@ -38,6 +39,7 @@ pipeline {
env.APP_PACKAGE_ID= params.APP_PACKAGE_ID
env.APP_BUNDLE_ID= params.APP_BUNDLE_ID
env.APP_TITLE= params.APP_TITLE
env.APP_URI= params.APP_URI
env.APP_COLOR= params.APP_COLOR
env.BUILD_MODE= params.BUILD_MODE
env.SSH_KNOWN_HOSTS_FILE= params.SSH_KNOWN_HOSTS_FILE

View File

@ -1,25 +1,33 @@
import 'package:comptaplan_app/winbooks_migration_widget.dart';
import 'package:comptaplan_app/webview_widget.dart';
import 'package:flutter/material.dart';
void main() {
const title = String.fromEnvironment("APP_TITLE");
const uri = String.fromEnvironment("APP_URI");
const playStoreUri = 'https://play.google.com/store/apps/details?id=com.winbooks.connect';
const appStoreUri = 'https://apps.apple.com/be/app/winbooks-connect/id1534550954';
const color = String.fromEnvironment("APP_COLOR");
runApp(const MyApp(title, playStoreUri, color));
runApp(const MyApp(title, uri, playStoreUri, appStoreUri, color));
}
class MyApp extends StatelessWidget {
final String _title;
final String _uri;
final String _playstoreUri;
final String _appStoreUri;
final String _color;
const MyApp(this._title, this._uri, this._color, {Key? key}) : super(key: key);
const MyApp(this._title, this._uri, this._playstoreUri, this._appStoreUri, this._color, {Key? key}) : super(key: key);
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
MaterialColor materialColor = _getMaterialColor(_color);
return MaterialApp(title: _title, theme: ThemeData(primarySwatch: materialColor), home: WinbooksMigrationWidget(_title, _uri));
return MaterialApp(title: _title, theme: ThemeData(primarySwatch: materialColor), initialRoute: '/migrate', routes: {
'/migrate': (context) => WinbooksMigrationWidget(_title, _playstoreUri, _appStoreUri),
'/web': (context) => WebViewWidget(_uri),
});
}
MaterialColor _getMaterialColor(String colorString) {

47
lib/webview_widget.dart Normal file
View File

@ -0,0 +1,47 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_webview_pro/webview_flutter.dart';
class WebViewWidget extends StatefulWidget {
final String _initialUrl;
const WebViewWidget(this._initialUrl, {Key? key}) : super(key: key);
@override
WebViewWidgetState createState() => WebViewWidgetState();
}
class WebViewWidgetState extends State<WebViewWidget> {
WebViewWidgetState();
@override
void initState() {
super.initState();
// Enable hybrid composition.
if (Platform.isAndroid) WebView.platform = SurfaceAndroidWebView();
}
@override
Widget build(BuildContext context) {
return WebView(
initialUrl: widget._initialUrl,
javascriptMode: JavascriptMode.unrestricted,
javascriptChannels: <JavascriptChannel>{
_toasterJavascriptChannel(context),
},
gestureNavigationEnabled: true,
);
}
JavascriptChannel _toasterJavascriptChannel(BuildContext context) {
return JavascriptChannel(
name: 'Toaster',
onMessageReceived: (JavascriptMessage message) {
// ignore: deprecated_member_use
Scaffold.of(context).showSnackBar(
SnackBar(content: Text(message.message)),
);
});
}
}

View File

@ -2,12 +2,14 @@ import 'dart:io';
import 'package:android_intent_plus/android_intent.dart';
import 'package:flutter/material.dart';
import 'package:url_launcher/url_launcher.dart';
class WinbooksMigrationWidget extends StatefulWidget {
final String _playStoreUrl;
final String _appStoreUrl;
final String _title;
const WinbooksMigrationWidget(this._title, this._playStoreUrl, {Key? key}) : super(key: key);
const WinbooksMigrationWidget(this._title, this._playStoreUrl, this._appStoreUrl, {Key? key}) : super(key: key);
@override
WinbooksMigrationWidgetState createState() => WinbooksMigrationWidgetState();
@ -50,7 +52,7 @@ class WinbooksMigrationWidgetState extends State<WinbooksMigrationWidget> {
child: Row(children: [
Image.asset('images/winbooks_connect.png', bundle: assetBundle, width: 50.0, height: 50.0),
const SizedBox(width: 10),
const Text('Télécharger WinBooks Connect')
const Flexible(child: Text('Télécharger WinBooks Connect', textAlign: TextAlign.left, softWrap: true))
]),
onPressed: () async {
return _onWinbooksConnectPress();
@ -65,6 +67,23 @@ class WinbooksMigrationWidgetState extends State<WinbooksMigrationWidget> {
textAlign: TextAlign.left,
style: smallerTextStyle),
),
Center(
child: Container(
margin: const EdgeInsets.all(10.0),
child: ElevatedButton(
style: ElevatedButton.styleFrom(textStyle: smallerTextStyle, padding: const EdgeInsets.all(10.0)),
child: const Text('Vers My Comptaplan', softWrap: true),
onPressed: () async {
return _onMyComptaplanPress();
},
),
),
),
Container(
margin: const EdgeInsets.all(10.0),
child: Text("L'accès à My Comptaplan risque de ne plus fonctionner prochainement.",
textAlign: TextAlign.left, style: smallerTextStyle),
),
])
],
));
@ -77,7 +96,13 @@ class WinbooksMigrationWidgetState extends State<WinbooksMigrationWidget> {
data: widget._playStoreUrl,
package: 'com.android.vending',
);
return intent.launch();
await intent.launch();
} else if (Platform.isIOS) {
await launch(widget._appStoreUrl);
}
}
Future<void> _onMyComptaplanPress() async {
await Navigator.pushNamed(context, '/web');
}
}

View File

@ -81,6 +81,11 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
flutter_web_plugins:
dependency: transitive
description: flutter
source: sdk
version: "0.0.0"
flutter_webview_pro:
dependency: "direct main"
description:
@ -88,6 +93,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.0"
js:
dependency: transitive
description:
name: js
url: "https://pub.dartlang.org"
source: hosted
version: "0.6.3"
lints:
dependency: transitive
description:
@ -123,6 +135,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "3.1.0"
plugin_platform_interface:
dependency: transitive
description:
name: plugin_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.2"
sky_engine:
dependency: transitive
description: flutter
@ -177,6 +196,62 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.3.0"
url_launcher:
dependency: "direct main"
description:
name: url_launcher
url: "https://pub.dartlang.org"
source: hosted
version: "6.0.18"
url_launcher_android:
dependency: transitive
description:
name: url_launcher_android
url: "https://pub.dartlang.org"
source: hosted
version: "6.0.14"
url_launcher_ios:
dependency: transitive
description:
name: url_launcher_ios
url: "https://pub.dartlang.org"
source: hosted
version: "6.0.14"
url_launcher_linux:
dependency: transitive
description:
name: url_launcher_linux
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.3"
url_launcher_macos:
dependency: transitive
description:
name: url_launcher_macos
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.2"
url_launcher_platform_interface:
dependency: transitive
description:
name: url_launcher_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.5"
url_launcher_web:
dependency: transitive
description:
name: url_launcher_web
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.6"
url_launcher_windows:
dependency: transitive
description:
name: url_launcher_windows
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.2"
vector_math:
dependency: transitive
description:
@ -186,4 +261,4 @@ packages:
version: "2.1.1"
sdks:
dart: ">=2.14.0 <3.0.0"
flutter: ">=1.22.0"
flutter: ">=2.5.0"

View File

@ -15,7 +15,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
# Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 1.0.0+66
version: 1.0.0+67
environment:
sdk: ">=2.12.0 <3.0.0"
@ -37,6 +37,7 @@ dependencies:
#webview_flutter: ^2.3.1
flutter_webview_pro: ^1.0.0
android_intent_plus: ^3.0.2
url_launcher: ^6.0.18
dev_dependencies:
flutter_test:

View File

@ -1,30 +0,0 @@
// This is a basic Flutter widget test.
//
// To perform an interaction with a widget in your test, use the WidgetTester
// utility that Flutter provides. For example, you can send tap and scroll
// gestures. You can also use WidgetTester to find child widgets in the widget
// tree, read text, and verify that the values of widget properties are correct.
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:comptaplan_app/main.dart';
void main() {
testWidgets('Counter increments smoke test', (WidgetTester tester) async {
// Build our app and trigger a frame.
await tester.pumpWidget(const MyApp('test', 'test', 'blue'));
// Verify that our counter starts at 0.
expect(find.text('0'), findsOneWidget);
expect(find.text('1'), findsNothing);
// Tap the '+' icon and trigger a frame.
await tester.tap(find.byIcon(Icons.add));
await tester.pump();
// Verify that our counter has incremented.
expect(find.text('0'), findsNothing);
expect(find.text('1'), findsOneWidget);
});
}