Skip to content

Commit 63fa911

Browse files
committed
Merge remote-tracking branch 'upstream/master' into video_player_avplay_upgrade
2 parents 97917e3 + e7ed055 commit 63fa911

File tree

9 files changed

+272
-23
lines changed

9 files changed

+272
-23
lines changed

packages/tizen_package_manager/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 0.4.0
2+
3+
* Add retrieve package size information using `PackageManager.getPackageSizeInfo`.
4+
15
## 0.3.0
26

37
* Update minimum Flutter and Dart version to 3.13 and 3.1.

packages/tizen_package_manager/README.md

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ To use this package, add `tizen_package_manager` as a dependency in your `pubspe
1010

1111
```yaml
1212
dependencies:
13-
tizen_package_manager: ^0.3.0
13+
tizen_package_manager: ^0.4.0
1414
```
1515
1616
### Retrieving specific package info
@@ -22,6 +22,15 @@ String packageId = 'org.tizen.settings';
2222
PackageInfo package = await PackageManager.getPackageInfo(packageId);
2323
```
2424

25+
### Retrieving specific package size info
26+
27+
To retrieve size information of a specific package, use `PackageManager.getPackageSizeInfo` which returns an instance of `PackageSizeInfo`.
28+
29+
```dart
30+
String packageId = 'org.tizen.settings';
31+
PackageSizeInfo sizeInfo = await PackageManager.getPackageSizeInfo(packageId);
32+
```
33+
2534
### Retrieving all packages' info
2635

2736
To retrieve information of all packages installed on a Tizen device, use `PackageManager.getPackagesInfo`.

packages/tizen_package_manager/example/integration_test/tizen_package_manager_test.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,13 @@ void main() {
2424
expect(info.isRemovable, true);
2525
});
2626

27+
testWidgets('Can get current package size info', (WidgetTester tester) async {
28+
final PackageSizeInfo info = await PackageManager.getPackageSizeInfo(
29+
currentPackageId,
30+
);
31+
expect(info.appSize, greaterThan(0)); // package size -> 160935936
32+
});
33+
2734
testWidgets('Can get all installed packages info', (
2835
WidgetTester tester,
2936
) async {

packages/tizen_package_manager/example/lib/main.dart

Lines changed: 78 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,15 @@ class _CurrentPackageScreenState extends State<_CurrentPackageScreen> {
7979

8080
@override
8181
Widget build(BuildContext context) {
82-
return FutureBuilder<PackageInfo>(
83-
future: PackageManager.getPackageInfo(currentPackageId),
84-
builder: (BuildContext context, AsyncSnapshot<PackageInfo> snapshot) {
82+
return FutureBuilder<List<dynamic>>(
83+
future: Future.wait(<Future<dynamic>>[
84+
PackageManager.getPackageInfo(currentPackageId),
85+
PackageManager.getPackageSizeInfo(currentPackageId),
86+
]),
87+
builder: (BuildContext context, AsyncSnapshot<List<dynamic>> snapshot) {
8588
if (snapshot.hasData) {
86-
final PackageInfo packageInfo = snapshot.data!;
89+
final PackageInfo packageInfo = snapshot.data![0] as PackageInfo;
90+
final PackageSizeInfo sizeInfo = snapshot.data![1] as PackageSizeInfo;
8791
return ListView(
8892
children: <Widget>[
8993
_infoTile('Package ID', packageInfo.packageId),
@@ -94,6 +98,20 @@ class _CurrentPackageScreenState extends State<_CurrentPackageScreen> {
9498
_infoTile('System app', packageInfo.isSystem.toString()),
9599
_infoTile('Preloaded app', packageInfo.isPreloaded.toString()),
96100
_infoTile('Removable', packageInfo.isRemovable.toString()),
101+
const Divider(),
102+
const ListTile(
103+
title: Text('Package Size Information',
104+
style: TextStyle(fontWeight: FontWeight.bold)),
105+
),
106+
_infoTile('Data Size', '${sizeInfo.dataSize} bytes'),
107+
_infoTile('Cache Size', '${sizeInfo.cacheSize} bytes'),
108+
_infoTile('App Size', '${sizeInfo.appSize} bytes'),
109+
_infoTile(
110+
'External Data Size', '${sizeInfo.externalDataSize} bytes'),
111+
_infoTile(
112+
'External Cache Size', '${sizeInfo.externalCacheSize} bytes'),
113+
_infoTile(
114+
'External App Size', '${sizeInfo.externalAppSize} bytes'),
97115
],
98116
);
99117
} else if (snapshot.hasError) {
@@ -118,6 +136,25 @@ class _PackageListScreenState extends State<_PackageListScreen>
118136
@override
119137
bool get wantKeepAlive => true;
120138

139+
Future<Map<String, PackageSizeInfo>> _getAllPackagesSizeInfo(
140+
List<PackageInfo> packages) async {
141+
final Map<String, PackageSizeInfo> sizeInfoMap =
142+
<String, PackageSizeInfo>{};
143+
144+
for (final PackageInfo package in packages) {
145+
try {
146+
final PackageSizeInfo sizeInfo =
147+
await PackageManager.getPackageSizeInfo(package.packageId);
148+
sizeInfoMap[package.packageId] = sizeInfo;
149+
} catch (e) {
150+
debugPrint(
151+
'Failed to get size info for package ${package.packageId}: $e');
152+
}
153+
}
154+
155+
return sizeInfoMap;
156+
}
157+
121158
@override
122159
Widget build(BuildContext context) {
123160
super.build(context);
@@ -130,23 +167,43 @@ class _PackageListScreenState extends State<_PackageListScreen>
130167
) {
131168
if (snapshot.hasData) {
132169
final List<PackageInfo> packages = snapshot.data!;
133-
return ListView.builder(
134-
itemCount: packages.length,
135-
itemBuilder: (BuildContext context, int index) {
136-
final PackageInfo package = packages[index];
137-
return ListTile(
138-
title: Text(package.label),
139-
subtitle: Padding(
140-
padding: const EdgeInsets.symmetric(vertical: 5),
141-
child: Text(
142-
'Package ID: ${package.packageId}\n'
143-
'Version: ${package.version}\n'
144-
'Type: ${package.packageType.name}\n'
145-
'System: ${package.isSystem}',
146-
),
147-
),
148-
isThreeLine: true,
149-
);
170+
return FutureBuilder<Map<String, PackageSizeInfo>>(
171+
future: _getAllPackagesSizeInfo(packages),
172+
builder: (
173+
BuildContext context,
174+
AsyncSnapshot<Map<String, PackageSizeInfo>> sizeSnapshot,
175+
) {
176+
if (sizeSnapshot.hasData) {
177+
final Map<String, PackageSizeInfo> sizeInfoMap =
178+
sizeSnapshot.data!;
179+
return ListView.builder(
180+
itemCount: packages.length,
181+
itemBuilder: (BuildContext context, int index) {
182+
final PackageInfo package = packages[index];
183+
final PackageSizeInfo? sizeInfo =
184+
sizeInfoMap[package.packageId];
185+
186+
return ListTile(
187+
title: Text(package.label),
188+
subtitle: Padding(
189+
padding: const EdgeInsets.symmetric(vertical: 5),
190+
child: Text(
191+
'Package ID: ${package.packageId}\n'
192+
'Version: ${package.version}\n'
193+
'Type: ${package.packageType.name}\n'
194+
'System: ${package.isSystem}'
195+
'${sizeInfo != null ? '\nApp Size: ${sizeInfo.appSize} bytes' : ''}',
196+
),
197+
),
198+
isThreeLine: sizeInfo != null,
199+
);
200+
},
201+
);
202+
} else if (sizeSnapshot.hasError) {
203+
return Center(child: Text(sizeSnapshot.error.toString()));
204+
} else {
205+
return const Center(child: CircularProgressIndicator());
206+
}
150207
},
151208
);
152209
} else if (snapshot.hasError) {

packages/tizen_package_manager/lib/tizen_package_manager.dart

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,20 @@ class PackageManager {
115115
return list;
116116
}
117117

118+
/// Gets the package size information for the given package ID.
119+
static Future<PackageSizeInfo> getPackageSizeInfo(String packageId) async {
120+
if (packageId.isEmpty) {
121+
throw ArgumentError('Must not be empty', 'packageId');
122+
}
123+
124+
final Map<String, dynamic>? sizeInfo =
125+
await _channel.invokeMapMethod<String, dynamic>(
126+
'getPackageSizeInfo',
127+
<String, String>{'packageId': packageId},
128+
);
129+
return PackageSizeInfo.fromMap(sizeInfo!);
130+
}
131+
118132
/// Installs the package located at the given path.
119133
///
120134
/// The `http://tizen.org/privilege/packagemanager.admin` platform privilege
@@ -229,6 +243,49 @@ class PackageInfo {
229243
}
230244
}
231245

246+
/// Represents size information of specific package.
247+
class PackageSizeInfo {
248+
/// Creates an instance of [PackageInfo] with the given parameters.
249+
PackageSizeInfo({
250+
required this.dataSize,
251+
required this.cacheSize,
252+
required this.appSize,
253+
required this.externalDataSize,
254+
required this.externalCacheSize,
255+
required this.externalAppSize,
256+
});
257+
258+
/// The size of data.
259+
final int dataSize;
260+
261+
/// The size of cache.
262+
final int cacheSize;
263+
264+
/// The size of app.
265+
final int appSize;
266+
267+
/// The size of external data.
268+
final int externalDataSize;
269+
270+
/// The size of external cache.
271+
final int externalCacheSize;
272+
273+
/// The size of external app.
274+
final int externalAppSize;
275+
276+
/// Creates an instance of [PackageSizeInfo] from the [map].
277+
static PackageSizeInfo fromMap(Map<String, dynamic> map) {
278+
return PackageSizeInfo(
279+
dataSize: map['dataSize'] as int,
280+
cacheSize: map['cacheSize'] as int,
281+
appSize: map['appSize'] as int,
282+
externalDataSize: map['externalDataSize'] as int,
283+
externalCacheSize: map['externalCacheSize'] as int,
284+
externalAppSize: map['externalAppSize'] as int,
285+
);
286+
}
287+
}
288+
232289
/// Represents the event arguments of [PackageManager] events.
233290
class PackageEvent {
234291
/// Creates an instance of [PackageEvent] with the given parameters.

packages/tizen_package_manager/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: tizen_package_manager
22
description: Tizen package manager APIs. Used to get information about packages installed on a Tizen device.
33
homepage: https://github.com/flutter-tizen/plugins
44
repository: https://github.com/flutter-tizen/plugins/tree/master/packages/tizen_package_manager
5-
version: 0.3.0
5+
version: 0.4.0
66

77
environment:
88
sdk: ">=3.1.0 <4.0.0"

packages/tizen_package_manager/tizen/src/tizen_package_manager.cc

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ TizenPackageManager::TizenPackageManager() {
7070

7171
TizenPackageManager::~TizenPackageManager() {
7272
if (package_manager_) {
73+
package_size_callbacks_.clear();
7374
package_manager_unset_event_cb(package_manager_);
7475
package_manager_destroy(package_manager_);
7576
}
@@ -215,6 +216,58 @@ TizenPackageManager::GetAllPackagesInfo() {
215216
return packages_;
216217
}
217218

219+
void TizenPackageManager::GetPackageSizeInfo(
220+
const std::string &package_id, OnPackageSizeEvent on_package_size_result) {
221+
package_size_callbacks_[package_id] =
222+
std::make_unique<OnPackageSizeEvent>(on_package_size_result);
223+
224+
int ret = package_manager_get_package_size_info(
225+
package_id.c_str(),
226+
[](const char *package_id, const package_size_info_h size_info,
227+
void *user_data) {
228+
auto *self = static_cast<TizenPackageManager *>(user_data);
229+
PackageSizeInfo package_size_info;
230+
231+
if (size_info) {
232+
long long data_size = 0;
233+
long long cache_size = 0;
234+
long long app_size = 0;
235+
long long external_data_size = 0;
236+
long long external_cache_size = 0;
237+
long long external_app_size = 0;
238+
239+
package_size_info_get_data_size(size_info, &data_size);
240+
package_size_info_get_cache_size(size_info, &cache_size);
241+
package_size_info_get_app_size(size_info, &app_size);
242+
package_size_info_get_external_data_size(size_info,
243+
&external_data_size);
244+
package_size_info_get_external_cache_size(size_info,
245+
&external_cache_size);
246+
package_size_info_get_external_app_size(size_info,
247+
&external_app_size);
248+
249+
package_size_info.data_size = data_size;
250+
package_size_info.cache_size = cache_size;
251+
package_size_info.app_size = app_size;
252+
package_size_info.external_data_size = external_data_size;
253+
package_size_info.external_cache_size = external_cache_size;
254+
package_size_info.external_app_size = external_app_size;
255+
256+
(*self->package_size_callbacks_[package_id])(package_size_info);
257+
}
258+
},
259+
this);
260+
261+
if (ret != PACKAGE_MANAGER_ERROR_NONE) {
262+
LOG_ERROR("package_manager_get_package_size_info failed: %s",
263+
get_error_message(ret));
264+
last_error_ = ret;
265+
PackageSizeInfo package_size_info;
266+
package_size_info.app_size = 0;
267+
(*package_size_callbacks_[package_id])(package_size_info);
268+
}
269+
}
270+
218271
bool TizenPackageManager::Install(const std::string &package_path) {
219272
package_manager_request_h request = nullptr;
220273
int ret = package_manager_request_create(&request);

packages/tizen_package_manager/tizen/src/tizen_package_manager.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
#include <cstdint>
1212
#include <functional>
13+
#include <map>
1314
#include <memory>
1415
#include <optional>
1516
#include <string>
@@ -27,12 +28,23 @@ struct PackageInfo {
2728
bool is_removable = false;
2829
};
2930

31+
struct PackageSizeInfo {
32+
long long data_size = 0;
33+
long long cache_size = 0;
34+
long long app_size = 0;
35+
long long external_data_size = 0;
36+
long long external_cache_size = 0;
37+
long long external_app_size = 0;
38+
};
39+
3040
enum class PacakgeEventState { kStarted, kProcessing, kFailed, kCompleted };
3141

3242
using OnPackageEvent =
3343
std::function<void(std::string package_id, std::string package_type,
3444
PacakgeEventState state, int32_t progress)>;
3545

46+
using OnPackageSizeEvent = std::function<void(PackageSizeInfo size_info)>;
47+
3648
class TizenPackageManager {
3749
public:
3850
~TizenPackageManager();
@@ -49,6 +61,9 @@ class TizenPackageManager {
4961

5062
std::optional<PackageInfo> GetPackageInfo(const std::string& package_id);
5163

64+
void GetPackageSizeInfo(const std::string& package_id,
65+
OnPackageSizeEvent on_package_size_result);
66+
5267
std::optional<std::vector<PackageInfo>> GetAllPackagesInfo();
5368

5469
bool Install(const std::string& package_path);
@@ -80,6 +95,8 @@ class TizenPackageManager {
8095
OnPackageEvent install_callback_;
8196
OnPackageEvent uninstall_callback_;
8297
OnPackageEvent update_callback_;
98+
std::map<std::string, std::unique_ptr<OnPackageSizeEvent>>
99+
package_size_callbacks_;
83100
std::vector<PackageInfo> packages_;
84101

85102
int last_error_ = PACKAGE_MANAGER_ERROR_NONE;

0 commit comments

Comments
 (0)