Skip to content

Commit 1170396

Browse files
robert-ancellEgor
authored and
Egor
committed
[path_provider] Use the application ID in the application support path (flutter#2845)
1 parent 8d81dd9 commit 1170396

File tree

3 files changed

+51
-4
lines changed

3 files changed

+51
-4
lines changed

packages/path_provider/path_provider_linux/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 0.1.0
2+
* This release updates getApplicationSupportPath to use the application ID instead of the executable name.
3+
* No migration is provided, so any older apps that were using this path will now have a different directory.
4+
15
## 0.0.1+2
26
* This release updates the example to depend on the endorsed plugin rather than relative path
37

packages/path_provider/path_provider_linux/lib/path_provider_linux.dart

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,21 @@
33
// found in the LICENSE file.
44
import 'dart:io';
55
import 'dart:async';
6+
import 'dart:ffi';
7+
import 'package:ffi/ffi.dart';
68

79
import 'package:xdg_directories/xdg_directories.dart' as xdg;
810
import 'package:path/path.dart' as path;
911
import 'package:path_provider_platform_interface/path_provider_platform_interface.dart';
1012

13+
// GApplication* g_application_get_default();
14+
typedef g_application_get_default_c = IntPtr Function();
15+
typedef g_application_get_default_dart = int Function();
16+
17+
// const gchar* g_application_get_application_id(GApplication* application);
18+
typedef g_application_get_application_id_c = Pointer<Utf8> Function(IntPtr);
19+
typedef g_application_get_application_id_dart = Pointer<Utf8> Function(int);
20+
1121
/// The linux implementation of [PathProviderPlatform]
1222
///
1323
/// This class implements the `package:path_provider` functionality for linux
@@ -22,11 +32,43 @@ class PathProviderLinux extends PathProviderPlatform {
2232
return Future.value("/tmp");
2333
}
2434

35+
// Gets the application ID set in GApplication.
36+
String _getApplicationId() {
37+
DynamicLibrary gio;
38+
try {
39+
gio = DynamicLibrary.open('libgio-2.0.so');
40+
} on ArgumentError {
41+
return null;
42+
}
43+
var g_application_get_default = gio.lookupFunction<
44+
g_application_get_default_c,
45+
g_application_get_default_dart>('g_application_get_default');
46+
var app = g_application_get_default();
47+
if (app == 0) return null;
48+
49+
var g_application_get_application_id = gio.lookupFunction<
50+
g_application_get_application_id_c,
51+
g_application_get_application_id_dart>(
52+
'g_application_get_application_id');
53+
var app_id = g_application_get_application_id(app);
54+
if (app_id == null) return null;
55+
56+
return Utf8.fromUtf8(app_id);
57+
}
58+
59+
// Gets the unique ID for this application.
60+
Future<String> _getId() async {
61+
var appId = _getApplicationId();
62+
if (appId != null) return appId;
63+
64+
// Fall back to using the executable name.
65+
return path.basenameWithoutExtension(
66+
await File('/proc/self/exe').resolveSymbolicLinks());
67+
}
68+
2569
@override
2670
Future<String> getApplicationSupportPath() async {
27-
final processName = path.basenameWithoutExtension(
28-
await File('/proc/self/exe').resolveSymbolicLinks());
29-
final directory = Directory(path.join(xdg.dataHome.path, processName));
71+
final directory = Directory(path.join(xdg.dataHome.path, await _getId()));
3072
// Creating the directory if it doesn't exist, because mobile implementations assume the directory exists
3173
if (!await directory.exists()) {
3274
await directory.create(recursive: true);

packages/path_provider/path_provider_linux/pubspec.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: path_provider_linux
22
description: linux implementation of the path_provider plugin
3-
version: 0.0.1+2
3+
version: 0.1.0
44
homepage: https://github.com/flutter/plugins/tree/master/packages/path_provider/path_provider_linux
55

66
flutter:
@@ -15,6 +15,7 @@ environment:
1515
flutter: ">=1.10.0 <2.0.0"
1616

1717
dependencies:
18+
ffi: ^0.1.3
1819
path: ^1.6.4
1920
xdg_directories: ^0.1.0
2021
path_provider_platform_interface: ^1.0.1

0 commit comments

Comments
 (0)