Skip to content

Commit d47b635

Browse files
authored
[permission_handler] Refactor the C++ code (#379)
* [permission_handler] Refactor the C++ code * Update the device limitations section in README
1 parent 22be924 commit d47b635

File tree

10 files changed

+298
-551
lines changed

10 files changed

+298
-551
lines changed

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,10 @@ The _"non-endorsed"_ status means that the plugin is not endorsed by the origina
6060
| [**image_picker_tizen**](packages/image_picker) | ⚠️ |||| No camera<br>No file manager app |
6161
| [**integration_test_tizen**](packages/integration_test) | ✔️ | ✔️ | ✔️ | ✔️ |
6262
| [**messageport_tizen**](packages/messageport) | ✔️ | ✔️ | ✔️ | ✔️ |
63-
| [**network_info_plus_tizen**](packages/network_info_plus) | ✔️ || ✔️ || API unsupported by emulators |
63+
| [**network_info_plus_tizen**](packages/network_info_plus) | ✔️ || ✔️ || API not supported on emulator |
6464
| [**package_info_plus_tizen**](packages/package_info_plus) | ✔️ | ✔️ | ✔️ | ✔️ |
65-
| [**path_provider_tizen**](packages/path_provider) | | | | ⚠️ | No external storage |
66-
| [**permission_handler_tizen**](packages/permission_handler) | ✔️ | ✔️ | | | Not applicable for TV |
65+
| [**path_provider_tizen**](packages/path_provider) | | | | ✔️ |
66+
| [**permission_handler_tizen**](packages/permission_handler) | ✔️ | ✔️ | ⚠️ | ⚠️ | Not applicable for TV |
6767
| [**sensors_plus_tizen**](packages/sensors_plus) | ✔️ | ✔️ ||| No sensor hardware |
6868
| [**share_plus_tizen**](packages/share_plus) | ⚠️ | ⚠️ ||| No SMS or e-mail app |
6969
| [**shared_preferences_tizen**](packages/shared_preferences) | ✔️ | ✔️ | ✔️ | ✔️ |

packages/permission_handler/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## NEXT
2+
3+
* Code refactoring.
4+
15
## 1.2.0
26

37
* Update permission_handler to 8.3.0.
Lines changed: 62 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -1,126 +1,86 @@
1+
// Copyright 2021 Samsung Electronics Co., Ltd. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
15
#include "app_settings_manager.h"
26

37
#include <app_common.h>
48
#include <app_control.h>
59
#include <package_manager.h>
610

11+
#include <string>
12+
713
#include "log.h"
814

915
namespace {
10-
constexpr char kPackageID[] = "pkgId";
11-
constexpr char kSettingAppID[] = "com.samsung.clocksetting.apps";
12-
13-
class AppPermissions {
14-
public:
15-
AppPermissions() { Init(); }
16-
17-
~AppPermissions() { Deinit(); }
18-
19-
bool Launch(const std::string& package_name) {
20-
if (package_name.length() == 0) {
21-
return false;
22-
}
23-
24-
int ret = app_control_add_extra_data(app_control_, kPackageID,
25-
package_name.c_str());
26-
if (ret != APP_CONTROL_ERROR_NONE) {
27-
LOG_ERROR("Failed to add key[%s]:value[%s]", kPackageID,
28-
package_name.c_str());
29-
return false;
30-
}
31-
32-
ret = app_control_send_launch_request(app_control_, nullptr, nullptr);
33-
if (ret != APP_CONTROL_ERROR_NONE) {
34-
LOG_ERROR("Failed to send launch request setting");
35-
return false;
36-
}
37-
return true;
16+
17+
constexpr char kSettingAppId[] = "com.samsung.clocksetting.apps";
18+
19+
std::string GetPackageName() {
20+
char* app_id;
21+
int ret = app_get_id(&app_id);
22+
if (ret != APP_ERROR_NONE) {
23+
LOG_ERROR("The app ID is not found.");
24+
return "";
3825
}
3926

40-
private:
41-
void Init() {
42-
int ret = app_control_create(&app_control_);
43-
if (ret != APP_CONTROL_ERROR_NONE) {
44-
LOG_ERROR("Failed to create app control handle");
45-
}
46-
47-
ret = app_control_set_app_id(app_control_, kSettingAppID);
48-
if (ret != APP_CONTROL_ERROR_NONE) {
49-
LOG_ERROR("Failed to set app id[%s]", kSettingAppID);
50-
}
27+
package_info_h package_info;
28+
ret = package_info_create(app_id, &package_info);
29+
free(app_id);
30+
if (ret != PACKAGE_MANAGER_ERROR_NONE) {
31+
LOG_ERROR("Failed to create a package info handle.");
32+
return "";
5133
}
5234

53-
void Deinit() {
54-
if (app_control_) {
55-
app_control_destroy(app_control_);
56-
app_control_ = nullptr;
57-
}
35+
char* package_name;
36+
ret = package_info_get_package(package_info, &package_name);
37+
package_info_destroy(package_info);
38+
if (ret != PACKAGE_MANAGER_ERROR_NONE) {
39+
LOG_ERROR("Failed to get the package name.");
40+
return "";
5841
}
5942

60-
app_control_h app_control_{nullptr};
61-
};
62-
63-
class PackageName {
64-
public:
65-
PackageName() { Init(); }
66-
67-
~PackageName() { Deinit(); }
68-
69-
char* Get() { return package_name_; }
70-
71-
private:
72-
void Init() {
73-
int ret = app_get_id(&app_id_);
74-
if (ret != APP_ERROR_NONE || app_id_ == nullptr) {
75-
LOG_ERROR("Failed to get app id");
76-
return;
77-
}
78-
79-
ret = package_info_create(app_id_, &package_info_);
80-
if (ret != PACKAGE_MANAGER_ERROR_NONE || package_info_ == nullptr) {
81-
LOG_ERROR("Failed to create package info handle");
82-
}
83-
ret = package_info_get_package(package_info_, &package_name_);
84-
if (ret != PACKAGE_MANAGER_ERROR_NONE || package_name_ == nullptr) {
85-
LOG_ERROR("Failed to get package name");
86-
}
43+
std::string result = std::string(package_name);
44+
free(package_name);
45+
46+
return result;
47+
}
48+
49+
} // namespace
50+
51+
bool AppSettingsManager::OpenAppSettings() {
52+
std::string package_name = GetPackageName();
53+
if (package_name.empty()) {
54+
return false;
8755
}
8856

89-
void Deinit() {
90-
if (app_id_) {
91-
free(app_id_);
92-
app_id_ = nullptr;
93-
}
94-
95-
if (package_info_) {
96-
package_info_destroy(package_info_);
97-
package_info_ = nullptr;
98-
}
99-
100-
if (package_name_) {
101-
free(package_name_);
102-
package_name_ = nullptr;
103-
}
57+
app_control_h app_control;
58+
int ret = app_control_create(&app_control);
59+
if (ret != APP_CONTROL_ERROR_NONE) {
60+
LOG_ERROR("Failed to create an app control handle.");
61+
return false;
10462
}
10563

106-
char* app_id_{nullptr};
107-
package_info_h package_info_{nullptr};
108-
char* package_name_{nullptr};
109-
};
110-
} // namespace
64+
ret = app_control_set_app_id(app_control, kSettingAppId);
65+
if (ret != APP_CONTROL_ERROR_NONE) {
66+
LOG_ERROR("Failed to set an app ID.");
67+
app_control_destroy(app_control);
68+
return false;
69+
}
11170

112-
AppSettingsManager::AppSettingsManager() {
113-
app_permissions_ = std::make_unique<AppPermissions>();
114-
PackageName pkg_name;
115-
char* name = pkg_name.Get();
116-
if (name == nullptr) {
117-
return;
71+
ret = app_control_add_extra_data(app_control, "pkgId", package_name.c_str());
72+
if (ret != APP_CONTROL_ERROR_NONE) {
73+
LOG_ERROR("Failed to add extra data.");
74+
app_control_destroy(app_control);
75+
return false;
11876
}
119-
package_name_ = std::string(name);
120-
}
12177

122-
AppSettingsManager::~AppSettingsManager() {}
78+
ret = app_control_send_launch_request(app_control, nullptr, nullptr);
79+
app_control_destroy(app_control);
80+
if (ret != APP_CONTROL_ERROR_NONE) {
81+
LOG_ERROR("Failed to send a launch request.");
82+
return false;
83+
}
12384

124-
bool AppSettingsManager::OpenAppSettings() {
125-
return app_permissions_->Launch(package_name_);
85+
return true;
12686
}
Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,16 @@
1-
#ifndef APP_SETTINGS_MANAGER_H_
2-
#define APP_SETTINGS_MANAGER_H_
1+
// Copyright 2021 Samsung Electronics Co., Ltd. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
34

4-
#include <functional>
5-
#include <memory>
6-
#include <string>
7-
8-
namespace {
9-
class AppPermissions;
10-
}
5+
#ifndef FLUTTER_PLUGIN_APP_SETTINGS_MANAGER_H_
6+
#define FLUTTER_PLUGIN_APP_SETTINGS_MANAGER_H_
117

128
class AppSettingsManager {
139
public:
14-
AppSettingsManager();
15-
~AppSettingsManager();
10+
AppSettingsManager() {}
11+
~AppSettingsManager() {}
1612

1713
bool OpenAppSettings();
18-
19-
private:
20-
std::unique_ptr<AppPermissions> app_permissions_;
21-
std::string package_name_;
2214
};
2315

24-
#endif // APP_SETTINGS_MANAGER_H_
16+
#endif // FLUTTER_PLUGIN_APP_SETTINGS_MANAGER_H_

0 commit comments

Comments
 (0)