From d8405882fa8e9d7a0278fbdcb3a8e8854529e4bc Mon Sep 17 00:00:00 2001 From: Robert Ancell Date: Tue, 23 Jun 2020 11:57:39 +1200 Subject: [PATCH 1/7] Set the application-id in the Linux shell --- packages/flutter_tools/lib/src/commands/create.dart | 7 ++++++- .../templates/app/linux.tmpl/my_application.cc.tmpl | 4 +++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/flutter_tools/lib/src/commands/create.dart b/packages/flutter_tools/lib/src/commands/create.dart index c5a36f695e739..86206cb84abe3 100644 --- a/packages/flutter_tools/lib/src/commands/create.dart +++ b/packages/flutter_tools/lib/src/commands/create.dart @@ -593,13 +593,18 @@ To edit platform code in an IDE see https://flutter.dev/developing-packages/#edi final String pluginClassSnakeCase = snakeCase(pluginClass); final String pluginClassCapitalSnakeCase = pluginClassSnakeCase.toUpperCase(); final String appleIdentifier = _createUTIIdentifier(organization, projectName); + final String androidIdentifier = _createAndroidIdentifier(organization, projectName); + // Linux uses the same scheme as the Android identifier. + // https://developer.gnome.org/gio/stable/GApplication.html#g-application-id-is-valid + final String linuxIdentifier = androidIdentifier; return { 'organization': organization, 'projectName': projectName, - 'androidIdentifier': _createAndroidIdentifier(organization, projectName), + 'androidIdentifier': androidIdentifier, 'iosIdentifier': appleIdentifier, 'macosIdentifier': appleIdentifier, + 'linuxIdentifier': linuxIdentifier, 'description': projectDescription, 'dartSdk': '$flutterRoot/bin/cache/dart-sdk', 'useAndroidEmbeddingV2': featureFlags.isAndroidEmbeddingV2Enabled, diff --git a/packages/flutter_tools/templates/app/linux.tmpl/my_application.cc.tmpl b/packages/flutter_tools/templates/app/linux.tmpl/my_application.cc.tmpl index 6fe3050515d24..0cc1811974125 100644 --- a/packages/flutter_tools/templates/app/linux.tmpl/my_application.cc.tmpl +++ b/packages/flutter_tools/templates/app/linux.tmpl/my_application.cc.tmpl @@ -40,5 +40,7 @@ static void my_application_class_init(MyApplicationClass* klass) { static void my_application_init(MyApplication* self) {} MyApplication* my_application_new() { - return MY_APPLICATION(g_object_new(my_application_get_type(), nullptr)); + return MY_APPLICATION(g_object_new(my_application_get_type(), + "application-id", "{{linuxIdentifier}}", + nullptr)); } From 0ee67083310f1aa7593bc97e1b8a0fe8ce3cf3e6 Mon Sep 17 00:00:00 2001 From: Robert Ancell Date: Thu, 25 Jun 2020 12:21:18 +1200 Subject: [PATCH 2/7] Check generated Linux template has correct application ID --- packages/flutter_tools/lib/src/project.dart | 7 +++++++ .../test/commands.shard/permeable/create_test.dart | 11 ++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/packages/flutter_tools/lib/src/project.dart b/packages/flutter_tools/lib/src/project.dart index 2672d62bb2f1c..7eaf6d7630fdb 100644 --- a/packages/flutter_tools/lib/src/project.dart +++ b/packages/flutter_tools/lib/src/project.dart @@ -1046,6 +1046,8 @@ class LinuxProject extends FlutterProjectPlatform { @override String get pluginConfigKey => LinuxPlugin.kConfigKey; + static final RegExp _applicationIdPattern = RegExp('^\\s*"application-id"\\s*,\\s*[\'"](.*)[\'"]\\s*,\\s*\$'); + Directory get _editableDirectory => project.directory.childDirectory('linux'); /// The directory in the project that is managed by Flutter. As much as @@ -1075,6 +1077,11 @@ class LinuxProject extends FlutterProjectPlatform { Directory get pluginSymlinkDirectory => ephemeralDirectory.childDirectory('.plugin_symlinks'); Future ensureReadyForPlatformSpecificTooling() async {} + + String get applicationId { + final File sourceFile = _editableDirectory.childFile('my_application.cc'); + return _firstMatchInFile(sourceFile, _applicationIdPattern)?.group(1); + } } /// The Fuchsia sub project diff --git a/packages/flutter_tools/test/commands.shard/permeable/create_test.dart b/packages/flutter_tools/test/commands.shard/permeable/create_test.dart index 779fa65989f40..0248dd8429a37 100644 --- a/packages/flutter_tools/test/commands.shard/permeable/create_test.dart +++ b/packages/flutter_tools/test/commands.shard/permeable/create_test.dart @@ -993,7 +993,7 @@ void main() { Platform: _kNoColorTerminalPlatform, }); - testUsingContext('has correct application id for android and bundle id for ios', () async { + testUsingContext('has correct application id for android, bundle id for ios and application id for Linux', () async { Cache.flutterRoot = '../..'; when(mockFlutterVersion.frameworkRevision).thenReturn(frameworkRevision); when(mockFlutterVersion.channel).thenReturn(frameworkChannel); @@ -1024,6 +1024,10 @@ void main() { project.android.applicationId, 'com.example.hello_flutter', ); + expect( + project.linux.applicationId, + 'com.example.hello_flutter', + ); tmpProjectDir = globals.fs.path.join(tempDir.path, 'test_abc'); await runner.run(['create', '--template=app', '--no-pub', '--org', 'abc^*.1#@', tmpProjectDir]); @@ -1048,9 +1052,14 @@ void main() { project.android.applicationId, 'flutter_project.untitled', ); + expect( + project.linux.applicationId, + 'flutter_project.untitled', + ); }, overrides: { FlutterVersion: () => mockFlutterVersion, Platform: _kNoColorTerminalPlatform, + FeatureFlags: () => TestFeatureFlags(isLinuxEnabled: true), }); testUsingContext('can re-gen default template over existing project', () async { From 82ff7ca41d20075c71487963f0b044183593b922 Mon Sep 17 00:00:00 2001 From: Robert Ancell Date: Fri, 10 Jul 2020 15:59:29 +1200 Subject: [PATCH 3/7] Use a raw string for regexp --- packages/flutter_tools/lib/src/project.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/flutter_tools/lib/src/project.dart b/packages/flutter_tools/lib/src/project.dart index 2da964fb51f98..cea5de4f189e8 100644 --- a/packages/flutter_tools/lib/src/project.dart +++ b/packages/flutter_tools/lib/src/project.dart @@ -1059,7 +1059,7 @@ class LinuxProject extends FlutterProjectPlatform implements CmakeBasedProject { @override String get pluginConfigKey => LinuxPlugin.kConfigKey; - static final RegExp _applicationIdPattern = RegExp('^\\s*"application-id"\\s*,\\s*[\'"](.*)[\'"]\\s*,\\s*\$'); + static final RegExp _applicationIdPattern = RegExp(r'''^\s*"application-id"\s*,\s*['"](.*)['"]\s*,\s*$'''); Directory get _editableDirectory => parent.directory.childDirectory('linux'); From 075dc9b0abaeb78edb414ef69fdafcdd8d775617 Mon Sep 17 00:00:00 2001 From: Robert Ancell Date: Fri, 10 Jul 2020 16:18:16 +1200 Subject: [PATCH 4/7] Make app-id matching work if formatted differently --- packages/flutter_tools/lib/src/project.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/flutter_tools/lib/src/project.dart b/packages/flutter_tools/lib/src/project.dart index cea5de4f189e8..ba9f46f8f0beb 100644 --- a/packages/flutter_tools/lib/src/project.dart +++ b/packages/flutter_tools/lib/src/project.dart @@ -1059,7 +1059,7 @@ class LinuxProject extends FlutterProjectPlatform implements CmakeBasedProject { @override String get pluginConfigKey => LinuxPlugin.kConfigKey; - static final RegExp _applicationIdPattern = RegExp(r'''^\s*"application-id"\s*,\s*['"](.*)['"]\s*,\s*$'''); + static final RegExp _applicationIdPattern = RegExp(r'"application-id"\s*,\s*"(.*)"\s*'); Directory get _editableDirectory => parent.directory.childDirectory('linux'); From 65f38cd35b30ba33eb68dca81aba446ee1a25716 Mon Sep 17 00:00:00 2001 From: Robert Ancell Date: Mon, 20 Jul 2020 15:17:23 +1200 Subject: [PATCH 5/7] Move application ID int the CMakeLists.txt --- packages/flutter_tools/lib/src/project.dart | 4 ++-- .../templates/app/linux.tmpl/CMakeLists.txt.tmpl | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/flutter_tools/lib/src/project.dart b/packages/flutter_tools/lib/src/project.dart index ba9f46f8f0beb..a3011d060d09d 100644 --- a/packages/flutter_tools/lib/src/project.dart +++ b/packages/flutter_tools/lib/src/project.dart @@ -1059,7 +1059,7 @@ class LinuxProject extends FlutterProjectPlatform implements CmakeBasedProject { @override String get pluginConfigKey => LinuxPlugin.kConfigKey; - static final RegExp _applicationIdPattern = RegExp(r'"application-id"\s*,\s*"(.*)"\s*'); + static final RegExp _applicationIdPattern = RegExp(r'''^\s*set\s*(\s*APPLICATION_ID\s*"(.*)"\s*)\s*$'''); Directory get _editableDirectory => parent.directory.childDirectory('linux'); @@ -1091,7 +1091,7 @@ class LinuxProject extends FlutterProjectPlatform implements CmakeBasedProject { Future ensureReadyForPlatformSpecificTooling() async {} String get applicationId { - final File sourceFile = _editableDirectory.childFile('my_application.cc'); + final File sourceFile = _editableDirectory.childFile('CMakeLists.txt'); return _firstMatchInFile(sourceFile, _applicationIdPattern)?.group(1); } } diff --git a/packages/flutter_tools/templates/app/linux.tmpl/CMakeLists.txt.tmpl b/packages/flutter_tools/templates/app/linux.tmpl/CMakeLists.txt.tmpl index a1f3142d3ecc4..11044ab454d6a 100644 --- a/packages/flutter_tools/templates/app/linux.tmpl/CMakeLists.txt.tmpl +++ b/packages/flutter_tools/templates/app/linux.tmpl/CMakeLists.txt.tmpl @@ -2,6 +2,7 @@ cmake_minimum_required(VERSION 3.10) project(runner LANGUAGES CXX) set(BINARY_NAME "{{projectName}}") +set(APPLICATION_ID "{{linuxIdentifier}}") cmake_policy(SET CMP0063 NEW) From d6d4dc0b53df248744e82808661597289fd023f0 Mon Sep 17 00:00:00 2001 From: Robert Ancell Date: Tue, 21 Jul 2020 12:01:13 +1200 Subject: [PATCH 6/7] Fix regexp parenthesis escaping --- packages/flutter_tools/lib/src/project.dart | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/flutter_tools/lib/src/project.dart b/packages/flutter_tools/lib/src/project.dart index a3011d060d09d..3c1215cb386e3 100644 --- a/packages/flutter_tools/lib/src/project.dart +++ b/packages/flutter_tools/lib/src/project.dart @@ -1059,7 +1059,7 @@ class LinuxProject extends FlutterProjectPlatform implements CmakeBasedProject { @override String get pluginConfigKey => LinuxPlugin.kConfigKey; - static final RegExp _applicationIdPattern = RegExp(r'''^\s*set\s*(\s*APPLICATION_ID\s*"(.*)"\s*)\s*$'''); + static final RegExp _applicationIdPattern = RegExp(r'''^\s*set\s*\(\s*APPLICATION_ID\s*"(.*)"\s*\)\s*$'''); Directory get _editableDirectory => parent.directory.childDirectory('linux'); @@ -1091,8 +1091,7 @@ class LinuxProject extends FlutterProjectPlatform implements CmakeBasedProject { Future ensureReadyForPlatformSpecificTooling() async {} String get applicationId { - final File sourceFile = _editableDirectory.childFile('CMakeLists.txt'); - return _firstMatchInFile(sourceFile, _applicationIdPattern)?.group(1); + return _firstMatchInFile(cmakeFile, _applicationIdPattern)?.group(1); } } From d91d2c5a0abbbae9603dc3535c691da5c6d5cbcd Mon Sep 17 00:00:00 2001 From: Robert Ancell Date: Tue, 28 Jul 2020 09:50:11 +1200 Subject: [PATCH 7/7] Use a define for the application ID --- .../flutter_tools/templates/app/linux.tmpl/CMakeLists.txt.tmpl | 2 ++ .../templates/app/linux.tmpl/my_application.cc.tmpl | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/flutter_tools/templates/app/linux.tmpl/CMakeLists.txt.tmpl b/packages/flutter_tools/templates/app/linux.tmpl/CMakeLists.txt.tmpl index 11044ab454d6a..7f785aa36a5e5 100644 --- a/packages/flutter_tools/templates/app/linux.tmpl/CMakeLists.txt.tmpl +++ b/packages/flutter_tools/templates/app/linux.tmpl/CMakeLists.txt.tmpl @@ -33,6 +33,8 @@ add_subdirectory(${FLUTTER_MANAGED_DIR}) find_package(PkgConfig REQUIRED) pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) +add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") + # Application build add_executable(${BINARY_NAME} "main.cc" diff --git a/packages/flutter_tools/templates/app/linux.tmpl/my_application.cc.tmpl b/packages/flutter_tools/templates/app/linux.tmpl/my_application.cc.tmpl index 0cc1811974125..5097955718e3d 100644 --- a/packages/flutter_tools/templates/app/linux.tmpl/my_application.cc.tmpl +++ b/packages/flutter_tools/templates/app/linux.tmpl/my_application.cc.tmpl @@ -41,6 +41,6 @@ static void my_application_init(MyApplication* self) {} MyApplication* my_application_new() { return MY_APPLICATION(g_object_new(my_application_get_type(), - "application-id", "{{linuxIdentifier}}", + "application-id", APPLICATION_ID, nullptr)); }