/*
* Copyright 2013 Canonical Ltd.
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 3, as published
* by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranties of
* MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see .
*
* Authors:
* Charles Kerr
*/
#include
extern "C"
{
#include
}
namespace ayatana {
namespace indicator {
namespace datetime {
/***
****
***/
LiveSettings::~LiveSettings()
{
g_clear_object(&m_settings_cunh);
g_clear_object(&m_settings);
}
LiveSettings::LiveSettings(): m_settings(g_settings_new(SETTINGS_INTERFACE))
{
g_signal_connect (m_settings, "changed", G_CALLBACK(on_changed_ccid), this);
if (ayatana_common_utils_is_lomiri())
{
m_settings_cunh = g_settings_new(SETTINGS_CUNH_SCHEMA_ID);
g_signal_connect (m_settings_cunh, "changed", G_CALLBACK(on_changed_cunh), this);
}
// init the Properties from the GSettings backend
update_custom_time_format();
update_locations();
update_show_calendar();
update_show_date();
update_show_day();
update_show_detected_locations();
update_show_events();
update_show_locations();
update_show_seconds();
update_show_week_numbers();
update_show_year();
update_time_format_mode();
update_timezone_name();
update_calendar_sound();
update_alarm_sound();
update_alarm_volume();
update_alarm_duration();
update_alarm_haptic();
update_snooze_duration();
update_muted_apps();
// now listen for clients to change the properties s.t. we can sync update GSettings
custom_time_format.changed().connect([this](const std::string& value){
g_settings_set_string(m_settings, SETTINGS_CUSTOM_TIME_FORMAT_S, value.c_str());
});
if (ayatana_common_utils_is_lomiri())
{
muted_apps.changed().connect([this](const std::set>& value){
GVariantBuilder builder;
g_variant_builder_init(&builder, G_VARIANT_TYPE("a(ss)"));
for(const auto& app : value){
const auto& pkgname {app.first};
const auto& appname {app.second};
g_variant_builder_add(&builder, "(ss)", pkgname.c_str(), appname.c_str());
}
g_settings_set_value(m_settings_cunh, SETTINGS_CUNH_BLACKLIST_S, g_variant_builder_end(&builder));
});
}
locations.changed().connect([this](const std::vector& value){
const int n = value.size();
gchar** strv = g_new0(gchar*, n+1);
for(int i=0; i(value[i].c_str());
g_settings_set_strv(m_settings, SETTINGS_LOCATIONS_S, strv);
g_free(strv);
});
show_calendar.changed().connect([this](bool value){
g_settings_set_boolean(m_settings, SETTINGS_SHOW_CALENDAR_S, value);
});
show_date.changed().connect([this](bool value){
g_settings_set_boolean(m_settings, SETTINGS_SHOW_DATE_S, value);
});
show_day.changed().connect([this](bool value){
g_settings_set_boolean(m_settings, SETTINGS_SHOW_DAY_S, value);
});
show_detected_location.changed().connect([this](bool value){
g_settings_set_boolean(m_settings, SETTINGS_SHOW_DETECTED_S, value);
});
show_events.changed().connect([this](bool value){
g_settings_set_boolean(m_settings, SETTINGS_SHOW_EVENTS_S, value);
});
show_locations.changed().connect([this](bool value){
g_settings_set_boolean(m_settings, SETTINGS_SHOW_LOCATIONS_S, value);
});
show_seconds.changed().connect([this](bool value){
g_settings_set_boolean(m_settings, SETTINGS_SHOW_SECONDS_S, value);
});
show_week_numbers.changed().connect([this](bool value){
g_settings_set_boolean(m_settings, SETTINGS_SHOW_WEEK_NUMBERS_S, value);
});
show_year.changed().connect([this](bool value){
g_settings_set_boolean(m_settings, SETTINGS_SHOW_YEAR_S, value);
});
time_format_mode.changed().connect([this](TimeFormatMode value){
g_settings_set_enum(m_settings, SETTINGS_TIME_FORMAT_S, gint(value));
});
timezone_name.changed().connect([this](const std::string& value){
g_settings_set_string(m_settings, SETTINGS_TIMEZONE_NAME_S, value.c_str());
});
calendar_sound.changed().connect([this](const std::string& value){
g_settings_set_string(m_settings, SETTINGS_CALENDAR_SOUND_S, value.c_str());
});
alarm_sound.changed().connect([this](const std::string& value){
g_settings_set_string(m_settings, SETTINGS_ALARM_SOUND_S, value.c_str());
});
alarm_volume.changed().connect([this](unsigned int value){
g_settings_set_uint(m_settings, SETTINGS_ALARM_VOLUME_S, value);
});
alarm_duration.changed().connect([this](unsigned int value){
g_settings_set_uint(m_settings, SETTINGS_ALARM_DURATION_S, value);
});
alarm_haptic.changed().connect([this](const std::string& value){
g_settings_set_string(m_settings, SETTINGS_ALARM_HAPTIC_S, value.c_str());
});
snooze_duration.changed().connect([this](unsigned int value){
g_settings_set_uint(m_settings, SETTINGS_SNOOZE_DURATION_S, value);
});
}
/***
****
***/
void LiveSettings::update_custom_time_format()
{
auto val = g_settings_get_string(m_settings, SETTINGS_CUSTOM_TIME_FORMAT_S);
custom_time_format.set(val);
g_free(val);
}
void LiveSettings::update_locations()
{
auto strv = g_settings_get_strv(m_settings, SETTINGS_LOCATIONS_S);
std::vector l;
for(int i=0; strv && strv[i]; i++)
l.push_back(strv[i]);
g_strfreev(strv);
locations.set(l);
}
void LiveSettings::update_muted_apps()
{
if (ayatana_common_utils_is_lomiri())
{
std::set> apps;
auto blacklist = g_settings_get_value(m_settings_cunh, SETTINGS_CUNH_BLACKLIST_S);
GVariantIter* iter {nullptr};
g_variant_get (blacklist, "a(ss)", &iter);
gchar* pkgname;
gchar* appname;
while (g_variant_iter_loop (iter, "(ss)", &pkgname, &appname)) {
apps.insert(std::make_pair(pkgname,appname));
}
g_variant_iter_free (iter);
g_clear_pointer(&blacklist, g_variant_unref);
muted_apps.set(apps);
}
}
void LiveSettings::update_show_calendar()
{
const auto val = g_settings_get_boolean(m_settings, SETTINGS_SHOW_CALENDAR_S);
show_calendar.set(val);
}
void LiveSettings::update_show_date()
{
show_date.set(g_settings_get_boolean(m_settings, SETTINGS_SHOW_DATE_S));
}
void LiveSettings::update_show_day()
{
show_day.set(g_settings_get_boolean(m_settings, SETTINGS_SHOW_DAY_S));
}
void LiveSettings::update_show_detected_locations()
{
const auto val = g_settings_get_boolean(m_settings, SETTINGS_SHOW_DETECTED_S);
show_detected_location.set(val);
}
void LiveSettings::update_show_events()
{
const auto val = g_settings_get_boolean(m_settings, SETTINGS_SHOW_EVENTS_S);
show_events.set(val);
}
void LiveSettings::update_show_locations()
{
const auto val = g_settings_get_boolean(m_settings, SETTINGS_SHOW_LOCATIONS_S);
show_locations.set(val);
}
void LiveSettings::update_show_seconds()
{
show_seconds.set(g_settings_get_boolean(m_settings, SETTINGS_SHOW_SECONDS_S));
}
void LiveSettings::update_show_week_numbers()
{
const auto val = g_settings_get_boolean(m_settings, SETTINGS_SHOW_WEEK_NUMBERS_S);
show_week_numbers.set(val);
}
void LiveSettings::update_show_year()
{
show_year.set(g_settings_get_boolean(m_settings, SETTINGS_SHOW_YEAR_S));
}
void LiveSettings::update_time_format_mode()
{
time_format_mode.set((TimeFormatMode)g_settings_get_enum(m_settings, SETTINGS_TIME_FORMAT_S));
}
void LiveSettings::update_timezone_name()
{
auto val = g_settings_get_string(m_settings, SETTINGS_TIMEZONE_NAME_S);
timezone_name.set(val);
g_free(val);
}
void LiveSettings::update_calendar_sound()
{
auto val = g_settings_get_string(m_settings, SETTINGS_CALENDAR_SOUND_S);
calendar_sound.set(val);
g_free(val);
}
void LiveSettings::update_alarm_sound()
{
auto val = g_settings_get_string(m_settings, SETTINGS_ALARM_SOUND_S);
alarm_sound.set(val);
g_free(val);
}
void LiveSettings::update_alarm_volume()
{
alarm_volume.set(g_settings_get_uint(m_settings, SETTINGS_ALARM_VOLUME_S));
}
void LiveSettings::update_alarm_duration()
{
alarm_duration.set(g_settings_get_uint(m_settings, SETTINGS_ALARM_DURATION_S));
}
void LiveSettings::update_alarm_haptic()
{
auto val = g_settings_get_string(m_settings, SETTINGS_ALARM_HAPTIC_S);
alarm_haptic.set(val);
g_free(val);
}
void LiveSettings::update_snooze_duration()
{
snooze_duration.set(g_settings_get_uint(m_settings, SETTINGS_SNOOZE_DURATION_S));
}
/***
****
***/
void LiveSettings::on_changed_cunh(GSettings* /*settings*/,
gchar* key,
gpointer gself)
{
static_cast(gself)->update_key_cunh(key);
}
void LiveSettings::update_key_cunh(const std::string& key)
{
if (key == SETTINGS_CUNH_BLACKLIST_S)
update_muted_apps();
}
/***
****
***/
void LiveSettings::on_changed_ccid(GSettings* /*settings*/,
gchar* key,
gpointer gself)
{
static_cast(gself)->update_key_ccid(key);
}
void LiveSettings::update_key_ccid(const std::string& key)
{
if (key == SETTINGS_LOCATIONS_S)
update_locations();
else if (key == SETTINGS_TIME_FORMAT_S)
update_time_format_mode();
else if (key == SETTINGS_SHOW_SECONDS_S)
update_show_seconds();
else if (key == SETTINGS_SHOW_DAY_S)
update_show_day();
else if (key == SETTINGS_SHOW_DATE_S)
update_show_date();
else if (key == SETTINGS_SHOW_YEAR_S)
update_show_year();
else if (key == SETTINGS_CUSTOM_TIME_FORMAT_S)
update_custom_time_format();
else if (key == SETTINGS_SHOW_CALENDAR_S)
update_show_calendar();
else if (key == SETTINGS_SHOW_WEEK_NUMBERS_S)
update_show_week_numbers();
else if (key == SETTINGS_SHOW_EVENTS_S)
update_show_events();
else if (key == SETTINGS_SHOW_LOCATIONS_S)
update_show_locations();
else if (key == SETTINGS_SHOW_DETECTED_S)
update_show_detected_locations();
else if (key == SETTINGS_TIMEZONE_NAME_S)
update_timezone_name();
else if (key == SETTINGS_CALENDAR_SOUND_S)
update_calendar_sound();
else if (key == SETTINGS_ALARM_SOUND_S)
update_alarm_sound();
else if (key == SETTINGS_ALARM_VOLUME_S)
update_alarm_volume();
else if (key == SETTINGS_ALARM_DURATION_S)
update_alarm_duration();
else if (key == SETTINGS_ALARM_HAPTIC_S)
update_alarm_haptic();
else if (key == SETTINGS_SNOOZE_DURATION_S)
update_snooze_duration();
}
/***
****
***/
} // namespace datetime
} // namespace indicator
} // namespace ayatana