Remove application launcher when its android counterpart is removed

This commit is contained in:
Simon Fels 2017-02-22 17:08:19 +01:00
commit 69631a1bfc
10 changed files with 131 additions and 22 deletions

View file

@ -41,16 +41,27 @@ void LauncherStorage::reset() {
fs::remove_all(icon_path_);
}
void LauncherStorage::add(const Item &item) {
std::string LauncherStorage::clean_package_name(const std::string &package_name) {
auto cleaned_package_name = package_name;
std::replace(cleaned_package_name.begin(), cleaned_package_name.end(), '.', '-');
return cleaned_package_name;
}
fs::path LauncherStorage::path_for_item(const std::string &package_name) {
return path_ / utils::string_format("anbox-%s.desktop", package_name);
}
fs::path LauncherStorage::path_for_item_icon(const std::string &package_name) {
return icon_path_ / utils::string_format("anbox-%s.png", package_name);
}
void LauncherStorage::add_or_update(const Item &item) {
if (!fs::exists(path_)) fs::create_directories(path_);
if (!fs::exists(icon_path_)) fs::create_directories(icon_path_);
auto package_name = item.package;
std::replace(package_name.begin(), package_name.end(), '.', '-');
const auto item_path = path_ / utils::string_format("anbox-%s.desktop", package_name);
const auto item_icon_path = icon_path_ / utils::string_format("anbox-%s.png", package_name);
std::string exec = utils::string_format("%s launch ", utils::process_get_exe_path(getpid()));
if (!item.launch_intent.action.empty())
@ -68,7 +79,8 @@ void LauncherStorage::add(const Item &item) {
if (!item.launch_intent.component.empty())
exec += utils::string_format("--component=%s ", item.launch_intent.component);
if (auto desktop_item = std::ofstream(item_path.string())) {
const auto item_icon_path = path_for_item_icon(package_name);
if (auto desktop_item = std::ofstream(path_for_item(package_name).string())) {
desktop_item << "[Desktop Entry]" << std::endl
<< "Name=" << item.package << std::endl
<< "Exec=" << exec << std::endl
@ -84,5 +96,18 @@ void LauncherStorage::add(const Item &item) {
else
BOOST_THROW_EXCEPTION(std::runtime_error("Failed to write icon"));
}
void LauncherStorage::remove(const Item &item) {
auto package_name = clean_package_name(item.package);
const auto item_path = path_for_item(package_name);
if (fs::exists(item_path))
fs::remove(item_path);
const auto item_icon_path = path_for_item_icon(package_name);
if (fs::exists(item_icon_path))
fs::remove(item_icon_path);
}
} // namespace application
} // namespace anbox

View file

@ -41,9 +41,14 @@ class LauncherStorage {
};
void reset();
void add(const Item &item);
void add_or_update(const Item &item);
void remove(const Item &item);
private:
std::string clean_package_name(const std::string &package_name);
boost::filesystem::path path_for_item(const std::string &package_name);
boost::filesystem::path path_for_item_icon(const std::string &package_name);
boost::filesystem::path path_;
boost::filesystem::path icon_path_;
};

View file

@ -62,15 +62,13 @@ void PlatformApiSkeleton::get_clipboard_data(anbox::protobuf::rpc::Void const *r
done->Run();
}
void PlatformApiSkeleton::handle_boot_finished_event(
const anbox::protobuf::bridge::BootFinishedEvent &event) {
void PlatformApiSkeleton::handle_boot_finished_event(const anbox::protobuf::bridge::BootFinishedEvent &event) {
(void)event;
if (boot_finished_handler_) boot_finished_handler_();
}
void PlatformApiSkeleton::handle_window_state_update_event(
const anbox::protobuf::bridge::WindowStateUpdateEvent &event) {
void PlatformApiSkeleton::handle_window_state_update_event(const anbox::protobuf::bridge::WindowStateUpdateEvent &event) {
auto convert_window_state = [](
const ::anbox::protobuf::bridge::WindowStateUpdateEvent_WindowState
&window) {
@ -97,12 +95,18 @@ void PlatformApiSkeleton::handle_window_state_update_event(
window_manager_->apply_window_state_update(updated, removed);
}
void PlatformApiSkeleton::handle_application_list_update_event(
const anbox::protobuf::bridge::ApplicationListUpdateEvent &event) {
// Remove all existing items to start from scratch for all
// applications. We may need to improve this in the future
// to guarantee correct integration into desktop environments
launcher_storage_->reset();
void PlatformApiSkeleton::handle_application_list_update_event(const anbox::protobuf::bridge::ApplicationListUpdateEvent &event) {
for (int n = 0; n < event.removed_applications_size(); n++) {
application::LauncherStorage::Item item;
const auto app = event.removed_applications(n);
item.package = app.package();
if (item.package.empty())
continue;
launcher_storage_->remove(item);
}
for (int n = 0; n < event.applications_size(); n++) {
application::LauncherStorage::Item item;
@ -126,13 +130,11 @@ void PlatformApiSkeleton::handle_application_list_update_event(
if (item.package.empty())
continue;
// If the item is already stored it will be updated
launcher_storage_->add(item);
launcher_storage_->add_or_update(item);
}
}
void PlatformApiSkeleton::register_boot_finished_handler(
const std::function<void()> &action) {
void PlatformApiSkeleton::register_boot_finished_handler(const std::function<void()> &action) {
boot_finished_handler_ = action;
}
} // namespace bridge

View file

@ -84,6 +84,7 @@ message ApplicationListUpdateEvent {
optional bytes icon = 4;
}
repeated Application applications = 1;
repeated Application removed_applications = 2;
}
message EventSequence {