Skip to content

Commit 9340e9a

Browse files
authored
[tizen_package_manager] Add threading to prevent app freezing (#520)
1 parent d5b0a74 commit 9340e9a

File tree

5 files changed

+53
-22
lines changed

5 files changed

+53
-22
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.2.1
2+
3+
* Add threading to `PackageManager.getPackagesInfo` to prevent app freezing.
4+
15
## 0.2.0
26

37
* Rename `package_manager.dart` to `tizen_package_manager.dart`.

packages/tizen_package_manager/README.md

Lines changed: 1 addition & 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.2.0
13+
tizen_package_manager: ^0.2.1
1414
```
1515
1616
### Retrieving specific package info

packages/tizen_package_manager/example/lib/main.dart

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,14 @@ class _MyHomePageState extends State<MyHomePage> {
4444
child: Scaffold(
4545
appBar: AppBar(
4646
title: const Text('Package Manager Demo'),
47-
bottom: const TabBar(tabs: <Tab>[
48-
Tab(text: 'This package'),
49-
Tab(text: 'Package list'),
50-
Tab(text: 'Package events'),
51-
]),
47+
bottom: const TabBar(
48+
isScrollable: true,
49+
tabs: <Tab>[
50+
Tab(text: 'This package'),
51+
Tab(text: 'Package list'),
52+
Tab(text: 'Package events'),
53+
],
54+
),
5255
),
5356
body: const TabBarView(
5457
children: <Widget>[
@@ -110,9 +113,15 @@ class _PackageListScreen extends StatefulWidget {
110113
State<_PackageListScreen> createState() => _PackageListScreenState();
111114
}
112115

113-
class _PackageListScreenState extends State<_PackageListScreen> {
116+
class _PackageListScreenState extends State<_PackageListScreen>
117+
with AutomaticKeepAliveClientMixin {
118+
@override
119+
bool get wantKeepAlive => true;
120+
114121
@override
115122
Widget build(BuildContext context) {
123+
super.build(context);
124+
116125
return FutureBuilder<List<PackageInfo>>(
117126
future: PackageManager.getPackagesInfo(),
118127
builder:

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 for getting installed package info.
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.2.0
5+
version: 0.2.1
66

77
environment:
88
sdk: ">=2.15.1 <3.0.0"

packages/tizen_package_manager/tizen/src/tizen_package_manager_plugin.cc

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
#include "tizen_package_manager_plugin.h"
66

7+
#include <Ecore.h>
78
#include <flutter/encodable_value.h>
89
#include <flutter/event_channel.h>
910
#include <flutter/event_sink.h>
@@ -218,20 +219,37 @@ class TizenPackageManagerPlugin : public flutter::Plugin {
218219
}
219220

220221
void GetAllPackagesInfo(std::unique_ptr<FlMethodResult> result) {
221-
TizenPackageManager &package_manager = TizenPackageManager::GetInstance();
222-
std::optional<std::vector<PackageInfo>> packages =
223-
package_manager.GetAllPackagesInfo();
224-
if (!packages.has_value()) {
225-
result->Error(std::to_string(package_manager.GetLastError()),
226-
package_manager.GetLastErrorString());
227-
return;
228-
}
229-
230-
flutter::EncodableList list;
231-
for (const PackageInfo &package : packages.value()) {
232-
list.push_back(flutter::EncodableValue(PackageInfoToMap(package)));
233-
}
234-
result->Success(flutter::EncodableValue(list));
222+
// TizenPackageManager::GetAllPackagesInfo() is an expensive operation and
223+
// might cause unresponsiveness on low-end devices if run on the platform
224+
// thread.
225+
ecore_thread_run(
226+
[](void *data, Ecore_Thread *thread) {
227+
auto *result = static_cast<FlMethodResult *>(data);
228+
229+
TizenPackageManager &package_manager =
230+
TizenPackageManager::GetInstance();
231+
std::optional<std::vector<PackageInfo>> packages =
232+
package_manager.GetAllPackagesInfo();
233+
if (packages.has_value()) {
234+
flutter::EncodableList list;
235+
for (const PackageInfo &package : packages.value()) {
236+
list.push_back(
237+
flutter::EncodableValue(PackageInfoToMap(package)));
238+
}
239+
result->Success(flutter::EncodableValue(list));
240+
} else {
241+
result->Error(std::to_string(package_manager.GetLastError()),
242+
package_manager.GetLastErrorString());
243+
}
244+
delete result;
245+
},
246+
nullptr,
247+
[](void *data, Ecore_Thread *thread) {
248+
auto *result = static_cast<FlMethodResult *>(data);
249+
result->Error("Operation failed", "Failed to start a thread.");
250+
delete result;
251+
},
252+
result.release());
235253
}
236254

237255
void Install(const flutter::EncodableMap *arguments,

0 commit comments

Comments
 (0)