Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,10 +60,10 @@ The _"non-endorsed"_ status means that the plugin is not endorsed by the origina
| [**image_picker_tizen**](packages/image_picker) | ⚠️ | ❌ | ❌ | ❌ | No camera<br>No file manager app |
| [**integration_test_tizen**](packages/integration_test) | ✔️ | ✔️ | ✔️ | ✔️ |
| [**messageport_tizen**](packages/messageport) | ✔️ | ✔️ | ✔️ | ✔️ |
| [**network_info_plus_tizen**](packages/network_info_plus) | ✔️ | ❌ | ✔️ | ❌ | API unsupported by emulators |
| [**network_info_plus_tizen**](packages/network_info_plus) | ✔️ | ❌ | ✔️ | ❌ | API not supported on emulator |
| [**package_info_plus_tizen**](packages/package_info_plus) | ✔️ | ✔️ | ✔️ | ✔️ |
| [**path_provider_tizen**](packages/path_provider) | ️ | ️ | ️ | ⚠️ | No external storage |
| [**permission_handler_tizen**](packages/permission_handler) | ✔️ | ✔️ | | | Not applicable for TV |
| [**path_provider_tizen**](packages/path_provider) | ️ | ️ | ️ | ✔️ |
| [**permission_handler_tizen**](packages/permission_handler) | ✔️ | ✔️ | ⚠️ | ⚠️ | Not applicable for TV |
| [**sensors_plus_tizen**](packages/sensors_plus) | ✔️ | ✔️ | ❌ | ❌ | No sensor hardware |
| [**share_plus_tizen**](packages/share_plus) | ⚠️ | ⚠️ | ❌ | ❌ | No SMS or e-mail app |
| [**shared_preferences_tizen**](packages/shared_preferences) | ✔️ | ✔️ | ✔️ | ✔️ |
Expand Down
4 changes: 4 additions & 0 deletions packages/permission_handler/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## NEXT

* Code refactoring.

## 1.2.0

* Update permission_handler to 8.3.0.
Expand Down
164 changes: 62 additions & 102 deletions packages/permission_handler/tizen/src/app_settings_manager.cc
Original file line number Diff line number Diff line change
@@ -1,126 +1,86 @@
// Copyright 2021 Samsung Electronics Co., Ltd. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "app_settings_manager.h"

#include <app_common.h>
#include <app_control.h>
#include <package_manager.h>

#include <string>

#include "log.h"

namespace {
constexpr char kPackageID[] = "pkgId";
constexpr char kSettingAppID[] = "com.samsung.clocksetting.apps";

class AppPermissions {
public:
AppPermissions() { Init(); }

~AppPermissions() { Deinit(); }

bool Launch(const std::string& package_name) {
if (package_name.length() == 0) {
return false;
}

int ret = app_control_add_extra_data(app_control_, kPackageID,
package_name.c_str());
if (ret != APP_CONTROL_ERROR_NONE) {
LOG_ERROR("Failed to add key[%s]:value[%s]", kPackageID,
package_name.c_str());
return false;
}

ret = app_control_send_launch_request(app_control_, nullptr, nullptr);
if (ret != APP_CONTROL_ERROR_NONE) {
LOG_ERROR("Failed to send launch request setting");
return false;
}
return true;

constexpr char kSettingAppId[] = "com.samsung.clocksetting.apps";

std::string GetPackageName() {
char* app_id;
int ret = app_get_id(&app_id);
if (ret != APP_ERROR_NONE) {
LOG_ERROR("The app ID is not found.");
return "";
}

private:
void Init() {
int ret = app_control_create(&app_control_);
if (ret != APP_CONTROL_ERROR_NONE) {
LOG_ERROR("Failed to create app control handle");
}

ret = app_control_set_app_id(app_control_, kSettingAppID);
if (ret != APP_CONTROL_ERROR_NONE) {
LOG_ERROR("Failed to set app id[%s]", kSettingAppID);
}
package_info_h package_info;
ret = package_info_create(app_id, &package_info);
free(app_id);
if (ret != PACKAGE_MANAGER_ERROR_NONE) {
LOG_ERROR("Failed to create a package info handle.");
return "";
}

void Deinit() {
if (app_control_) {
app_control_destroy(app_control_);
app_control_ = nullptr;
}
char* package_name;
ret = package_info_get_package(package_info, &package_name);
package_info_destroy(package_info);
if (ret != PACKAGE_MANAGER_ERROR_NONE) {
LOG_ERROR("Failed to get the package name.");
return "";
}

app_control_h app_control_{nullptr};
};

class PackageName {
public:
PackageName() { Init(); }

~PackageName() { Deinit(); }

char* Get() { return package_name_; }

private:
void Init() {
int ret = app_get_id(&app_id_);
if (ret != APP_ERROR_NONE || app_id_ == nullptr) {
LOG_ERROR("Failed to get app id");
return;
}

ret = package_info_create(app_id_, &package_info_);
if (ret != PACKAGE_MANAGER_ERROR_NONE || package_info_ == nullptr) {
LOG_ERROR("Failed to create package info handle");
}
ret = package_info_get_package(package_info_, &package_name_);
if (ret != PACKAGE_MANAGER_ERROR_NONE || package_name_ == nullptr) {
LOG_ERROR("Failed to get package name");
}
std::string result = std::string(package_name);
free(package_name);

return result;
}

} // namespace

bool AppSettingsManager::OpenAppSettings() {
std::string package_name = GetPackageName();
if (package_name.empty()) {
return false;
}

void Deinit() {
if (app_id_) {
free(app_id_);
app_id_ = nullptr;
}

if (package_info_) {
package_info_destroy(package_info_);
package_info_ = nullptr;
}

if (package_name_) {
free(package_name_);
package_name_ = nullptr;
}
app_control_h app_control;
int ret = app_control_create(&app_control);
if (ret != APP_CONTROL_ERROR_NONE) {
LOG_ERROR("Failed to create an app control handle.");
return false;
}

char* app_id_{nullptr};
package_info_h package_info_{nullptr};
char* package_name_{nullptr};
};
} // namespace
ret = app_control_set_app_id(app_control, kSettingAppId);
if (ret != APP_CONTROL_ERROR_NONE) {
LOG_ERROR("Failed to set an app ID.");
app_control_destroy(app_control);
return false;
}

AppSettingsManager::AppSettingsManager() {
app_permissions_ = std::make_unique<AppPermissions>();
PackageName pkg_name;
char* name = pkg_name.Get();
if (name == nullptr) {
return;
ret = app_control_add_extra_data(app_control, "pkgId", package_name.c_str());
if (ret != APP_CONTROL_ERROR_NONE) {
LOG_ERROR("Failed to add extra data.");
app_control_destroy(app_control);
return false;
}
package_name_ = std::string(name);
}

AppSettingsManager::~AppSettingsManager() {}
ret = app_control_send_launch_request(app_control, nullptr, nullptr);
app_control_destroy(app_control);
if (ret != APP_CONTROL_ERROR_NONE) {
LOG_ERROR("Failed to send a launch request.");
return false;
}

bool AppSettingsManager::OpenAppSettings() {
return app_permissions_->Launch(package_name_);
return true;
}
24 changes: 8 additions & 16 deletions packages/permission_handler/tizen/src/app_settings_manager.h
Original file line number Diff line number Diff line change
@@ -1,24 +1,16 @@
#ifndef APP_SETTINGS_MANAGER_H_
#define APP_SETTINGS_MANAGER_H_
// Copyright 2021 Samsung Electronics Co., Ltd. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <functional>
#include <memory>
#include <string>

namespace {
class AppPermissions;
}
#ifndef FLUTTER_PLUGIN_APP_SETTINGS_MANAGER_H_
#define FLUTTER_PLUGIN_APP_SETTINGS_MANAGER_H_

class AppSettingsManager {
public:
AppSettingsManager();
~AppSettingsManager();
AppSettingsManager() {}
~AppSettingsManager() {}

bool OpenAppSettings();

private:
std::unique_ptr<AppPermissions> app_permissions_;
std::string package_name_;
};

#endif // APP_SETTINGS_MANAGER_H_
#endif // FLUTTER_PLUGIN_APP_SETTINGS_MANAGER_H_
Loading