~aleteoryx/muditaos

64b4849d2085f729731d777b8259db2cd4329529 — Tomasz Krosnowski 5 years ago 58b11ee
[EGD-6452] Sound selection GUI

Sound selection GUI used to change ringtone, message sound and
notification sound in settings.
63 files changed, 494 insertions(+), 164 deletions(-)

R image/assets/audio/{ => alarm}/alarm_cymbals.mp3
R image/assets/audio/{ => alarm}/alarm_dulcimer.mp3
R image/assets/audio/{ => alarm}/alarm_guitar.mp3
R image/assets/audio/{ => alarm}/alarm_hang_drum.mp3
R image/assets/audio/{ => alarm}/alarm_koshi.mp3
R image/assets/audio/{ => alarm}/alarm_mudita_bell.mp3
R image/assets/audio/{ => ringtone}/ringtone_bowl.mp3
R image/assets/audio/{ => ringtone}/ringtone_country_guitar.mp3
R image/assets/audio/{ => ringtone}/ringtone_country_guitar_2.mp3
R image/assets/audio/{ => ringtone}/ringtone_country_guitar_3.mp3
R image/assets/audio/{ => ringtone}/ringtone_country_guitar_4.mp3
R image/assets/audio/{ => ringtone}/ringtone_cymbals.mp3
R image/assets/audio/{ => ringtone}/ringtone_drum.mp3
R image/assets/audio/{rington_drum_2 => ringtone/ringtone_drum_2}.mp3
R image/assets/audio/{ => ringtone}/ringtone_gong.mp3
R image/assets/audio/{ => ringtone}/ringtone_guitar.mp3
R image/assets/audio/{ => ringtone}/ringtone_guitar_2.mp3
R image/assets/audio/{ => ringtone}/ringtone_guitar_3.mp3
R image/assets/audio/{ => ringtone}/ringtone_guitar_4.mp3
R image/assets/audio/{ => ringtone}/ringtone_harp.mp3
R image/assets/audio/{ => ringtone}/ringtone_koshi.mp3
R image/assets/audio/{ => ringtone}/ringtone_koshi_2.mp3
R image/assets/audio/{ => ringtone}/ringtone_ukulele.mp3
R image/assets/audio/{ => sms}/sms_1_4.mp3
R image/assets/audio/{ => sms}/sms_bowl.mp3
R image/assets/audio/{ => sms}/sms_cymbals.mp3
R image/assets/audio/{ => sms}/sms_cymbals_2.mp3
R image/assets/audio/{ => sms}/sms_cymbals_3.mp3
R image/assets/audio/{ => sms}/sms_drum.mp3
R image/assets/audio/{ => sms}/sms_drum_2.mp3
R image/assets/audio/{ => sms}/sms_gong.mp3
R image/assets/audio/{ => sms}/sms_guitar.mp3
R image/assets/audio/{ => sms}/sms_guitar_2.mp3
R image/assets/audio/{ => sms}/sms_guitar_3.mp3
R image/assets/audio/{ => sms}/sms_guitar_4.mp3
R image/assets/audio/{ => sms}/sms_guitar_5.mp3
R image/assets/audio/{ => sms}/sms_harpsichord.mp3
R image/assets/audio/{ => sms}/sms_koshi.mp3
R image/assets/audio/{ => sms}/sms_koshi_2.mp3
R image/assets/audio/{ => sms}/sms_koshi_3.mp3
R image/assets/audio/{ => sms}/sms_tibetan_bowl.mp3
M module-apps/InternalModel.hpp
M module-apps/application-settings-new/ApplicationSettings.cpp
M module-apps/application-settings-new/ApplicationSettings.hpp
M module-apps/application-settings-new/CMakeLists.txt
A module-apps/application-settings-new/data/SoundSelectData.hpp
A module-apps/application-settings-new/models/AbstractSoundsModel.hpp
M module-apps/application-settings-new/models/AudioSettingsModel.cpp
M module-apps/application-settings-new/models/AudioSettingsModel.hpp
A module-apps/application-settings-new/models/SoundsModel.cpp
A module-apps/application-settings-new/models/SoundsModel.hpp
A module-apps/application-settings-new/widgets/SettingsSoundItem.cpp
A module-apps/application-settings-new/widgets/SettingsSoundItem.hpp
M module-apps/application-settings-new/windows/CalendarWindow.cpp
D module-apps/application-settings-new/windows/CallRingtoneWindow.hpp
D module-apps/application-settings-new/windows/MessageSoundWindow.hpp
M module-apps/application-settings-new/windows/MessagesWindow.cpp
D module-apps/application-settings-new/windows/NotificationSoundWindow.hpp
M module-apps/application-settings-new/windows/PhoneWindow.cpp
M module-apps/application-settings-new/windows/PhoneWindow.hpp
A module-apps/application-settings-new/windows/SoundSelectWindow.cpp
A module-apps/application-settings-new/windows/SoundSelectWindow.hpp
M module-services/service-audio/ServiceAudio.cpp
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{