R image/assets/audio/alarm_cymbals.mp3 => image/assets/audio/alarm/alarm_cymbals.mp3 +0 -0
R image/assets/audio/alarm_dulcimer.mp3 => image/assets/audio/alarm/alarm_dulcimer.mp3 +0 -0
R image/assets/audio/alarm_guitar.mp3 => image/assets/audio/alarm/alarm_guitar.mp3 +0 -0
R image/assets/audio/alarm_hang_drum.mp3 => image/assets/audio/alarm/alarm_hang_drum.mp3 +0 -0
R image/assets/audio/alarm_koshi.mp3 => image/assets/audio/alarm/alarm_koshi.mp3 +0 -0
R image/assets/audio/alarm_mudita_bell.mp3 => image/assets/audio/alarm/alarm_mudita_bell.mp3 +0 -0
R image/assets/audio/ringtone_bowl.mp3 => image/assets/audio/ringtone/ringtone_bowl.mp3 +0 -0
R image/assets/audio/ringtone_country_guitar.mp3 => image/assets/audio/ringtone/ringtone_country_guitar.mp3 +0 -0
R image/assets/audio/ringtone_country_guitar_2.mp3 => image/assets/audio/ringtone/ringtone_country_guitar_2.mp3 +0 -0
R image/assets/audio/ringtone_country_guitar_3.mp3 => image/assets/audio/ringtone/ringtone_country_guitar_3.mp3 +0 -0
R image/assets/audio/ringtone_country_guitar_4.mp3 => image/assets/audio/ringtone/ringtone_country_guitar_4.mp3 +0 -0
R image/assets/audio/ringtone_cymbals.mp3 => image/assets/audio/ringtone/ringtone_cymbals.mp3 +0 -0
R image/assets/audio/ringtone_drum.mp3 => image/assets/audio/ringtone/ringtone_drum.mp3 +0 -0
R image/assets/audio/rington_drum_2.mp3 => image/assets/audio/ringtone/ringtone_drum_2.mp3 +0 -0
R image/assets/audio/ringtone_gong.mp3 => image/assets/audio/ringtone/ringtone_gong.mp3 +0 -0
R image/assets/audio/ringtone_guitar.mp3 => image/assets/audio/ringtone/ringtone_guitar.mp3 +0 -0
R image/assets/audio/ringtone_guitar_2.mp3 => image/assets/audio/ringtone/ringtone_guitar_2.mp3 +0 -0
R image/assets/audio/ringtone_guitar_3.mp3 => image/assets/audio/ringtone/ringtone_guitar_3.mp3 +0 -0
R image/assets/audio/ringtone_guitar_4.mp3 => image/assets/audio/ringtone/ringtone_guitar_4.mp3 +0 -0
R image/assets/audio/ringtone_harp.mp3 => image/assets/audio/ringtone/ringtone_harp.mp3 +0 -0
R image/assets/audio/ringtone_koshi.mp3 => image/assets/audio/ringtone/ringtone_koshi.mp3 +0 -0
R image/assets/audio/ringtone_koshi_2.mp3 => image/assets/audio/ringtone/ringtone_koshi_2.mp3 +0 -0
R image/assets/audio/ringtone_ukulele.mp3 => image/assets/audio/ringtone/ringtone_ukulele.mp3 +0 -0
R image/assets/audio/sms_1_4.mp3 => image/assets/audio/sms/sms_1_4.mp3 +0 -0
R image/assets/audio/sms_bowl.mp3 => image/assets/audio/sms/sms_bowl.mp3 +0 -0
R image/assets/audio/sms_cymbals.mp3 => image/assets/audio/sms/sms_cymbals.mp3 +0 -0
R image/assets/audio/sms_cymbals_2.mp3 => image/assets/audio/sms/sms_cymbals_2.mp3 +0 -0
R image/assets/audio/sms_cymbals_3.mp3 => image/assets/audio/sms/sms_cymbals_3.mp3 +0 -0
R image/assets/audio/sms_drum.mp3 => image/assets/audio/sms/sms_drum.mp3 +0 -0
R image/assets/audio/sms_drum_2.mp3 => image/assets/audio/sms/sms_drum_2.mp3 +0 -0
R image/assets/audio/sms_gong.mp3 => image/assets/audio/sms/sms_gong.mp3 +0 -0
R image/assets/audio/sms_guitar.mp3 => image/assets/audio/sms/sms_guitar.mp3 +0 -0
R image/assets/audio/sms_guitar_2.mp3 => image/assets/audio/sms/sms_guitar_2.mp3 +0 -0
R image/assets/audio/sms_guitar_3.mp3 => image/assets/audio/sms/sms_guitar_3.mp3 +0 -0
R image/assets/audio/sms_guitar_4.mp3 => image/assets/audio/sms/sms_guitar_4.mp3 +0 -0
R image/assets/audio/sms_guitar_5.mp3 => image/assets/audio/sms/sms_guitar_5.mp3 +0 -0
R image/assets/audio/sms_harpsichord.mp3 => image/assets/audio/sms/sms_harpsichord.mp3 +0 -0
R image/assets/audio/sms_koshi.mp3 => image/assets/audio/sms/sms_koshi.mp3 +0 -0
R image/assets/audio/sms_koshi_2.mp3 => image/assets/audio/sms/sms_koshi_2.mp3 +0 -0
R image/assets/audio/sms_koshi_3.mp3 => image/assets/audio/sms/sms_koshi_3.mp3 +0 -0
R image/assets/audio/sms_tibetan_bowl.mp3 => image/assets/audio/sms/sms_tibetan_bowl.mp3 +0 -0
M module-apps/InternalModel.hpp => module-apps/InternalModel.hpp +2 -2
@@ 40,7 40,7 @@ namespace app
internalLimit = limit;
}
- gui::ListItem *getRecord(gui::Order order)
+ T getRecord(gui::Order order)
{
auto index = 0;
if (order == gui::Order::Previous) {
@@ 70,7 70,7 @@ namespace app
Item->clearNavigationItem(gui::NavigationDirection::DOWN);
}
- [[nodiscard]] gui::ListItem *getInternalDataElement(unsigned int index, gui::Order order)
+ [[nodiscard]] T getInternalDataElement(unsigned int index, gui::Order order)
{
if (isIndexValid(index, order)) {
clearItemProperties(internalData[index]);
M module-apps/application-settings-new/ApplicationSettings.cpp => module-apps/application-settings-new/ApplicationSettings.cpp +61 -70
@@ 3,57 3,59 @@
#include "ApplicationSettings.hpp"
-#include "windows/AddDeviceWindow.hpp"
-#include "windows/AllDevicesWindow.hpp"
-#include "windows/ApnSettingsWindow.hpp"
-#include "windows/ApnOptionsWindow.hpp"
-#include "windows/BluetoothWindow.hpp"
-#include "windows/SettingsMainWindow.hpp"
-#include "windows/DisplayAndKeypadWindow.hpp"
-#include "windows/InputLanguageWindow.hpp"
-#include "windows/LockedScreenWindow.hpp"
-#include "windows/FontSizeWindow.hpp"
-#include "windows/DisplayLightWindow.hpp"
-#include "windows/KeypadLightWindow.hpp"
-#include "windows/AppsAndToolsWindow.hpp"
-#include "windows/NightshiftWindow.hpp"
-#include "windows/NetworkWindow.hpp"
-#include "windows/PhoneWindow.hpp"
-#include "windows/CallRingtoneWindow.hpp"
-#include "windows/MessagesWindow.hpp"
-#include "windows/MessageSoundWindow.hpp"
-#include "windows/CalendarWindow.hpp"
-#include "windows/NotificationSoundWindow.hpp"
-#include "windows/AlarmClockWindow.hpp"
-#include "windows/PhoneNameWindow.hpp"
-#include "windows/AutolockWindow.hpp"
-#include "windows/TorchWindow.hpp"
-#include "windows/WallpaperWindow.hpp"
-#include "windows/QuotesMainWindow.hpp"
-#include "windows/QuotesAddWindow.hpp"
-#include "windows/EditQuotesWindow.hpp"
-#include "windows/QuoteCategoriesWindow.hpp"
-#include "windows/SecurityMainWindow.hpp"
-#include "windows/QuotesOptionsWindow.hpp"
-#include "windows/SARInfoWindow.hpp"
-#include "windows/ChangePasscodeWindow.hpp"
-#include "windows/SystemMainWindow.hpp"
-#include "windows/NewApnWindow.hpp"
-#include "windows/LanguagesWindow.hpp"
-#include "windows/DateAndTimeMainWindow.hpp"
-#include "windows/ChangeTimeZone.hpp"
-#include "windows/ChangeDateAndTimeWindow.hpp"
-#include "windows/PhoneModesWindow.hpp"
-#include "windows/PINSettingsWindow.hpp"
-#include "windows/DoNotDisturbWindow.hpp"
-#include "windows/OfflineWindow.hpp"
-#include "windows/ConnectionFrequencyWindow.hpp"
-#include "windows/AboutYourPureWindow.hpp"
-#include "windows/CertificationWindow.hpp"
-#include "windows/TechnicalInformationWindow.hpp"
-
-#include "Dialog.hpp"
-#include "DialogMetadataMessage.hpp"
+#include <application-settings-new/windows/AddDeviceWindow.hpp>
+#include <application-settings-new/windows/AllDevicesWindow.hpp>
+#include <application-settings-new/windows/ApnSettingsWindow.hpp>
+#include <application-settings-new/windows/ApnOptionsWindow.hpp>
+#include <application-settings-new/windows/BluetoothWindow.hpp>
+#include <application-settings-new/windows/SettingsMainWindow.hpp>
+#include <application-settings-new/windows/DisplayAndKeypadWindow.hpp>
+#include <application-settings-new/windows/InputLanguageWindow.hpp>
+#include <application-settings-new/windows/LockedScreenWindow.hpp>
+#include <application-settings-new/windows/FontSizeWindow.hpp>
+#include <application-settings-new/windows/DisplayLightWindow.hpp>
+#include <application-settings-new/windows/KeypadLightWindow.hpp>
+#include <application-settings-new/windows/AppsAndToolsWindow.hpp>
+#include <application-settings-new/windows/NightshiftWindow.hpp>
+#include <application-settings-new/windows/NetworkWindow.hpp>
+#include <application-settings-new/windows/PhoneWindow.hpp>
+#include <application-settings-new/windows/MessagesWindow.hpp>
+#include <application-settings-new/windows/CalendarWindow.hpp>
+#include <application-settings-new/windows/AlarmClockWindow.hpp>
+#include <application-settings-new/windows/SoundSelectWindow.hpp>
+#include <application-settings-new/windows/PhoneNameWindow.hpp>
+#include <application-settings-new/windows/AutolockWindow.hpp>
+#include <application-settings-new/windows/TorchWindow.hpp>
+#include <application-settings-new/windows/WallpaperWindow.hpp>
+#include <application-settings-new/windows/QuotesMainWindow.hpp>
+#include <application-settings-new/windows/QuotesAddWindow.hpp>
+#include <application-settings-new/windows/EditQuotesWindow.hpp>
+#include <application-settings-new/windows/QuoteCategoriesWindow.hpp>
+#include <application-settings-new/windows/SecurityMainWindow.hpp>
+#include <application-settings-new/windows/QuotesOptionsWindow.hpp>
+#include <application-settings-new/windows/SARInfoWindow.hpp>
+#include <application-settings-new/windows/ChangePasscodeWindow.hpp>
+#include <application-settings-new/windows/SystemMainWindow.hpp>
+#include <application-settings-new/windows/NewApnWindow.hpp>
+#include <application-settings-new/windows/LanguagesWindow.hpp>
+#include <application-settings-new/windows/DateAndTimeMainWindow.hpp>
+#include <application-settings-new/windows/ChangeTimeZone.hpp>
+#include <application-settings-new/windows/ChangeDateAndTimeWindow.hpp>
+#include <application-settings-new/windows/PhoneModesWindow.hpp>
+#include <application-settings-new/windows/PINSettingsWindow.hpp>
+#include <application-settings-new/windows/DoNotDisturbWindow.hpp>
+#include <application-settings-new/windows/OfflineWindow.hpp>
+#include <application-settings-new/windows/ConnectionFrequencyWindow.hpp>
+#include <application-settings-new/windows/AboutYourPureWindow.hpp>
+#include <application-settings-new/windows/CertificationWindow.hpp>
+#include <application-settings-new/windows/TechnicalInformationWindow.hpp>
+#include <application-settings-new/data/ApnListData.hpp>
+#include <application-settings-new/data/BondedDevicesData.hpp>
+#include <application-settings-new/data/BluetoothStatusData.hpp>
+#include <application-settings-new/data/DeviceData.hpp>
+#include <application-settings-new/data/LanguagesData.hpp>
+#include <application-settings-new/data/PhoneNameData.hpp>
+#include <application-settings-new/data/PINSettingsLockStateData.hpp>
#include <service-evtmgr/EventManagerServiceAPI.hpp>
#include <service-cellular/CellularServiceAPI.hpp>
@@ 68,17 70,8 @@
#include <service-bluetooth/messages/ResponseVisibleDevices.hpp>
#include <service-bluetooth/messages/Unpair.hpp>
#include <service-db/agents/settings/SystemSettings.hpp>
-#include <application-settings-new/data/ApnListData.hpp>
-#include <application-settings-new/data/BondedDevicesData.hpp>
-#include <application-settings-new/data/BluetoothStatusData.hpp>
-#include <application-settings-new/data/DeviceData.hpp>
-#include <application-settings-new/data/LanguagesData.hpp>
-#include <application-settings-new/data/PhoneNameData.hpp>
-#include <application-settings-new/data/PINSettingsLockStateData.hpp>
-#include <module-services/service-db/agents/settings/SystemSettings.hpp>
#include <service-db/Settings.hpp>
-
-#include <i18n/i18n.hpp>
+#include <module-services/service-db/agents/settings/SystemSettings.hpp>
#include <module-services/service-evtmgr/service-evtmgr/ScreenLightControlMessage.hpp>
#include <module-services/service-evtmgr/service-evtmgr/Constants.hpp>
#include <module-services/service-evtmgr/service-evtmgr/EVMessages.hpp>
@@ 86,6 79,10 @@
#include <module-services/service-appmgr/service-appmgr/model/ApplicationManager.hpp>
#include <module-apps/application-desktop/windows/PinLockWindow.hpp>
#include <module-apps/application-desktop/windows/Names.hpp>
+#include <module-apps/messages/DialogMetadataMessage.hpp>
+#include <module-apps/windows/Dialog.hpp>
+
+#include <i18n/i18n.hpp>
namespace app
{
@@ 428,30 425,24 @@ namespace app
std::make_unique<audio_settings::AudioSettingsModel>(app, audio_settings::PlaybackType::CallRingtone);
return std::make_unique<gui::PhoneWindow>(app, std::move(audioModel));
});
- windowsFactory.attach(gui::window::name::call_ringtone, [](Application *app, const std::string &name) {
- return std::make_unique<gui::CallRingtoneWindow>(app);
- });
windowsFactory.attach(gui::window::name::messages, [](Application *app, const std::string &name) {
auto audioModel = std::make_unique<audio_settings::AudioSettingsModel>(
app, audio_settings::PlaybackType::TextMessageRingtone);
return std::make_unique<gui::MessagesWindow>(app, std::move(audioModel));
});
- windowsFactory.attach(gui::window::name::message_sound, [](Application *app, const std::string &name) {
- return std::make_unique<gui::MessageSoundWindow>(app);
- });
windowsFactory.attach(gui::window::name::calendar, [](Application *app, const std::string &name) {
auto audioModel =
std::make_unique<audio_settings::AudioSettingsModel>(app, audio_settings::PlaybackType::Notifications);
return std::make_unique<gui::CalendarWindow>(app, std::move(audioModel));
});
- windowsFactory.attach(gui::window::name::notification_sound, [](Application *app, const std::string &name) {
- return std::make_unique<gui::NotificationSoundWindow>(app);
- });
windowsFactory.attach(gui::window::name::alarm_clock, [](Application *app, const std::string &name) {
auto audioModel =
std::make_unique<audio_settings::AudioSettingsModel>(app, audio_settings::PlaybackType::Alarm);
return std::make_unique<gui::AlarmClockWindow>(app, std::move(audioModel));
});
+ windowsFactory.attach(gui::window::name::sound_select, [](Application *app, const std::string &name) {
+ return std::make_unique<gui::SoundSelectWindow>(app, name);
+ });
windowsFactory.attach(gui::window::name::phone_name, [](Application *app, const std::string &name) {
return std::make_unique<gui::PhoneNameWindow>(app);
});
M module-apps/application-settings-new/ApplicationSettings.hpp => module-apps/application-settings-new/ApplicationSettings.hpp +1 -3
@@ 32,13 32,11 @@ namespace gui::window::name
inline constexpr auto locked_screen = "LockedScreen";
inline constexpr auto phone = "Phone";
- inline constexpr auto call_ringtone = "CallRingtone";
inline constexpr auto messages = "Messages";
- inline constexpr auto message_sound = "MessageSound";
inline constexpr auto message_templates = "MessageTemplates";
inline constexpr auto calendar = "Calendar";
- inline constexpr auto notification_sound = "NotificationSound";
inline constexpr auto alarm_clock = "AlarmClock";
+ inline constexpr auto sound_select = "SoundSelect";
inline constexpr auto torch = "Torch";
inline constexpr auto nightshift = "Nightshift";
M module-apps/application-settings-new/CMakeLists.txt => module-apps/application-settings-new/CMakeLists.txt +3 -3
@@ 24,6 24,7 @@ target_sources( ${PROJECT_NAME}
models/CategoriesModel.cpp
models/SARInfoRepository.cpp
models/AudioSettingsModel.cpp
+ models/SoundsModel.cpp
presenter/SARInfoWindowPresenter.cpp
widgets/ChangePasscodeLockHandler.cpp
widgets/QuoteWidget.cpp
@@ 31,6 32,7 @@ target_sources( ${PROJECT_NAME}
widgets/ApnInputWidget.cpp
widgets/SettingsDateItem.cpp
widgets/SettingsTimeItem.cpp
+ widgets/SettingsSoundItem.cpp
windows/SettingsMainWindow.cpp
windows/AddDeviceWindow.cpp
windows/AllDevicesWindow.cpp
@@ 49,12 51,10 @@ target_sources( ${PROJECT_NAME}
windows/NightshiftWindow.cpp
windows/OptionsWidgetMaker.cpp
windows/PhoneWindow.cpp
- windows/CallRingtoneWindow.cpp
windows/MessagesWindow.cpp
- windows/MessageSoundWindow.cpp
windows/CalendarWindow.cpp
- windows/NotificationSoundWindow.cpp
windows/AlarmClockWindow.cpp
+ windows/SoundSelectWindow.cpp
windows/PhoneNameWindow.cpp
windows/AutolockWindow.cpp
windows/TorchWindow.cpp
A module-apps/application-settings-new/data/SoundSelectData.hpp => module-apps/application-settings-new/data/SoundSelectData.hpp +35 -0
@@ 0,0 1,35 @@
+// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
+// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
+
+#pragma once
+
+#include <application-settings-new/models/AbstractSoundsModel.hpp>
+
+/// @brief Switch data for SoundSelectWindow which allows
+/// to specify its behaviour
+class SoundSelectData : public gui::SwitchData
+{
+ public:
+ /// @brief internal struct to carry info for sound selection
+ struct Info
+ {
+ UTF8 windowTitle;
+ audio_settings::AbstractAudioSettingsModel *audioModel = nullptr;
+ };
+
+ /// Constructor
+ /// @param info information to be carried
+ explicit SoundSelectData(Info info) : mInfo(std::move(info))
+ {}
+
+ /// Returns the struct carrying info
+ /// @return information carried by this switch data
+ [[nodiscard]] const Info &get() const noexcept
+ {
+ return mInfo;
+ }
+
+ private:
+ /// Information carried by this switch data
+ Info mInfo;
+};
A module-apps/application-settings-new/models/AbstractSoundsModel.hpp => module-apps/application-settings-new/models/AbstractSoundsModel.hpp +27 -0
@@ 0,0 1,27 @@
+// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
+// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
+
+#pragma once
+
+#include <ListItemProvider.hpp>
+#include <application-settings-new/models/AudioSettingsModel.hpp>
+
+namespace app
+{
+ class Application;
+};
+
+/// @brief Abstract SoundsModel class
+class AbstractSoundsModel : public gui::ListItemProvider
+{
+ public:
+ virtual ~AbstractSoundsModel() = default;
+
+ /// Creates data for model
+ /// @param app pointer to current application
+ /// @param model audio settings model
+ virtual void createData(app::Application *app, audio_settings::AbstractAudioSettingsModel *model) = 0;
+
+ /// Clears all data for model
+ virtual void clearData() = 0;
+};
M module-apps/application-settings-new/models/AudioSettingsModel.cpp => module-apps/application-settings-new/models/AudioSettingsModel.cpp +5 -0
@@ 90,4 90,9 @@ namespace audio_settings
{
AudioServiceAPI::SetVolume(application, volume, playbackType);
}
+
+ audio::PlaybackType AudioSettingsModel::getPlaybackType()
+ {
+ return playbackType;
+ }
} // namespace audio_settings
M module-apps/application-settings-new/models/AudioSettingsModel.hpp => module-apps/application-settings-new/models/AudioSettingsModel.hpp +2 -0
@@ 39,6 39,7 @@ namespace audio_settings
virtual void setSound(std::string filePath) = 0;
[[nodiscard]] virtual audio::Volume getVolume() = 0;
virtual void setVolume(audio::Volume vol) = 0;
+ [[nodiscard]] virtual audio::PlaybackType getPlaybackType() = 0;
};
class AudioSettingsModel : public AbstractAudioSettingsModel
@@ 58,6 59,7 @@ namespace audio_settings
void setSound(std::string) override;
audio::Volume getVolume() override;
void setVolume(audio::Volume vol) override;
+ audio::PlaybackType getPlaybackType() override;
private:
app::Application *application = nullptr;
A module-apps/application-settings-new/models/SoundsModel.cpp => module-apps/application-settings-new/models/SoundsModel.cpp +131 -0
@@ 0,0 1,131 @@
+// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
+// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
+#include "SoundsModel.hpp"
+
+#include <ListView.hpp>
+#include <purefs/filesystem_paths.hpp>
+#include <service-audio/AudioServiceAPI.hpp>
+#include <time/time_conversion.hpp>
+#include <Style.hpp>
+#include <filesystem>
+
+unsigned int SoundsModel::requestRecordsCount()
+{
+ return internalData.size();
+}
+
+unsigned int SoundsModel::getMinimalItemHeight() const
+{
+ return style::listview::scroll::min_space;
+}
+
+void SoundsModel::requestRecords(const uint32_t offset, const uint32_t limit)
+{
+ setupModel(offset, limit);
+ list->onProviderDataUpdate();
+}
+
+gui::ListItem *SoundsModel::getItem(gui::Order order)
+{
+ return getRecord(order);
+}
+
+void SoundsModel::createData(app::Application *app, audio_settings::AbstractAudioSettingsModel *model)
+{
+ assert(model);
+
+ // configure according to type
+ std::filesystem::path folder = getSoundPath(model);
+
+ // iterate through selected folder and collect all sounds names
+ std::vector<std::filesystem::path> sounds;
+ if (std::filesystem::is_directory(folder)) {
+ LOG_INFO("Scanning sound folder: %s", folder.c_str());
+ for (const auto &entry : std::filesystem::directory_iterator(folder)) {
+ if (std::filesystem::is_directory(entry)) {
+ continue;
+ }
+
+ const auto &filePath = entry.path();
+ if (filePath.extension() == ".mp3")
+ sounds.push_back(filePath);
+ }
+ LOG_INFO("Found %d sounds in folder %s", static_cast<int>(sounds.size()), folder.c_str());
+ }
+ else {
+ LOG_ERROR("Cannot find directory: %s", folder.c_str());
+ }
+
+ applyItems(sounds, app, model);
+}
+
+void SoundsModel::clearData()
+{
+ list->clear();
+ list->rebuildList();
+}
+
+std::filesystem::path SoundsModel::getSoundPath(audio_settings::AbstractAudioSettingsModel *model)
+{
+ assert(model);
+ switch (model->getPlaybackType()) {
+ case audio::PlaybackType::CallRingtone:
+ return purefs::dir::getCurrentOSPath() / "assets/audio/ringtone";
+
+ case audio::PlaybackType::TextMessageRingtone:
+ return purefs::dir::getCurrentOSPath() / "assets/audio/sms";
+
+ case audio::PlaybackType::Notifications:
+ return purefs::dir::getCurrentOSPath() / "assets/audio/alarm";
+
+ default:
+ return purefs::dir::getCurrentOSPath() / "assets/audio";
+ }
+}
+
+void SoundsModel::applyItems(const std::vector<std::filesystem::path> &sounds,
+ app::Application *app,
+ audio_settings::AbstractAudioSettingsModel *model)
+{
+ std::string selectedSound = purefs::dir::getCurrentOSPath() / model->getSound();
+ for (const auto &sound : sounds) {
+ bool isSelected = false;
+ if (sound == selectedSound) {
+ isSelected = true;
+ }
+
+ std::string fileName = sound.filename();
+ std::string fileRelativePath = sound.lexically_relative(purefs::dir::getCurrentOSPath());
+
+ auto item = new gui::SettingsSoundItem(fileName, isSelected);
+
+ switch (model->getPlaybackType()) {
+
+ case audio::PlaybackType::CallRingtone:
+ case audio::PlaybackType::TextMessageRingtone:
+ case audio::PlaybackType::Notifications:
+ item->activatedCallback = [=](gui::Item &) {
+ LOG_INFO("Setting sound to %s", fileRelativePath.c_str());
+ model->setSound(fileRelativePath);
+ app->returnToPreviousWindow();
+ return true;
+ };
+ break;
+
+ default:
+ item->activatedCallback = [=](gui::Item &) {
+ app->returnToPreviousWindow();
+ return true;
+ };
+ break;
+ }
+
+ internalData.push_back(item);
+ }
+
+ for (auto item : internalData) {
+ item->deleteByList = false;
+ }
+
+ list->rebuildList();
+}
A module-apps/application-settings-new/models/SoundsModel.hpp => module-apps/application-settings-new/models/SoundsModel.hpp +46 -0
@@ 0,0 1,46 @@
+// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
+// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
+
+#pragma once
+
+#include "AbstractSoundsModel.hpp"
+#include "application-settings-new/widgets/SettingsSoundItem.hpp"
+
+#include "InternalModel.hpp"
+#include "Application.hpp"
+
+#include <Audio/decoder/Decoder.hpp>
+
+/// Simple SoundsModel
+class SoundsModel : public app::InternalModel<gui::ListItem *>, public AbstractSoundsModel
+{
+ public:
+ /// Creates data for model
+ /// @param app pointer to current application
+ /// @param model audio settings model
+ void createData(app::Application *app, audio_settings::AbstractAudioSettingsModel *model) override;
+
+ void clearData() override;
+
+ [[nodiscard]] unsigned int requestRecordsCount() override;
+
+ [[nodiscard]] unsigned int getMinimalItemHeight() const override;
+
+ gui::ListItem *getItem(gui::Order order) override;
+
+ void requestRecords(const uint32_t offset, const uint32_t limit) override;
+
+ protected:
+ /// Returns the path where sounds for specified audio settings model are stored
+ /// @param model audio settings model
+ /// @return path where sounds are stored
+ [[nodiscard]] std::filesystem::path getSoundPath(audio_settings::AbstractAudioSettingsModel *model);
+
+ /// Apply the items to internal model
+ /// @param sounds collection of sound paths
+ /// @param app pointer to current application
+ /// @param model audio settings model
+ void applyItems(const std::vector<std::filesystem::path> &sounds,
+ app::Application *app,
+ audio_settings::AbstractAudioSettingsModel *model);
+};
A module-apps/application-settings-new/widgets/SettingsSoundItem.cpp => module-apps/application-settings-new/widgets/SettingsSoundItem.cpp +38 -0
@@ 0,0 1,38 @@
+// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
+// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
+
+#include "SettingsSoundItem.hpp"
+#include "application-settings-new/data/SettingsInternals.hpp"
+
+namespace gui
+{
+
+ SettingsSoundItem::SettingsSoundItem(const std::string &soundName, bool selected)
+ {
+ setMinimumSize(style::window::default_body_width, style::window::label::big_h);
+ setMargins(Margins(0, style::margins::big, 0, 0));
+
+ mMainBox = new HBox(this, 0, 0, 0, 0);
+ mMainBox->setAlignment(Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Center));
+ mMainBox->setEdges(RectangleEdge::None);
+
+ TextFixedSize *soundTitle = new TextFixedSize(mMainBox, 0, 0, 0, 0);
+ soundTitle->setAlignment(Alignment(gui::Alignment::Horizontal::Left, gui::Alignment::Vertical::Center));
+ soundTitle->setMaximumSize(style::window::default_body_width, style::window::label::big_h);
+ soundTitle->setMargins(Margins(10, 0, 0, 0));
+ soundTitle->setEdges(RectangleEdge::All);
+ soundTitle->setUnderline(false);
+ soundTitle->setFont(style::window::font::big);
+ soundTitle->setText(soundName); // setRichText??
+
+ if (selected) {
+ mIsSelected = new gui::Image(mMainBox, 0, 0, 0, 0, "small_tick_W_M");
+ mIsSelected->setMargins(Margins(style::margins::big, 0, 0, 0));
+ }
+
+ dimensionChangedCallback = [&]([[maybe_unused]] gui::Item &item, const BoundingBox &newDim) -> bool {
+ mMainBox->setArea({0, 0, newDim.w, newDim.h});
+ return true;
+ };
+ }
+} // namespace gui
A module-apps/application-settings-new/widgets/SettingsSoundItem.hpp => module-apps/application-settings-new/widgets/SettingsSoundItem.hpp +24 -0
@@ 0,0 1,24 @@
+// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
+// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
+
+#pragma once
+
+#include <ListItem.hpp>
+#include <TextFixedSize.hpp>
+#include <ImageBox.hpp>
+
+namespace gui
+{
+ class SettingsSoundItem : public ListItem
+ {
+
+ public:
+ SettingsSoundItem(const std::string &soundName, bool selected);
+
+ private:
+ HBox *mMainBox = nullptr;
+ TextFixedSize *mSoundTitle = nullptr;
+ Image *mIsSelected = nullptr;
+ };
+
+} /* namespace gui */
M module-apps/application-settings-new/windows/CalendarWindow.cpp => module-apps/application-settings-new/windows/CalendarWindow.cpp +6 -1
@@ 3,6 3,7 @@
#include "CalendarWindow.hpp"
+#include <application-settings-new/data/SoundSelectData.hpp>
#include <application-settings-new/ApplicationSettings.hpp>
#include <i18n/i18n.hpp>
#include "BaseSettingsWindow.hpp"
@@ 55,7 56,11 @@ namespace gui
void CalendarWindow::openNoticicationSoundWindow()
{
- application->switchWindow(gui::window::name::notification_sound);
+ SoundSelectData::Info info;
+ info.windowTitle = utils::translate("app_settings_notification_sound");
+ info.audioModel = mAudioModel.get();
+
+ application->switchWindow(gui::window::name::sound_select, std::make_unique<SoundSelectData>(info));
}
} // namespace gui
D module-apps/application-settings-new/windows/CallRingtoneWindow.hpp => module-apps/application-settings-new/windows/CallRingtoneWindow.hpp +0 -26
@@ 1,26 0,0 @@
-// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
-// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
-
-#pragma once
-
-#include "BaseSettingsWindow.hpp"
-
-namespace gui
-{
- /// @brief Ring tone selection window
- class CallRingtoneWindow : public BaseSettingsWindow
- {
- public:
- /// Constructor
- /// @param app pointer to application
- CallRingtoneWindow(app::Application *app);
-
- /// Build the list of options to be drawn
- /// @return list of options
- std::list<Option> buildOptionsList() override
- {
- std::list<Option> lst;
- return lst;
- }
- };
-} // namespace gui
D module-apps/application-settings-new/windows/MessageSoundWindow.hpp => module-apps/application-settings-new/windows/MessageSoundWindow.hpp +0 -26
@@ 1,26 0,0 @@
-// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
-// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
-
-#pragma once
-
-#include "BaseSettingsWindow.hpp"
-
-namespace gui
-{
- /// @brief Message sound selection window
- class MessageSoundWindow : public BaseSettingsWindow
- {
- public:
- /// Constructor
- /// @param app pointer to application
- MessageSoundWindow(app::Application *app);
-
- /// Build the list of options to be drawn
- /// @return list of options
- std::list<Option> buildOptionsList() override
- {
- std::list<Option> lst;
- return lst;
- }
- };
-} // namespace gui
M module-apps/application-settings-new/windows/MessagesWindow.cpp => module-apps/application-settings-new/windows/MessagesWindow.cpp +7 -1
@@ 3,7 3,9 @@
#include "MessagesWindow.hpp"
+#include <application-settings-new/data/SoundSelectData.hpp>
#include <application-settings-new/ApplicationSettings.hpp>
+
#include <i18n/i18n.hpp>
#include <OptionWindow.hpp>
#include <OptionSetting.hpp>
@@ 67,7 69,11 @@ namespace gui
void MessagesWindow::openMessageSoundWindow()
{
- this->application->switchWindow(gui::window::name::message_sound);
+ SoundSelectData::Info info;
+ info.windowTitle = utils::translate("app_settings_message_sound");
+ info.audioModel = mAudioModel.get();
+
+ application->switchWindow(gui::window::name::sound_select, std::make_unique<SoundSelectData>(info));
}
void MessagesWindow::openMessageTemplates()
D module-apps/application-settings-new/windows/NotificationSoundWindow.hpp => module-apps/application-settings-new/windows/NotificationSoundWindow.hpp +0 -26
@@ 1,26 0,0 @@
-// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
-// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
-
-#pragma once
-
-#include "BaseSettingsWindow.hpp"
-
-namespace gui
-{
- /// @brief Notification sound selection window
- class NotificationSoundWindow : public BaseSettingsWindow
- {
- public:
- /// Constructor
- /// @param app pointer to application
- explicit NotificationSoundWindow(app::Application *app);
-
- /// Build the list of options to be drawn
- /// @return list of options
- std::list<Option> buildOptionsList() override
- {
- std::list<Option> lst;
- return lst;
- }
- };
-} // namespace gui
M module-apps/application-settings-new/windows/PhoneWindow.cpp => module-apps/application-settings-new/windows/PhoneWindow.cpp +6 -2
@@ 2,8 2,9 @@
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
#include "PhoneWindow.hpp"
-
+#include <application-settings-new/data/SoundSelectData.hpp>
#include <application-settings-new/ApplicationSettings.hpp>
+
#include <i18n/i18n.hpp>
#include <OptionWindow.hpp>
#include <OptionSetting.hpp>
@@ 52,7 53,10 @@ namespace gui
void PhoneWindow::openRingtoneWindow()
{
- application->switchWindow(gui::window::name::call_ringtone);
+ SoundSelectData::Info info;
+ info.windowTitle = utils::translate("app_settings_call_ringtome");
+ info.audioModel = mAudioModel.get();
+ application->switchWindow(gui::window::name::sound_select, std::make_unique<SoundSelectData>(info));
}
} // namespace gui
M module-apps/application-settings-new/windows/PhoneWindow.hpp => module-apps/application-settings-new/windows/PhoneWindow.hpp +1 -0
@@ 6,6 6,7 @@
#include "BaseSettingsWindow.hpp"
#include "OptionsWidgetMaker.hpp"
#include <application-settings-new/models/AudioSettingsModel.hpp>
+
namespace gui
{
/// @brief Phone (call) vibration and sound settings window
A module-apps/application-settings-new/windows/SoundSelectWindow.cpp => module-apps/application-settings-new/windows/SoundSelectWindow.cpp +60 -0
@@ 0,0 1,60 @@
+// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
+// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
+
+#include "SoundSelectWindow.hpp"
+#include "application-settings-new/ApplicationSettings.hpp"
+#include "application-settings-new/models/SoundsModel.hpp"
+#include "application-settings-new/widgets/SettingsSoundItem.hpp"
+#include "application-settings-new/data/SoundSelectData.hpp"
+#include <gui/widgets/ListView.hpp>
+#include <i18n/i18n.hpp>
+
+namespace gui
+{
+ SoundSelectWindow::SoundSelectWindow(app::Application *app, std::string name)
+ : AppWindow(app, name), mSoundsModel{std::make_shared<SoundsModel>()}
+ {
+ buildInterface();
+ }
+
+ void SoundSelectWindow::rebuild()
+ {
+ destroyInterface();
+ buildInterface();
+ }
+
+ void SoundSelectWindow::buildInterface()
+ {
+ AppWindow::buildInterface();
+ bottomBar->setText(BottomBar::Side::CENTER, utils::translate(style::strings::common::select));
+ bottomBar->setText(BottomBar::Side::RIGHT, utils::translate(style::strings::common::back));
+
+ mSoundsList = new gui::ListView(this,
+ style::window::default_left_margin,
+ style::header::height - 1,
+ style::listview::body_width_with_scroll,
+ style::window_height - style::header::height + 1 - style::footer::height +
+ style::margins::small,
+ mSoundsModel,
+ listview::ScrollBarType::Proportional);
+
+ setFocusItem(mSoundsList);
+ }
+
+ void SoundSelectWindow::destroyInterface()
+ {
+ erase();
+ }
+
+ void SoundSelectWindow::onBeforeShow([[maybe_unused]] ShowMode mode, SwitchData *data)
+ {
+ auto info = dynamic_cast<SoundSelectData *>(data);
+ if (info == nullptr) {
+ LOG_ERROR("Null switch data pointer!");
+ return;
+ }
+
+ setTitle(info->get().windowTitle);
+ mSoundsModel->createData(application, info->get().audioModel);
+ }
+} // namespace gui
A module-apps/application-settings-new/windows/SoundSelectWindow.hpp => module-apps/application-settings-new/windows/SoundSelectWindow.hpp +35 -0
@@ 0,0 1,35 @@
+// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
+// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
+
+#pragma once
+
+#include "application-settings-new/models/AbstractSoundsModel.hpp"
+#include "AppWindow.hpp"
+
+namespace gui
+{
+ class ListView;
+
+ /// @brief Sound selection window
+ class SoundSelectWindow : public AppWindow
+ {
+ public:
+ /// Constructor
+ /// @param app pointer to application
+ /// @param name window name
+ explicit SoundSelectWindow(app::Application *app, std::string name);
+
+ /// Called before the window is shown
+ /// @param mode show mode
+ /// @param data user switch data
+ void onBeforeShow([[maybe_unused]] ShowMode mode, SwitchData *data) override;
+
+ void rebuild() override;
+ void buildInterface() override;
+ void destroyInterface() override;
+
+ private:
+ std::shared_ptr<AbstractSoundsModel> mSoundsModel = nullptr;
+ ListView *mSoundsList = nullptr;
+ };
+} // namespace gui
M module-services/service-audio/ServiceAudio.cpp => module-services/service-audio/ServiceAudio.cpp +4 -4
@@ 30,10 30,10 @@ static constexpr auto defaultVolumeLow = "2";
static constexpr auto defaultVolumeMuted = "0";
static constexpr auto defaultTrue = "1";
static constexpr auto defaultFalse = "0";
-static constexpr auto defaultCallRingtonePath = "assets/audio/rington_drum_2.mp3";
-static constexpr auto defaultTextMessageRingtonePath = "assets/audio/sms_drum_2.mp3";
-static constexpr auto defaultNotificationsPath = "assets/audio/sms_drum_2.mp3";
-static constexpr auto defaultKeypadSoundPath = "assets/audio/sms_drum_2.mp3";
+static constexpr auto defaultCallRingtonePath = "assets/audio/ringtone/ringtone_drum_2.mp3";
+static constexpr auto defaultTextMessageRingtonePath = "assets/audio/sms/sms_drum_2.mp3";
+static constexpr auto defaultNotificationsPath = "assets/audio/alarm/alarm_hang_drum.mp3";
+static constexpr auto defaultKeypadSoundPath = "assets/audio/sms/sms_drum_2.mp3";
static constexpr std::initializer_list<std::pair<audio::DbPathElement, const char *>> cacheInitializer{