Allow to use webview & open ios app store link on ios
All checks were successful
gestemps/comptaplanapp/pipeline/head This commit looks good
All checks were successful
gestemps/comptaplanapp/pipeline/head This commit looks good
This commit is contained in:
parent
912f527bdd
commit
37118b7991
2
Jenkinsfile
vendored
2
Jenkinsfile
vendored
|
@ -10,6 +10,7 @@ pipeline {
|
||||||
string(name: 'APP_PACKAGE_ID', defaultValue: 'comptaplan.app', description: 'Application package id used as android identifier')
|
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_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_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: 'APP_COLOR', defaultValue: 'blue', description: 'Application color (blue, teal, ...)')
|
||||||
string(name: 'BUILD_MODE', defaultValue: 'debug', description: 'Flutter build mode (debug/release)')
|
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')
|
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_PACKAGE_ID= params.APP_PACKAGE_ID
|
||||||
env.APP_BUNDLE_ID= params.APP_BUNDLE_ID
|
env.APP_BUNDLE_ID= params.APP_BUNDLE_ID
|
||||||
env.APP_TITLE= params.APP_TITLE
|
env.APP_TITLE= params.APP_TITLE
|
||||||
|
env.APP_URI= params.APP_URI
|
||||||
env.APP_COLOR= params.APP_COLOR
|
env.APP_COLOR= params.APP_COLOR
|
||||||
env.BUILD_MODE= params.BUILD_MODE
|
env.BUILD_MODE= params.BUILD_MODE
|
||||||
env.SSH_KNOWN_HOSTS_FILE= params.SSH_KNOWN_HOSTS_FILE
|
env.SSH_KNOWN_HOSTS_FILE= params.SSH_KNOWN_HOSTS_FILE
|
||||||
|
|
|
@ -1,25 +1,33 @@
|
||||||
import 'package:comptaplan_app/winbooks_migration_widget.dart';
|
import 'package:comptaplan_app/winbooks_migration_widget.dart';
|
||||||
|
import 'package:comptaplan_app/webview_widget.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
const title = String.fromEnvironment("APP_TITLE");
|
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 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");
|
const color = String.fromEnvironment("APP_COLOR");
|
||||||
runApp(const MyApp(title, playStoreUri, color));
|
runApp(const MyApp(title, uri, playStoreUri, appStoreUri, color));
|
||||||
}
|
}
|
||||||
|
|
||||||
class MyApp extends StatelessWidget {
|
class MyApp extends StatelessWidget {
|
||||||
final String _title;
|
final String _title;
|
||||||
final String _uri;
|
final String _uri;
|
||||||
|
final String _playstoreUri;
|
||||||
|
final String _appStoreUri;
|
||||||
final String _color;
|
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.
|
// This widget is the root of your application.
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
MaterialColor materialColor = _getMaterialColor(_color);
|
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) {
|
MaterialColor _getMaterialColor(String colorString) {
|
||||||
|
|
47
lib/webview_widget.dart
Normal file
47
lib/webview_widget.dart
Normal 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)),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,12 +2,14 @@ import 'dart:io';
|
||||||
|
|
||||||
import 'package:android_intent_plus/android_intent.dart';
|
import 'package:android_intent_plus/android_intent.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:url_launcher/url_launcher.dart';
|
||||||
|
|
||||||
class WinbooksMigrationWidget extends StatefulWidget {
|
class WinbooksMigrationWidget extends StatefulWidget {
|
||||||
final String _playStoreUrl;
|
final String _playStoreUrl;
|
||||||
|
final String _appStoreUrl;
|
||||||
final String _title;
|
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
|
@override
|
||||||
WinbooksMigrationWidgetState createState() => WinbooksMigrationWidgetState();
|
WinbooksMigrationWidgetState createState() => WinbooksMigrationWidgetState();
|
||||||
|
@ -50,7 +52,7 @@ class WinbooksMigrationWidgetState extends State<WinbooksMigrationWidget> {
|
||||||
child: Row(children: [
|
child: Row(children: [
|
||||||
Image.asset('images/winbooks_connect.png', bundle: assetBundle, width: 50.0, height: 50.0),
|
Image.asset('images/winbooks_connect.png', bundle: assetBundle, width: 50.0, height: 50.0),
|
||||||
const SizedBox(width: 10),
|
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 {
|
onPressed: () async {
|
||||||
return _onWinbooksConnectPress();
|
return _onWinbooksConnectPress();
|
||||||
|
@ -65,6 +67,23 @@ class WinbooksMigrationWidgetState extends State<WinbooksMigrationWidget> {
|
||||||
textAlign: TextAlign.left,
|
textAlign: TextAlign.left,
|
||||||
style: smallerTextStyle),
|
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,
|
data: widget._playStoreUrl,
|
||||||
package: 'com.android.vending',
|
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');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
77
pubspec.lock
77
pubspec.lock
|
@ -81,6 +81,11 @@ packages:
|
||||||
description: flutter
|
description: flutter
|
||||||
source: sdk
|
source: sdk
|
||||||
version: "0.0.0"
|
version: "0.0.0"
|
||||||
|
flutter_web_plugins:
|
||||||
|
dependency: transitive
|
||||||
|
description: flutter
|
||||||
|
source: sdk
|
||||||
|
version: "0.0.0"
|
||||||
flutter_webview_pro:
|
flutter_webview_pro:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
@ -88,6 +93,13 @@ packages:
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.0.0"
|
version: "1.0.0"
|
||||||
|
js:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: js
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "0.6.3"
|
||||||
lints:
|
lints:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -123,6 +135,13 @@ packages:
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.1.0"
|
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:
|
sky_engine:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description: flutter
|
description: flutter
|
||||||
|
@ -177,6 +196,62 @@ packages:
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.3.0"
|
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:
|
vector_math:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -186,4 +261,4 @@ packages:
|
||||||
version: "2.1.1"
|
version: "2.1.1"
|
||||||
sdks:
|
sdks:
|
||||||
dart: ">=2.14.0 <3.0.0"
|
dart: ">=2.14.0 <3.0.0"
|
||||||
flutter: ">=1.22.0"
|
flutter: ">=2.5.0"
|
||||||
|
|
|
@ -37,6 +37,7 @@ dependencies:
|
||||||
#webview_flutter: ^2.3.1
|
#webview_flutter: ^2.3.1
|
||||||
flutter_webview_pro: ^1.0.0
|
flutter_webview_pro: ^1.0.0
|
||||||
android_intent_plus: ^3.0.2
|
android_intent_plus: ^3.0.2
|
||||||
|
url_launcher: ^6.0.18
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_test:
|
flutter_test:
|
||||||
|
|
|
@ -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);
|
|
||||||
});
|
|
||||||
}
|
|
Reference in New Issue
Block a user