From 4ba2ed15503a4fef4f2e5b55086db47d6d3dfe05 Mon Sep 17 00:00:00 2001 From: Richard Lalancette Date: Fri, 29 Jul 2016 17:03:29 -0400 Subject: [PATCH 1/4] Now loading a book screen and showing a notification --- .../assets/text/Notifications.json | 72 +++++ build/YouiEngineManifest.xml | 2 + src/CMakeLists.txt | 1 + src/app/AppController.cpp | 5 +- src/app/AppController.h | 4 +- src/app/LovecraftApp.cpp | 20 +- .../FullScreenNotificationView.cpp | 66 +++++ src/customviews/FullScreenNotificationView.h | 44 +++ src/customviews/NotificationView.cpp | 99 +++++++ src/customviews/NotificationView.h | 54 ++++ src/customviews/PopupNotificationView.cpp | 49 ++++ src/customviews/PopupNotificationView.h | 38 +++ src/list/ListItem.cpp | 156 +++++++++++ src/list/ListItem.h | 80 ++++++ src/list/ListView.cpp | 256 +++++++++++++++++ src/list/ListView.h | 184 ++++++++++++ src/list/ListViewDelegate.cpp | 38 +++ src/list/ListViewDelegate.h | 54 ++++ src/messages/Message.h | 75 +++++ src/messages/Message_inl.h | 60 ++++ src/notification/Notification.cpp | 120 ++++++++ src/notification/Notification.h | 131 +++++++++ src/notification/NotificationController.cpp | 263 ++++++++++++++++++ src/notification/NotificationController.h | 59 ++++ src/notification/NotificationModel.cpp | 187 +++++++++++++ src/notification/NotificationModel.h | 47 ++++ src/notification/Notification_inl.h | 36 +++ src/notification/Notifications.h | 28 ++ src/screen/BookScreenViewController.cpp | 67 +++++ src/screen/BookScreenViewController.h | 39 +++ src/screen/NavigationController.cpp | 3 + src/screen/NavigationInterface.h | 3 +- src/screen/ScreenViewController.cpp | 4 + src/screen/SplashScreenViewController.cpp | 18 -- src/utilities/NodeUtilities.h | 9 +- src/utilities/TimelineUtilities.cpp | 41 ++- src/utilities/TimelineUtilities.h | 17 +- 37 files changed, 2367 insertions(+), 62 deletions(-) create mode 100644 build/AndroidNative/assets/text/Notifications.json create mode 100644 src/customviews/FullScreenNotificationView.cpp create mode 100644 src/customviews/FullScreenNotificationView.h create mode 100644 src/customviews/NotificationView.cpp create mode 100644 src/customviews/NotificationView.h create mode 100644 src/customviews/PopupNotificationView.cpp create mode 100644 src/customviews/PopupNotificationView.h create mode 100644 src/list/ListItem.cpp create mode 100644 src/list/ListItem.h create mode 100644 src/list/ListView.cpp create mode 100644 src/list/ListView.h create mode 100644 src/list/ListViewDelegate.cpp create mode 100644 src/list/ListViewDelegate.h create mode 100644 src/messages/Message.h create mode 100644 src/messages/Message_inl.h create mode 100644 src/notification/Notification.cpp create mode 100644 src/notification/Notification.h create mode 100644 src/notification/NotificationController.cpp create mode 100644 src/notification/NotificationController.h create mode 100644 src/notification/NotificationModel.cpp create mode 100644 src/notification/NotificationModel.h create mode 100644 src/notification/Notification_inl.h create mode 100644 src/notification/Notifications.h create mode 100644 src/screen/BookScreenViewController.cpp create mode 100644 src/screen/BookScreenViewController.h diff --git a/build/AndroidNative/assets/text/Notifications.json b/build/AndroidNative/assets/text/Notifications.json new file mode 100644 index 0000000..e87305b --- /dev/null +++ b/build/AndroidNative/assets/text/Notifications.json @@ -0,0 +1,72 @@ +{ + "INVALID_DEEP_LINK_ERROR" : { + "type": "Error", + "title": "Invalid deep link", + "message": "Unable to reach destination link" + }, + + "APP_CONFIGURATION_ERROR" : { + "type": "Dialog", + "title": "App configuration failed", + "message": "There was a problem when the app tried to reach the server", + "action": "", + "dismiss": "" + }, + + "VSTB_SERVER_ERROR" : { + "type": "Dialog", + "title": "Server Error", + "message": "Please check your network and restart the application (%1)", + "action": "", + "dismiss": "" + }, + + "VIDEO_PLAYBACK_ERROR" : { + "type": "Error", + "title": "Error", + "message": "Video Playback Error: %1", + "autodismiss": false + }, + + "VIDEO_PLAYBACK_CHANNEL_AUTH_ERROR" : { + "type": "Error", + "title": "Channel Access Denied", + "message": "The active account does not have access to this content channel", + "autodismiss": false + }, + + "VIDEO_CONTENT_AUTH_LEVEL_ERROR" : { + "type": "Error", + "title": "Premium Content - Please Log In", + "message": "Please log in to a premium account to view this content", + "autodismiss": false + }, + + "NETWORK_CONNECTION_ERROR" : { + "type": "Error", + "title": "Network Connection Error", + "message": "Unable to reach the server" + }, + + "LOGOUT_CONFIRMATION" : { + "type": "Dialog", + "title": "Logout", + "message": "Are you sure you would like to logout of FoxPlay?", + "action": "OK", + "dismiss": "Cancel" + }, + + "LOGOUT_SUCCESS" : { + "type": "Success", + "title": "Logout succeeded", + "message": "Logout succeeded" + }, + + "LOGOUT_FAIL" : { + "type": "Error", + "title": "Logout failed", + "message": "Logout failed" + } +} + + diff --git a/build/YouiEngineManifest.xml b/build/YouiEngineManifest.xml index 2c8f697..c4d3a7d 100644 --- a/build/YouiEngineManifest.xml +++ b/build/YouiEngineManifest.xml @@ -4,6 +4,8 @@ + + diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index f6b7008..8f6fce3 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -59,6 +59,7 @@ source_group("app" REGULAR_EXPRESSION "app/.*") source_group("bridges" REGULAR_EXPRESSION "bridges/.*") source_group("customviews" REGULAR_EXPRESSION "customviews/.*") source_group("decoder" REGULAR_EXPRESSION "decoder/.*") +source_group("notification" REGULAR_EXPRESSION "notification/.*") source_group("quest" REGULAR_EXPRESSION "quest/.*") source_group("screen" REGULAR_EXPRESSION "screen/.*") source_group("utilities" REGULAR_EXPRESSION "utilities/.*") diff --git a/src/app/AppController.cpp b/src/app/AppController.cpp index 478d3c1..bba5ad3 100644 --- a/src/app/AppController.cpp +++ b/src/app/AppController.cpp @@ -11,6 +11,7 @@ const YI_UINT64 APP_INIT_RETRY_TIMER_MS = 5000; AppController::AppController(CYIApp &rApp) : m_rApp(rApp) , m_NavigationController(m_rApp) + , m_notificationController(m_rApp) { BuildStateMachine(); } @@ -54,6 +55,8 @@ void AppController::ConfigInitStateEntered() { YI_LOGD(TAG, "ConfigInitStateEntered"); + m_notificationController.Init(); + TransitionFromConfigInitToRunning(); } @@ -66,7 +69,7 @@ void AppController::RunningStateEntered() { YI_LOGD(TAG, "RunningStateEntered"); - m_NavigationController.Start(NavigationController::SPLASH); + m_NavigationController.Start(NavigationController::BOOK); } void AppController::RunningStateExited() diff --git a/src/app/AppController.h b/src/app/AppController.h index 4dac98b..52655a8 100644 --- a/src/app/AppController.h +++ b/src/app/AppController.h @@ -1,6 +1,7 @@ #ifndef _APPCONTROLLER_H_ #define _APPCONTROLLER_H_ +#include "notification/NotificationController.h" #include "screen/NavigationController.h" #include @@ -19,8 +20,6 @@ class AppController : public CYISignalHandler private: void BuildStateMachine(); - - void ConfigInitStateEntered(); void ConfigInitStateExited(); void RunningStateEntered(); @@ -35,6 +34,7 @@ class AppController : public CYISignalHandler CYISignal<> TransitionFromConfigInitToRunning; NavigationController m_NavigationController; + NotificationController m_notificationController; YI_DISALLOW_COPY_AND_ASSIGN(AppController); }; diff --git a/src/app/LovecraftApp.cpp b/src/app/LovecraftApp.cpp index a53f565..73eeed3 100644 --- a/src/app/LovecraftApp.cpp +++ b/src/app/LovecraftApp.cpp @@ -125,17 +125,8 @@ void LovecraftApp::UserUpdate() void LovecraftApp::TestsQuests() const { - //TMX loading test - tmxparser::TmxReturn error; - tmxparser::TmxMap map; - - // test from file CYIString assetPath = GetAssetsPath(); - CYIString questsPath = assetPath + "resources/" + "Quests.json"; - CYIString levelPath = assetPath + "resources/" + "test_xml_level.tmx"; - - error = tmxparser::parseFromFile(levelPath.GetData(), &map, assetPath.GetData()); QuestManager* questManager = new QuestManager(questsPath); @@ -146,6 +137,17 @@ void LovecraftApp::TestsQuests() const void LovecraftApp::TestLoadingTMX() { + //TMX loading test + tmxparser::TmxReturn error; + tmxparser::TmxMap map; + + // test from file + CYIString assetPath = GetAssetsPath(); + + CYIString levelPath = assetPath + "resources/" + "test_xml_level.tmx"; + + error = tmxparser::parseFromFile(levelPath.GetData(), &map, assetPath.GetData()); + CYIAssetLoader *pAssetLoader = CYIFramework::GetInstance()->GetAssetLoader(); CYISharedPtr pAsset = pAssetLoader->Load(YiGetTypeId(), "drawable/default/test_xml_level.tmx", YI_NULL); diff --git a/src/customviews/FullScreenNotificationView.cpp b/src/customviews/FullScreenNotificationView.cpp new file mode 100644 index 0000000..39c155c --- /dev/null +++ b/src/customviews/FullScreenNotificationView.cpp @@ -0,0 +1,66 @@ +#include "customviews/FullScreenNotificationView.h" + +#include "utilities/NodeUtilities.h" + +#include +#include + +const CYIString TAG("FullScreenNotificationView.h"); + +YI_RTTI_DEF1_INST(FullScreenNotificationView, "FullScreenNotificationView", CYISceneView) + +FullScreenNotificationView::FullScreenNotificationView() +{ +}; + +FullScreenNotificationView::~FullScreenNotificationView() +{ +}; + +bool FullScreenNotificationView::Init() +{ + return NotificationView::Init(); +} + + +void FullScreenNotificationView::ConnectButtons() +{ + Utility::GetNode(this, "Btn-Action1")->ButtonReleased.Connect(*this, &FullScreenNotificationView::DoAction); + Utility::GetNode(this, "Btn-Action2")->ButtonReleased.Connect(*this, &FullScreenNotificationView::DoDismiss); +} + +void FullScreenNotificationView::DoAction() +{ + Actioned(this); +} + +void FullScreenNotificationView::DoDismiss() +{ + NotificationView::DoDismiss(); +} + +void FullScreenNotificationView::SetActionButtonText(const CYIString &text) +{ + SetButtonText("Btn-Action1", text); +} + +void FullScreenNotificationView::SetDismissButtonText(const CYIString &text) +{ + SetButtonText("Btn-Action2", text); +} + +void FullScreenNotificationView::SetButtonText(const CYIString &button, const CYIString &text) +{ + CYIPushButtonView *pButton = Utility::GetNode(this, button); + + if(text.IsNotEmpty()) + { + pButton->Show(); + pButton->SetText(text); + Utility::GetNode(pButton, "Placeholder-Title")->SetText(text); + } + else + { + pButton->Hide(); + } +} diff --git a/src/customviews/FullScreenNotificationView.h b/src/customviews/FullScreenNotificationView.h new file mode 100644 index 0000000..ca0766d --- /dev/null +++ b/src/customviews/FullScreenNotificationView.h @@ -0,0 +1,44 @@ +#ifndef _FULLSCREEN_NOTIFICATION_VIEW_H_ +#define _FULLSCREEN_NOTIFICATION_VIEW_H_ + +#include "customviews/NotificationView.h" + +/*! + \Template for a After Effects composition representing a full screen notification. + + Full Screen Notification Template Specification + + | Type | Labels | Property | Description | + | :-------- | :----------------------- | :---------------: | :--------------------------------------------------------------- | + | Marker | In | Required | representing the animations to open the full screen notification | + | Marker | Out | Required | representing the animations to close the full screen notification | + | Node | Btn-Action1 | Required | When pressed, the signal Actioned() is emitted | + | Node | Btn-Action2 | Required | When pressed, the signal Dismissed() is emitted | + */ + +class FullScreenNotificationView : public NotificationView +{ +public: + FullScreenNotificationView(); + virtual ~FullScreenNotificationView(); + + virtual bool Init(); + + void SetActionButtonText(const CYIString &text); + void SetDismissButtonText(const CYIString &text); + + void ConnectButtons(); + + void DoAction(); + void DoDismiss(); + + CYISignal Actioned; + +private: + void SetButtonText(const CYIString &button, const CYIString &text); + + YI_DISALLOW_COPY_AND_ASSIGN(FullScreenNotificationView) + YI_TYPE_DATA +}; + +#endif // _FULLSCREEN_NOTIFICATION_VIEW_H_ diff --git a/src/customviews/NotificationView.cpp b/src/customviews/NotificationView.cpp new file mode 100644 index 0000000..a4d3c00 --- /dev/null +++ b/src/customviews/NotificationView.cpp @@ -0,0 +1,99 @@ +#include "customviews/NotificationView.h" + +#include "utilities/NodeUtilities.h" +#include "utilities/TimelineUtilities.h" + +#include +#include +#include + +const CYIString TAG("NotificationView"); + +YI_RTTI_DEF1_INST(NotificationView, "NotificationView", CYISceneView) + +NotificationView::NotificationView() +{ +} + +NotificationView::~NotificationView() +{ +} + +bool NotificationView::Init() +{ + bool bOK = CYISceneView::Init(); + + if (bOK) + { + CYITimelineGroup *pOffTimeline = TimelineUtilities::RecursiveCreateNodeParallelTimelineGroup(this, "Out"); + CYITimelineGroup *pOnTimeline = TimelineUtilities::RecursiveCreateNodeParallelTimelineGroup(this, "In"); + + m_diplayAnimationController.SetTimelines(pOnTimeline, pOffTimeline, CYIAnimationToggleController::SHARED); + m_diplayAnimationController.ResetToState(CYIAnimationToggleController::OFF); + + pOffTimeline->Completed.Connect(*this, &NotificationView::AnimationdOutEnd); + } + + return bOK; +} + +void NotificationView::SetSceneName(const CYIString &sceneName) +{ + m_sceneName = sceneName; +} + +const CYIString &NotificationView::GetSceneName() const +{ + return m_sceneName; +} + +void NotificationView::SetTitle(const CYIString &text) +{ + SetMessageText("Placeholder-Title", text); +} + +void NotificationView::SetMessage(const CYIString &text) +{ + SetMessageText("Placeholder-Description", text); +} + +void NotificationView::ShowOverlay() +{ + m_diplayAnimationController.ToggleOn(); +} + +void NotificationView::HideOverlay() +{ + m_diplayAnimationController.ToggleOff(); +} + +bool NotificationView::IsOverlayShown() +{ + return m_diplayAnimationController.GetState() == CYIAnimationToggleController::ON; +} + +void NotificationView::DoDismiss() +{ + Dismissed(this); +} + +void NotificationView::AnimationdOutEnd() +{ + AnimationdOutEnded(this); +} + +void NotificationView::SetMessageText(const CYIString &textField, const CYIString &text) +{ + CYISceneView *pMessage = Utility::GetNode(this, "Message", Utility::GET_NODE_FLAG_OPTIONAL); + + if (pMessage != YI_NULL) + { + CYITextSceneNode *pMessagePopup = Utility::GetNode(pMessage, textField); + + if (pMessagePopup != YI_NULL) + { + pMessagePopup->SetText(text); + } + } +} + diff --git a/src/customviews/NotificationView.h b/src/customviews/NotificationView.h new file mode 100644 index 0000000..df8480a --- /dev/null +++ b/src/customviews/NotificationView.h @@ -0,0 +1,54 @@ +#ifndef _NOTOFICATION_VIEW_H_ +#define _NOTOFICATION_VIEW_H_ + +#include +#include + +/*! + \Template for a After Effects composition representing a notification. + Base class for full screen and popup notifications brief + + Notification Template Specification + + | Type | Labels | Property | Description | + | :-------- | :----------------------- | :---------------: | :----------------------------------------------------------- | + | Node | Placeholder-Title | Required | ill contain the notification-specified message title | + | Node | Placeholder-Description | Required | ill contain the notification-specified message description | + */ + +class NotificationView : public CYISceneView +{ +public: + NotificationView(); + virtual ~NotificationView(); + + virtual bool Init(); + + void SetSceneName(const CYIString &sceneName); + const CYIString &GetSceneName() const; + + void SetTitle(const CYIString &text); + void SetMessage(const CYIString &text); + + void ShowOverlay(); + void HideOverlay(); + bool IsOverlayShown(); + + CYISignal Dismissed; + CYISignal AnimationdOutEnded; + +protected: + void DoDismiss(); + void AnimationdOutEnd(); + +private: + void SetMessageText(const CYIString &textField, const CYIString &text); + + CYIString m_sceneName; + CYIAnimationToggleController m_diplayAnimationController; + + YI_DISALLOW_COPY_AND_ASSIGN(NotificationView) + YI_TYPE_DATA +}; + +#endif // _NOTOFICATION_VIEW_H_ \ No newline at end of file diff --git a/src/customviews/PopupNotificationView.cpp b/src/customviews/PopupNotificationView.cpp new file mode 100644 index 0000000..c77621f --- /dev/null +++ b/src/customviews/PopupNotificationView.cpp @@ -0,0 +1,49 @@ +#include "customviews/PopupNotificationView.h" + +#include "utilities/NodeUtilities.h" + +#include +#include + +const CYIString TAG("PopupNotificationView.h"); + +YI_RTTI_DEF1_INST(PopupNotificationView, "PopupNotificationView", CYISceneView) + +PopupNotificationView::PopupNotificationView() +{ +}; + +PopupNotificationView::~PopupNotificationView() +{ +}; + +bool PopupNotificationView::Init() +{ + return NotificationView::Init(); +} + +void PopupNotificationView::SetShortTitle(const CYIString &text) +{ + CYITextSceneNode *pTitle = Utility::GetNode(this, "Placeholder-Title"); + + if (pTitle != YI_NULL) + { + pTitle->SetText(text); + } +} + +void PopupNotificationView::ConnectButtons() +{ + CYIPushButtonView *pCloseButton = Utility::GetNode(this, "Btn-Close", Utility::GET_NODE_FLAG_OPTIONAL); + + if(pCloseButton) + { + pCloseButton->ButtonReleased.Connect(*this, &PopupNotificationView::DoDismiss); + } +} + +void PopupNotificationView::DoDismiss() +{ + NotificationView::DoDismiss(); +} + diff --git a/src/customviews/PopupNotificationView.h b/src/customviews/PopupNotificationView.h new file mode 100644 index 0000000..9cfff8b --- /dev/null +++ b/src/customviews/PopupNotificationView.h @@ -0,0 +1,38 @@ +#ifndef _POPUP_NOTIFICATION_VIEW_H_ +#define _POPUP_NOTIFICATION_VIEW_H_ + +#include "customviews/NotificationView.h" + +/*! + \Template for a After Effects composition representing a popup notification. + + Popup Notification Template Specification + + | Type | Labels | Property | Description | + | :-------- | :----------------------- | :---------------: | :--------------------------------------------------------------- | + | Marker | In | Required | representing the animations to open the full screen notification | + | Marker | Out | Required | representing the animations to close the full screen notification | + | Node | Btn-Close | Required | When pressed, the signal Dismissed() is emitted | + */ + +class PopupNotificationView : public NotificationView +{ +public: + PopupNotificationView(); + virtual ~PopupNotificationView(); + + virtual bool Init(); + + void SetShortTitle(const CYIString &text); + + void ConnectButtons(); + + void DoDismiss(); + +private: + YI_DISALLOW_COPY_AND_ASSIGN(PopupNotificationView) + YI_TYPE_DATA +}; + +#endif /* _POPUP_NOTIFICATION_VIEW_H_ */ + diff --git a/src/list/ListItem.cpp b/src/list/ListItem.cpp new file mode 100644 index 0000000..519dd8c --- /dev/null +++ b/src/list/ListItem.cpp @@ -0,0 +1,156 @@ +#include "list/ListItem.h" + +#include "list/ListViewDelegate.h" +#include "list/ListView.h" + +#include + +static const CYIString TAG = "ListItem"; + +ListItem::ListItem(const CYIString &viewTemplateName) +{ + YI_ASSERT(viewTemplateName.IsNotEmpty(), TAG, "Invalid view template name"); + + SetListItemTemplate(CYIViewTemplate::GetViewTemplate(viewTemplateName)); +} + +ListItem::ListItem(const CYIString &viewTemplateName, YI_INT32 nColumnSpan, YI_INT32 nRowSpan) +{ + YI_ASSERT(viewTemplateName.IsNotEmpty(), TAG, "Invalid view template name"); + YI_ASSERT(nColumnSpan >= WIDTH_AS_COLUMN_SPAN, TAG, "Invalid column span"); + YI_ASSERT(nRowSpan >= HEIGHT_AS_ROW_SPAN, TAG, "Invalid row span"); + + CYISharedPtr pViewTemplate = CYIViewTemplate::GetViewTemplate(viewTemplateName); + + YI_ASSERT(pViewTemplate, TAG, "Invalid view template"); + + SetListItemTemplate(pViewTemplate); + + if (nColumnSpan == WIDTH_AS_COLUMN_SPAN) + { + nColumnSpan = (YI_INT32)pViewTemplate->GetTemplate()->GetWidth(); + } + + if (nRowSpan == HEIGHT_AS_ROW_SPAN) + { + nRowSpan = (YI_INT32)pViewTemplate->GetTemplate()->GetHeight(); + } + + SetCellsRect(YI_RECT_REL(0, 0, nColumnSpan, nRowSpan)); +} + +ListItem::~ListItem() +{ +} + +CYISceneView *ListItem::CreateView(CYISceneManager *pSceneManager) +{ + CYISceneView *pView = CYIListItem::CreateView(pSceneManager); + + SetFocusable(TimelineUtilities::HasViewFocusInTimelines(pView)); + + return pView; +} + +ListView *ListItem::GetListView() const +{ + return YiDynamicCast(CYIListItem::GetListView()); +} + +YI_INT32 ListItem::GetSectionIndex() const +{ + return GetListView()->GetExpandedIndices(GetIndexInList()).first; +} + +YI_INT32 ListItem::GetIndexInSection() const +{ + return GetListView()->GetExpandedIndices(GetIndexInList()).second; +} + +const CYIAny ListItem::GetData() const +{ + return m_data; +} + +void ListItem::SetData(const CYIAny &data) +{ + m_data = data; +} + +void ListItem::OnLoadIn() +{ + CYIListItem::OnLoadIn(); + + ListView *pListView = GetListView(); + ListViewDelegate *pDelegate = YI_NULL; + if (pListView && (pDelegate = pListView->m_pDelegate)) + { + pDelegate->HandleLoadInForListItem(this); + } +} + +void ListItem::OnLoadOut() +{ + CYIListItem::OnLoadOut(); + + ListView *pListView = GetListView(); + ListViewDelegate *pDelegate = YI_NULL; + if (pListView && (pDelegate = pListView->m_pDelegate)) + { + pDelegate->HandleLoadOutForListItem(this); + + if (pDelegate->ShouldDeleteViewOnLoadOutForListItem(this)) + { + delete m_pView; + m_pView = YI_NULL; + } + } +} + +void ListItem::OnStreamIn() +{ + CYIListItem::OnStreamIn(); + + ListView *pListView = GetListView(); + ListViewDelegate *pDelegate = YI_NULL; + if (pListView && (pDelegate = pListView->m_pDelegate)) + { + pDelegate->HandleStreamInForListItem(this); + } +} + +void ListItem::OnStreamOut() +{ + CYIListItem::OnStreamOut(); + + ListView *pListView = GetListView(); + ListViewDelegate *pDelegate = YI_NULL; + if (pListView && (pDelegate = pListView->m_pDelegate)) + { + pDelegate->HandleStreamOutForListItem(this); + } +} + +void ListItem::OnVisibleIn() +{ + CYIListItem::OnVisibleIn(); + + ListView *pListView = GetListView(); + ListViewDelegate *pDelegate = YI_NULL; + if (pListView && (pDelegate = pListView->m_pDelegate)) + { + pDelegate->HandleVisibleInForListItem(this); + } +} + +void ListItem::OnVisibleOut() +{ + CYIListItem::OnVisibleOut(); + + ListView *pListView = GetListView(); + ListViewDelegate *pDelegate = YI_NULL; + if (pListView && (pDelegate = pListView->m_pDelegate)) + { + pDelegate->HandleVisibleOutForListItem(this); + } +} diff --git a/src/list/ListItem.h b/src/list/ListItem.h new file mode 100644 index 0000000..54635b2 --- /dev/null +++ b/src/list/ListItem.h @@ -0,0 +1,80 @@ +#ifndef _LIST_ITEM_H_ +#define _LIST_ITEM_H_ + +#include +#include "list/ListItem.h" + +#include + +class ListView; +class ListViewDelegate; + +class ListItem : public CYIListItem +{ + friend class ListView; + +public: + + enum + { + WIDTH_AS_COLUMN_SPAN = -1, + HEIGHT_AS_ROW_SPAN = -1 + }; + + /*! + \details Constructs a list item using the view template with the given name. + */ + ListItem(const CYIString &viewTemplateName); + + /*! + \details Constructs a list item using the view template with the + given name and spanning the given number of columns and rows. + */ + ListItem(const CYIString &viewTemplateName, YI_INT32 nColumnSpan, YI_INT32 nRowSpan); + + virtual ~ListItem(); + + /*! + \details Returns the item's list. + */ + ListView *GetListView() const; + + /*! + \details Returns the section the item belongs to. + */ + YI_INT32 GetSectionIndex() const; + + /*! + \details Returns the index of the item in the section it belongs to. + */ + YI_INT32 GetIndexInSection() const; + + /*! + \details Returns the data. + */ + const CYIAny GetData() const; + + /*! + \details Sets the data. + */ + void SetData(const CYIAny &data); + +protected: + + CYISceneView *CreateView(CYISceneManager *pSceneManager); + virtual void OnLoadIn(); + virtual void OnLoadOut(); + virtual void OnVisibleIn(); + virtual void OnVisibleOut(); + virtual void OnStreamIn(); + virtual void OnStreamOut(); + +private: + + CYIAny m_data; + + YI_DISALLOW_COPY_AND_ASSIGN(ListItem) +}; + +#endif // _DELEGATING_LIST_ITEM_H_ + diff --git a/src/list/ListView.cpp b/src/list/ListView.cpp new file mode 100644 index 0000000..c6d215f --- /dev/null +++ b/src/list/ListView.cpp @@ -0,0 +1,256 @@ +#include "list/ListView.h" + +#include "list/ListItem.h" +#include "utilities/NodeUtilities.h" + +#include + +static const CYIString TAG = "ListView"; +static const YI_FLOAT s_nScrollThresholdScreenPercentage = 0.03f; // Specifies the vertical scroll threshold by a percentage amount of the screen height + +YI_RTTI_DEF1_INST(ListView, "ListView", CYIListView) + +ListView::ListView() + : m_nColumnCount(1) + , m_pDelegate(YI_NULL) + , m_fStreamRangeFactor(2.0f) + , m_bFocusFirstListItem(false) +{ + AddSection(); + + SetVisibleRangeDisabled(); +} + +ListView::~ListView() +{ + m_pDelegate = YI_NULL; +} + +bool ListView::Init() +{ + if (!CYIListView::Init()) + { + return false; + } + + YI_INT32 nColumnCount = 1; + + if (Utility::GetProperty(this, "columns", nColumnCount) && nColumnCount >= 1) + { + m_nColumnCount = nColumnCount; + } + + m_nScrollThreshold = (YI_INT32)(GetSize().y * s_nScrollThresholdScreenPercentage); + + return true; +} + +ListViewDelegate *ListView::GetDelegate() const +{ + return m_pDelegate; +} + +void ListView::SetDelegate(ListViewDelegate *pDelegate) +{ + m_pDelegate = pDelegate; +} + +bool ListView::IsEmpty() const +{ + return GetListItemCount() == 0; +} + +bool ListView::IsNotEmpty() const +{ + return !IsEmpty(); +} + +YI_INT32 ListView::GetColumnCount() const +{ + return m_nColumnCount; +} + +YI_INT32 ListView::GetSectionCount() const +{ + return static_cast(m_sectionsListItemCount.size()); +} + +YI_INT32 ListView::GetItemCountInSection(YI_INT32 nSectionIndex) const +{ + YI_ASSERT(IsSectionIndexValid(nSectionIndex, ACCESS), TAG, "Invalid section index"); + + return m_sectionsListItemCount.at(nSectionIndex); +} + +ListItem *ListView::GetItemInSection(YI_INT32 nSectionIndex, YI_INT32 nItemIndex) const +{ + YI_ASSERT(IsItemIndexValid(nSectionIndex, nItemIndex, ACCESS), TAG, "Invalid item or section index"); + + return static_cast(GetListItem(GetCollapsedIndex(nSectionIndex, nItemIndex))); +} + +ListItem *ListView::GetFirstItemInSection(YI_INT32 nSectionIndex) const +{ + return GetItemInSection(nSectionIndex, 0); +} + +ListItem *ListView::GetLastItemInSection(YI_INT32 nSectionIndex) const +{ + return GetItemInSection(nSectionIndex, GetItemCountInSection(nSectionIndex) - 1); +} + +void ListView::AddSection() +{ + m_sectionsListItemCount.push_back(0); +} + +void ListView::InsertSection(YI_INT32 nSectionIndex) +{ + YI_ASSERT(IsSectionIndexValid(nSectionIndex, INSERT), TAG, "Invalid section index"); + + m_sectionsListItemCount.insert(m_sectionsListItemCount.begin() + nSectionIndex, 0); +} + +void ListView::ClearSection(YI_INT32 nSectionIndex, bool bAnimate) +{ + YI_ASSERT(IsSectionIndexValid(nSectionIndex, ACCESS), TAG, "Invalid section index"); + + const YI_INT32 nCollapsedIndex = GetCollapsedIndex(nSectionIndex, 0); + + for (YI_INT32 nItemIndex = m_sectionsListItemCount.at(nSectionIndex) - 1; nItemIndex >= 0; --nItemIndex) + { + Remove(nCollapsedIndex + nItemIndex, bAnimate); + } + + m_sectionsListItemCount[nSectionIndex] = 0; +} + +void ListView::RemoveSection(YI_INT32 nSectionIndex, bool bAnimate) +{ + YI_ASSERT(IsSectionIndexValid(nSectionIndex, ACCESS), TAG, "Invalid section index"); + + ClearSection(nSectionIndex, bAnimate); + + m_sectionsListItemCount.erase(m_sectionsListItemCount.begin() + nSectionIndex); +} + +bool ListView::RequestFocus(CYISceneView::FOCUS_DIRECTION eDirection, const CYIAABB &previousFocusRect) +{ + if (eDirection == FOCUS_DOWN && m_bFocusFirstListItem) + { + if (GetListItemCount() > 0) + { + GetFirstVisibleItem()->GetView()->RequestFocus(); + + return true; + } + } + + return CYIListView::RequestFocus(eDirection, previousFocusRect); +} + +void ListView::Add(ListItem *pItem, YI_INT32 nSectionIndex, bool bAnimate) +{ + YI_ASSERT(IsSectionIndexValid(nSectionIndex, ACCESS), TAG, "Invalid section index"); + + SetStreamRangeFactor(pItem, m_fStreamRangeFactor); + + Insert(pItem, nSectionIndex, m_sectionsListItemCount.at(nSectionIndex), bAnimate); +} + +void ListView::Insert(ListItem *pItem, YI_INT32 nSectionIndex, YI_INT32 nItemIndex, bool bAnimate) +{ + YI_ASSERT(IsItemIndexValid(nSectionIndex, nItemIndex, INSERT), TAG, "Invalid item or section index"); + + const YI_INT32 nCollapsedIndex = GetCollapsedIndex(nSectionIndex, nItemIndex); + + CYIListView::Insert(pItem, nCollapsedIndex, bAnimate); + + m_sectionsListItemCount[nSectionIndex] += 1; +} + +void ListView::Remove(YI_INT32 nSectionIndex, YI_INT32 nItemIndex, bool bAnimate) +{ + YI_ASSERT(IsItemIndexValid(nSectionIndex, nItemIndex, ACCESS), TAG, "Invalid item or section index"); + + const YI_INT32 nCollapsedIndex = GetCollapsedIndex(nSectionIndex, nItemIndex); + + CYIListView::Remove(nCollapsedIndex, bAnimate); + + m_sectionsListItemCount[nSectionIndex] -= 1; +} + +bool ListView::IsSectionIndexValid(YI_INT32 nSectionIndex, INDEX_USED_FOR eIndexUsedFor) const +{ + return nSectionIndex >= 0 && (nSectionIndex < GetSectionCount() + (eIndexUsedFor == INSERT ? 1 : 0)); +} + +bool ListView::IsItemIndexValid(YI_INT32 nSectionIndex, YI_INT32 nItemIndex, INDEX_USED_FOR eIndexUsedFor) const +{ + return IsSectionIndexValid(nSectionIndex, ACCESS) && (nItemIndex >= 0 && nItemIndex < m_sectionsListItemCount.at(nSectionIndex) + (eIndexUsedFor == INSERT ? 1 : 0)); +} + +YI_INT32 ListView::GetCollapsedIndex(YI_INT32 nSectionIndex, YI_INT32 nItemIndex) const +{ + YI_INT32 nCollapsedIndex = nItemIndex; + + for (--nSectionIndex; nSectionIndex >= 0; --nSectionIndex) + { + nCollapsedIndex += m_sectionsListItemCount.at(nSectionIndex); + } + return nCollapsedIndex; +} + +std::pair ListView::GetExpandedIndices(YI_INT32 nCollapsedIndex) const +{ + for (YI_INT32 nSectionIndex = 0; nSectionIndex < GetSectionCount(); ++nSectionIndex) + { + nCollapsedIndex -= m_sectionsListItemCount.at(nSectionIndex); + + if (nCollapsedIndex < 0) + { + return std::make_pair(nSectionIndex, m_sectionsListItemCount.at(nSectionIndex) + nCollapsedIndex); + } + } + return std::make_pair(-1, -1); +} + +void ListView::SetStreamRangeFactor(YI_FLOAT fStreamRangeFactor) +{ + if (glm::epsilonNotEqual(m_fStreamRangeFactor, fStreamRangeFactor, glm::epsilon())) + { + m_fStreamRangeFactor = fStreamRangeFactor; + + const YI_INT32 nListItemCount = GetListItemCount(); + + if (nListItemCount > 0) + { + for (YI_INT32 nItemIndex = 0; nItemIndex < nListItemCount; ++nItemIndex) + { + SetStreamRangeFactor(GetListItem(nItemIndex), fStreamRangeFactor); + } + UpdateContents(); + } + } +} + +void ListView::SetStreamRangeFactor(CYIListItem *pItem, YI_FLOAT fStreamRangeFactor) +{ + pItem->SetLoadRangeFactor(fStreamRangeFactor); + pItem->SetStreamingRangeFactor(fStreamRangeFactor); +} + +YI_FLOAT ListView::GetStreamRangeFactor() const +{ + return m_fStreamRangeFactor; +} + +void ListView::SetFocusOnFirstListItem(bool bFocusFirstListItem) +{ + m_bFocusFirstListItem = bFocusFirstListItem; +} + +bool ListView::GetFocusOnFirstListItem() const +{ + return m_bFocusFirstListItem; +} diff --git a/src/list/ListView.h b/src/list/ListView.h new file mode 100644 index 0000000..fc2fa1b --- /dev/null +++ b/src/list/ListView.h @@ -0,0 +1,184 @@ +#ifndef _LIST_VIEW_H_ +#define _LIST_VIEW_H_ + +#include + +class ListItem; +class ListViewDelegate; + +class ListView : public CYIListView +{ + friend class ListItem; + +public: + + ListView(); + virtual ~ListView(); + + /*! + \details Initialize ListView + */ + bool Init(); + + /*! + \details Returns the delegate. + */ + ListViewDelegate *GetDelegate() const; + + /*! + \details Sets the delegate. + */ + void SetDelegate(ListViewDelegate *pDelegate); + + /*! + \details Returns true if the list is empty. + */ + bool IsEmpty() const; + + /*! + \details Returns true if the list is not empty. + */ + bool IsNotEmpty() const; + + /*! + \details Returns the number of columns. + */ + YI_INT32 GetColumnCount() const; + + /*! + \details Returns the number of sections. + */ + YI_INT32 GetSectionCount() const; + + /*! + \details Returns the number of items in the given section. + */ + YI_INT32 GetItemCountInSection(YI_INT32 nSectionIndex) const; + + /*! + \details Returns the item at the given index in the given section. + */ + ListItem *GetItemInSection(YI_INT32 nSectionIndex, YI_INT32 nItemIndex) const; + + /*! + \details Returns the first item in the given section. + */ + ListItem *GetFirstItemInSection(YI_INT32 nSectionIndex) const; + + /*! + \details Returns the last item in the given section. + */ + ListItem *GetLastItemInSection(YI_INT32 nSectionIndex) const; + + /*! + \details Adds a section to the end of the list. + */ + void AddSection(); + + /*! + \details Inserts a section at the given index. + */ + void InsertSection(YI_INT32 nSectionIndex); + + /*! + \details Removes all list items from the section at the given index. + */ + void ClearSection(YI_INT32 nSectionIndex, bool bAnimate); + + /*! + \details Removes the section at the given index. + */ + void RemoveSection(YI_INT32 nSectionIndex, bool bAnimate); + + /*! + \details Adds the given item to the given section. + */ + void Add(ListItem *pItem, YI_INT32 nSectionIndex, bool bAnimate); + + /*! + \details Inserts the given item at the given index in the given section. + */ + void Insert(ListItem *pItem, YI_INT32 nSectionIndex, YI_INT32 nItemIndex, bool bAnimate); + + /*! + \details Removes the item at the given in index in the given section. + */ + void Remove(YI_INT32 nSectionIndex, YI_INT32 nItemIndex, bool bAnimate); + + /*! + \details Sets the stream range factor to the given factor. + */ + void SetStreamRangeFactor(YI_FLOAT fStreamRangeFactor); + + /*! + \details Returns the stream range factor. + */ + YI_FLOAT GetStreamRangeFactor() const; + + /*! + \details Custom focus management so we can handle focusing the first item with certain scenarios. + This new behavior is currently using m_bFocusFirstListItem flag. + Otherwise, the list behaves normally. + */ + virtual bool RequestFocus(CYISceneView::FOCUS_DIRECTION eDirection, const CYIAABB &previousFocusRect); + + /*! + \details This allows to change the default list focus behavior. + When set, m_bFocusFirstListItem will cause the list to focus the first list item instead of the closest item. + */ + void SetFocusOnFirstListItem(bool bFocusFirstListItem); + + /*! + \see SetFocusOnFirstListItem + */ + bool GetFocusOnFirstListItem() const; + +protected: + + /*! + \details Hiding CYIListView::Add in favour of the section based Add. + */ + using CYIListView::Add; + + /*! + \details Hiding CYIListView::Insert in favour of the section based Insert. + */ + using CYIListView::Insert; + + /*! + \details Hiding CYIListView::Remove in favour of the section based Remove. + */ + using CYIListView::Remove; + +private: + + enum INDEX_USED_FOR + { + ACCESS, + INSERT + }; + + static void SetStreamRangeFactor(CYIListItem *pItem, YI_FLOAT fStreamRangeFactor); + bool IsSectionIndexValid(YI_INT32 nSectionIndex, INDEX_USED_FOR eIndexUsedFor) const; + bool IsItemIndexValid(YI_INT32 nSectionIndex, YI_INT32 nItemIndex, INDEX_USED_FOR eIndexUsedFor) const; + YI_INT32 GetCollapsedIndex(YI_INT32 nSectionIndex, YI_INT32 nItemIndex) const; + std::pair GetExpandedIndices(YI_INT32 nCollapsedIndex) const; + + YI_INT32 m_nColumnCount; + + ListViewDelegate *m_pDelegate; + + std::vector m_sectionsListItemCount; + + YI_FLOAT m_fStreamRangeFactor; + +private: + bool m_bFocusFirstListItem; + + YI_DISALLOW_COPY_AND_ASSIGN(ListView) + + YI_TYPE_DATA +}; + +#endif // _LIST_VIEW_H_ + diff --git a/src/list/ListViewDelegate.cpp b/src/list/ListViewDelegate.cpp new file mode 100644 index 0000000..07b9714 --- /dev/null +++ b/src/list/ListViewDelegate.cpp @@ -0,0 +1,38 @@ +#include "list/ListViewDelegate.h" + +ListViewDelegate::ListViewDelegate() +{ +} + +ListViewDelegate::~ListViewDelegate() +{ +} + +void ListViewDelegate::HandleStreamInForListItem(ListItem *) +{ +} + +void ListViewDelegate::HandleStreamOutForListItem(ListItem *) +{ +} + +void ListViewDelegate::HandleLoadInForListItem(ListItem *) +{ +} + +void ListViewDelegate::HandleLoadOutForListItem(ListItem *) +{ +} + +void ListViewDelegate::HandleVisibleInForListItem(ListItem *) +{ +} + +void ListViewDelegate::HandleVisibleOutForListItem(ListItem *) +{ +} + +bool ListViewDelegate::ShouldDeleteViewOnLoadOutForListItem(ListItem *) +{ + return false; +} diff --git a/src/list/ListViewDelegate.h b/src/list/ListViewDelegate.h new file mode 100644 index 0000000..a6924f3 --- /dev/null +++ b/src/list/ListViewDelegate.h @@ -0,0 +1,54 @@ +#ifndef _LIST_VIEW_DELEGATE_H_ +#define _LIST_VIEW_DELEGATE_H_ + +#include +#include + +class ListItem; + +class ListViewDelegate +{ + +public: + ListViewDelegate(); + virtual ~ListViewDelegate(); + + /*! + \details Reimplement to handle stream in for the given list item. + */ + virtual void HandleStreamInForListItem(ListItem *pItem); + + /*! + \details Reimplement to handle stream out for the given list item. + */ + virtual void HandleStreamOutForListItem(ListItem *pItem); + + /*! + \details Reimplement to handle stream in for the given list item. + */ + virtual void HandleLoadInForListItem(ListItem *pItem); + + /*! + \details Reimplement to handle stream out for the given list item. + */ + virtual void HandleLoadOutForListItem(ListItem *pItem); + + /*! + \details Reimplement to handle stream in for the given list item. + */ + virtual void HandleVisibleInForListItem(ListItem *pItem); + + /*! + \details Reimplement to handle stream out for the given list item. + */ + virtual void HandleVisibleOutForListItem(ListItem *pItem); + + /*! + \details Reimplement and return true to delete the list item's view when the item is unloaded. + */ + virtual bool ShouldDeleteViewOnLoadOutForListItem(ListItem *pItem); + +}; + +#endif // _LIST_VIEW_DELEGATE_H_ + diff --git a/src/messages/Message.h b/src/messages/Message.h new file mode 100644 index 0000000..d6c4409 --- /dev/null +++ b/src/messages/Message.h @@ -0,0 +1,75 @@ +#ifndef _MESSAGE_H_ +#define _MESSAGE_H_ + +#include + +template +class Message +{ + +public: + + /*! + \details Constructs a message with the given data. + */ + Message(const DataType &rData); + + /*! + \details Constructs a message with data constructed with the given argument. + */ + template + Message(const ArgType &rArg); + + /*! + \details Constructs a message with data constructed with the given arguments. + */ + template + Message(const Arg1Type &rArg1, const Arg2Type &rArg2); + + /*! + \details Constructs a message with data constructed with the given arguments. + */ + template + Message(const Arg1Type &rArg1, const Arg2Type &rArg2, const Arg3Type &rArg3); + + /*! + \details Destructor. + */ + virtual ~Message(); + + /*! + \details Subscribes the given object's function to this message. + */ + template + static void Subscribe(ObjectType &rObject, void (ObjectType::*pFunction)(CYISharedPtr)); + + /*! + \details Unsubscribes the given object's function from this message. + */ + template + static void Unsubscribe(ObjectType &rObject, void (ObjectType::*pFunction)(CYISharedPtr)); + + /*! + \details Sends this message to any subscribed objects. + */ + void Send(); + + /*! + \details The message's data. + */ + DataType data; + +private: + + /*! + \details Used to deliver message to subscribers. + */ + static CYISignal > SendMessage; + + YI_DISALLOW_COPY_AND_ASSIGN(Message); +}; + +#include "messages/Message_inl.h" + +#endif // _MESSAGE_H_ + diff --git a/src/messages/Message_inl.h b/src/messages/Message_inl.h new file mode 100644 index 0000000..df43524 --- /dev/null +++ b/src/messages/Message_inl.h @@ -0,0 +1,60 @@ +#ifndef _MESSAGE_INL_H_ +#define _MESSAGE_INL_H_ + +template +CYISignal > Message::SendMessage; + +template +Message::Message(const DataType &rData) + : data(rData) +{ +} + +template +template +Message::Message(const ArgType &rArg) : + data(rArg) +{ +} + +template +template +Message::Message(const Arg1Type &rArg1, const Arg2Type &rArg2) : + data(rArg1, rArg2) +{ +} + +template +template +Message::Message(const Arg1Type &rArg1, const Arg2Type &rArg2, const Arg3Type &rArg3) : + data(rArg1, rArg2, rArg3) +{ +} + +template +Message::~Message() +{ +} + +template +template +void Message::Subscribe(ObjectType &rObject, void (ObjectType::*pFunction)(CYISharedPtr)) +{ + SendMessage.Connect(rObject, pFunction); +} + +template +template +void Message::Unsubscribe(ObjectType &rObject, void (ObjectType::*pFunction)(CYISharedPtr)) +{ + SendMessage.Disconnect(rObject, pFunction); +} + +template +void Message::Send() +{ + SendMessage.Emit(CYISharedPtr(new DataType(data))); +} + +#endif // _MESSAGE_INL_H_ + diff --git a/src/notification/Notification.cpp b/src/notification/Notification.cpp new file mode 100644 index 0000000..19686d5 --- /dev/null +++ b/src/notification/Notification.cpp @@ -0,0 +1,120 @@ +#include "notification/Notification.h" + +#include "notification/NotificationModel.h" + +#include + +static const CYIString TAG = "Notification"; + +CYISharedPtr Notification::s_pModel; + +Notification::Notification(NOTIFICATION eNotification) + : m_eNotification(eNotification) + , m_actionRequestDelegate(new CYISignal<>) + , m_dismissRequestDelegate(new CYISignal<>) +{ +} + +void Notification::SetModel(const CYISharedPtr &pNotificationModel) +{ + s_pModel = pNotificationModel; +} + +NOTIFICATION Notification::GetNotificationId() const +{ + return m_eNotification; +} + +NOTIFICATION_TYPE Notification::GetType() const +{ + const CYIString type = GetDataFromModel(NotificationModel::TYPE).Get(); + if (type == "Dialog") + { + return DIALOG_NOTIFICATION_TYPE; + } + else if (type == "Success") + { + return SUCCESS_NOTIFICATION_TYPE; + } + else if (type == "Error") + { + return ERROR_NOTIFICATION_TYPE; + } + return UNKNOWN_NOTIFICATION_TYPE; +} + +CYIAny Notification::GetDataFromModel(NotificationModel::FIELD eField) const +{ + YI_ASSERT(s_pModel, TAG, "Model not initialized"); + + return s_pModel->GetData(m_eNotification, eField); +} + +CYIString Notification::GetTitle() const +{ + return GetDataFromModel(NotificationModel::TITLE).Get().Arg(m_customTitleField); +} + +void Notification::SetCustomTitleField(const CYIString &customTitleField) +{ + m_customTitleField = customTitleField; +} + +void Notification::SetCustomMessageField(const CYIString &customMessageField) +{ + m_customMessageField = customMessageField; +} + +CYIString Notification::GetMessage() const +{ + return GetDataFromModel(NotificationModel::MESSAGE).Get().Arg(m_customMessageField); +} + +CYIString Notification::GetAction() const +{ + return GetDataFromModel(NotificationModel::ACTION).Get(); +} + +CYIString Notification::GetDismiss() const +{ + return GetDataFromModel(NotificationModel::DISMISS).Get(); +} + +bool Notification::ShouldAllowAutoDismiss() const +{ + const CYIAny &autoDismiss = GetDataFromModel(NotificationModel::AUTODISMISS); + + if (!autoDismiss.Empty()) + { + return autoDismiss.Get(); + } + + // Default is to allow auto dismiss + return true; +} + +void Notification::RequestAction() +{ + m_actionRequestDelegate->Emit(); +} + +void Notification::RequestDismiss() +{ + m_dismissRequestDelegate->Emit(); +} + +void Notification::DelegateAction() +{ + if (m_actionDelegate) + { + (*m_actionDelegate)(); + } +} + +void Notification::DelegateDismiss() +{ + if (m_dismissDelegate) + { + (*m_dismissDelegate)(); + } +} diff --git a/src/notification/Notification.h b/src/notification/Notification.h new file mode 100644 index 0000000..7b2129e --- /dev/null +++ b/src/notification/Notification.h @@ -0,0 +1,131 @@ +#ifndef _NOTIFICATION_H_ +#define _NOTIFICATION_H_ + +#include "messages/Message.h" +#include "notification/NotificationModel.h" + +#include +#include + +class NotificationController; + +class Notification +{ + friend class NotificationController; + +public: + + /*! + \details Constructs an error of the given type. + */ + Notification(NOTIFICATION eNotification); + + /*! + \details Sets the model from which error properties are loaded. + */ + static void SetModel(const CYISharedPtr &pNotificationModel); + + /*! + \details Returns the notification identifier. + */ + NOTIFICATION GetNotificationId() const; + + /*! + \details Returns the type of message. + */ + NOTIFICATION_TYPE GetType() const; + + /*! + \details Returns the localized notification title. + */ + CYIString GetTitle() const; + + /*! + \details Returns the localized notification message. + */ + CYIString GetMessage() const; + + /*! + \details Set the custom title field if supported. + */ + void SetCustomTitleField(const CYIString &customTitleField); + + /*! + \details Set the custom message field if supported. + */ + void SetCustomMessageField(const CYIString &customMessageField); + + /*! + \details Returns the action text. + */ + CYIString GetAction() const; + + /*! + \details Returns the dismiss. + */ + CYIString GetDismiss() const; + + /*! + \details Returns if the popup should allow auto-dismiss. + */ + bool ShouldAllowAutoDismiss() const; + + /*! + \details Triggers an action on the notification if it is shown. + */ + void RequestAction(); + + /*! + \details Triggers a dismiss on the notification if it is shown. + */ + void RequestDismiss(); + + /*! + \details Configures the given delegate to be called when an action request is made for this error. + */ + template + void DelegateActionRequestTo(Type &object, void (Type::*pFunction)()); + + /*! + \details Configures the given delegate to be called when a dismiss request is made for this error. + */ + + template + void DelegateDismissRequestTo(Type &object, void (Type::*pFunction)()); + + /*! + \details Configures the given delegate to be called when the error calls for an action. + */ + template + void DelegateActionTo(Type &object, void (Type::*pFunction)()); + + /*! + \details Configures the given delegate to be called when the error calls for a dismiss. + */ + template + void DelegateDismissTo(Type &object, void (Type::*pFunction)()); + +private: + CYIAny GetDataFromModel(NotificationModel::FIELD eField) const; + + void DelegateAction(); + void DelegateDismiss(); + + static CYISharedPtr s_pModel; + + const NOTIFICATION m_eNotification; + + CYIString m_customTitleField; + CYIString m_customMessageField; + + CYISharedPtr > m_actionRequestDelegate; + CYISharedPtr > m_dismissRequestDelegate; + + CYISharedPtr > m_actionDelegate; + CYISharedPtr > m_dismissDelegate; +}; + +#include "notification/Notification_inl.h" + +#endif // _NOTIFICATION_H_ + diff --git a/src/notification/NotificationController.cpp b/src/notification/NotificationController.cpp new file mode 100644 index 0000000..6c3ae5d --- /dev/null +++ b/src/notification/NotificationController.cpp @@ -0,0 +1,263 @@ +#include "notification/NotificationController.h" + +#include "customviews/FullScreenNotificationView.h" +#include "customviews/PopupNotificationView.h" +#include "notification/Notification.h" +#include "utilities/SceneLayers.h" + +#include +#include +#include + +static const CYIString TAG("NotificationController"); + +static const YI_CHAR *const FULLSCREEN_ERROR_OVERLAY_SCENE_NAME = "FullscreenErrorOverlaySceneName"; +static const YI_CHAR *const POPUP_ERROR_LONG_OVERLAY_SCENE_NAME = "PopupErrorLongOverlaySceneName"; +static const YI_CHAR *const POPUP_SUCCESS_SHORT_OVERLAY_SCENE_NAME = "PopupSuccessShortOverlaySceneName"; +static const YI_INT32 NOTIFICATION_DELAY_MS = 3000; + +static inline CYIString GetErrorJSONPath(CYIApp &app) +{ + return app.GetAssetsPath() + "text/Notifications.json"; +} + +NotificationController::NotificationController(CYIApp &app) + : m_app(app) + , m_pNotificationModel(new NotificationModel(GetErrorJSONPath(app))) + , m_pPopupErrorLongOverlayView(YI_NULL) + , m_pPopupSuccessShortOverlayView(YI_NULL) + , m_pFullScreenOverlayView(YI_NULL) +{ +} + +NotificationController::~NotificationController() +{ +} + +void NotificationController::Init() +{ + LoadNotificationOverlays(); + + m_pNotificationModel->Fetch(); + Notification::SetModel(m_pNotificationModel); + Message::Subscribe(*this, &NotificationController::NotificationMessageReceived); + + m_notificationDelayTimer.SetInterval(NOTIFICATION_DELAY_MS); + m_notificationDelayTimer.TimedOut.Connect(*this, &NotificationController::CloseNotification); +} + +void NotificationController::LoadNotificationOverlays() +{ + m_pFullScreenOverlayView = LoadDialogOverlay(FULLSCREEN_ERROR_OVERLAY_SCENE_NAME, "Notifications_MainComp-Fullscreen-Error.layout"); + m_pPopupErrorLongOverlayView = LoadPopupOverlay(POPUP_ERROR_LONG_OVERLAY_SCENE_NAME, "Notifications_MainComp-Popup-Error-Long.layout"); + m_pPopupSuccessShortOverlayView = LoadPopupOverlay(POPUP_SUCCESS_SHORT_OVERLAY_SCENE_NAME, "Notifications_MainComp-Popup-Success-Short.layout"); +} + +FullScreenNotificationView *NotificationController::LoadDialogOverlay(const CYIString &sceneName, const CYIString &layoutName) +{ + CYISceneManager *pSceneManager = m_app.GetSceneManager(); + + CYISceneView *pSceneView = pSceneManager->LoadScene(layoutName, CYISceneManager::SCALE_RESPONSIVE_LAYOUT, CYISceneManager::V_ALIGN_CENTER, CYISceneManager::H_ALIGN_CENTER); + YI_ASSERT(pSceneView, TAG, "Scene manager failed to load '%s'", layoutName.GetData()); + + FullScreenNotificationView *pDialogOverlay = static_cast(pSceneView); + pDialogOverlay->Actioned.Connect(*this, &NotificationController::OverlayAction); + pDialogOverlay->Dismissed.Connect(*this, &NotificationController::OverlayDismiss); + pDialogOverlay->AnimationdOutEnded.Connect(*this,&NotificationController::OnAnimationOutEnded); + pDialogOverlay->ConnectButtons(); + + pSceneManager->AddScene(sceneName, pDialogOverlay, SceneLayers::LAYER_NOTIFICATIONS, CYISceneManager::LAYER_TRANSPARENT); + pSceneManager->UnstageScene(sceneName); + pDialogOverlay->SetSceneName(sceneName); + + return pDialogOverlay; +} + +PopupNotificationView *NotificationController::LoadPopupOverlay(const CYIString &sceneName, const CYIString &layoutName) +{ + CYISceneManager *pSceneManager = m_app.GetSceneManager(); + + CYISceneView *pSceneView = pSceneManager->LoadScene(layoutName, CYISceneManager::SCALE_RESPONSIVE_LAYOUT, CYISceneManager::V_ALIGN_CENTER, CYISceneManager::H_ALIGN_CENTER); + YI_ASSERT(pSceneView, TAG, "Scene manager failed to load '%s'", layoutName.GetData()); + + PopupNotificationView *pPopupOverlay = static_cast(pSceneView); + pPopupOverlay->Dismissed.Connect(*this, &NotificationController::OverlayDismiss); + pPopupOverlay->AnimationdOutEnded.Connect(*this,&NotificationController::OnAnimationOutEnded); + + pSceneManager->AddScene(sceneName, pPopupOverlay, SceneLayers::LAYER_NOTIFICATIONS, CYISceneManager::LAYER_TRANSPARENT); + pSceneManager->UnstageScene(sceneName); + pPopupOverlay->SetSceneName(sceneName); + + return pPopupOverlay; +} + +void NotificationController::NotificationMessageReceived(CYISharedPtr pNotification) +{ + std::deque >::const_iterator iter = m_notifications.begin(); + std::deque >::const_iterator end = m_notifications.end(); + + // Ignore the error if it has already been queued for display. + for (; iter != end; ++iter) + { + if ((*iter)->GetNotificationId() == pNotification->GetNotificationId()) + { + return; + } + } + + if (m_notifications.empty()) + { + CYIBackButtonHandler::AddListener(this); + } + + m_notifications.push_back(pNotification); + + ShowNextNotification(); +} + +void NotificationController::ShowNextNotification() +{ + if (!IsAnOverlayShown() && m_notifications.size() > 0) + { + CYISharedPtr pNotification = m_notifications.front(); + + switch (pNotification->GetType()) { + case DIALOG_NOTIFICATION_TYPE: + ShowOverlayForDialog(m_pFullScreenOverlayView, pNotification); + break; + + case SUCCESS_NOTIFICATION_TYPE: + ShowOverlayForPopup(m_pPopupSuccessShortOverlayView, pNotification); + break; + + case ERROR_NOTIFICATION_TYPE: + ShowOverlayForPopup(m_pPopupErrorLongOverlayView, pNotification); + break; + + case GENERAL_NOTIFICATION_TYPE: + case UNKNOWN_NOTIFICATION_TYPE: + default: + break; + } + } + else + { + CYIBackButtonHandler::RemoveListener(this); + } +} + +bool NotificationController::IsAnOverlayShown() const +{ + return m_pFullScreenOverlayView->IsOverlayShown() || m_pPopupErrorLongOverlayView->IsOverlayShown() || m_pPopupSuccessShortOverlayView->IsOverlayShown(); +} + +void NotificationController::ShowOverlayForDialog(FullScreenNotificationView *pDialogOverlay, const CYISharedPtr &pNotification) +{ + pDialogOverlay->SetTitle(pNotification->GetTitle()); + pDialogOverlay->SetMessage(pNotification->GetMessage()); + pDialogOverlay->SetActionButtonText(pNotification->GetAction()); + pDialogOverlay->SetDismissButtonText(pNotification->GetDismiss()); + + pNotification->DelegateActionRequestTo(*pDialogOverlay, &FullScreenNotificationView::DoAction); + pNotification->DelegateDismissRequestTo(*pDialogOverlay, &FullScreenNotificationView::DoDismiss); + + m_app.GetSceneManager()->StageScene(pDialogOverlay->GetSceneName()); + pDialogOverlay->ShowOverlay(); +} + +void NotificationController::ShowOverlayForPopup(PopupNotificationView *pPopupOverlay, const CYISharedPtr &pNotification) +{ + pPopupOverlay->SetShortTitle(pNotification->GetTitle()); + pPopupOverlay->SetMessage(pNotification->GetMessage()); + pPopupOverlay->ConnectButtons(); + pNotification->DelegateDismissRequestTo(*pPopupOverlay, &PopupNotificationView::DoDismiss); + + m_app.GetSceneManager()->StageScene(pPopupOverlay->GetSceneName()); + pPopupOverlay->ShowOverlay(); + + if(pNotification->ShouldAllowAutoDismiss()) + { + m_notificationDelayTimer.Start(); + } +} + +void NotificationController::HideOverlay(NotificationView *pNotificationOverlay) +{ + pNotificationOverlay->HideOverlay(); +} + +void NotificationController::OnAnimationOutEnded(NotificationView *pNotificationOverlay) +{ + m_app.GetSceneManager()->UnstageScene(pNotificationOverlay->GetSceneName()); +} + +void NotificationController::OverlayAction(FullScreenNotificationView *pErrorOverlay) +{ + HideOverlay(pErrorOverlay); + + if (m_notifications.size()) + { + m_notifications.front()->DelegateAction(); + m_notifications.pop_front(); + } + + ShowNextNotification(); +} + +void NotificationController::OverlayDismiss(NotificationView *pErrorOverlay) +{ + HideOverlay(pErrorOverlay); + + if (m_notifications.size()) + { + m_notifications.front()->DelegateDismiss(); + m_notifications.pop_front(); + } + + ShowNextNotification(); +} + +void NotificationController::CloseNotification() +{ + m_notificationDelayTimer.Stop(); + + if (m_pPopupSuccessShortOverlayView->IsOverlayShown()) + { + OverlayDismiss(m_pPopupSuccessShortOverlayView); + } + else if (m_pPopupErrorLongOverlayView->IsOverlayShown()) + { + OverlayDismiss(m_pPopupErrorLongOverlayView); + } +} + +bool NotificationController::OnBackButtonPressed() +{ + bool bHandled = false; + + if (m_pFullScreenOverlayView->IsOverlayShown()) + { + OverlayDismiss(m_pFullScreenOverlayView); + bHandled = true; + } + else if (m_pPopupSuccessShortOverlayView->IsOverlayShown()) + { + OverlayDismiss(m_pPopupSuccessShortOverlayView); + bHandled = true; + } + else if (m_pPopupErrorLongOverlayView->IsOverlayShown()) + { + OverlayDismiss(m_pPopupErrorLongOverlayView); + bHandled = true; + } + + return bHandled; +} + +void NotificationController::OnDeepLinkQueued() +{ + if (!m_notifications.empty() && (m_notifications.front()->GetNotificationId() != APP_CONFIGURATION_ERROR)) + { + OverlayDismiss(m_pFullScreenOverlayView); + } +} diff --git a/src/notification/NotificationController.h b/src/notification/NotificationController.h new file mode 100644 index 0000000..583647d --- /dev/null +++ b/src/notification/NotificationController.h @@ -0,0 +1,59 @@ +#ifndef _NOTIFICATION_CONTROLLER_H_ +#define _NOTIFICATION_CONTROLLER_H_ + +#include "notification/NotificationModel.h" + +#include +#include +#include +#include + +class Notification; +class NotificationView; +class FullScreenNotificationView; +class PopupNotificationView; + +class CYIApp; +class CYISceneView; + +class NotificationController : public CYISignalHandler, public CYIBackButtonHandler::Listener +{ +public: + NotificationController(CYIApp &rApp); + virtual ~NotificationController(); + + void Init(); + +private: + void LoadNotificationOverlays(); + FullScreenNotificationView *LoadDialogOverlay(const CYIString &sceneName, const CYIString &layoutName); + PopupNotificationView *LoadPopupOverlay(const CYIString &sceneName, const CYIString &layoutName); + + void ShowNextNotification(); + bool IsAnOverlayShown() const; + void ShowOverlayForDialog(FullScreenNotificationView *pDialogOverlay, const CYISharedPtr &pNotification); + void ShowOverlayForPopup(PopupNotificationView *pDialogOverlay, const CYISharedPtr &pNotification); + void HideOverlay(NotificationView *pDialogOverlay); + void OnAnimationOutEnded(NotificationView *pNotificationOverlay); + + void NotificationMessageReceived(CYISharedPtr pNotification); + void OverlayAction(FullScreenNotificationView *pDialogOverlay); + void OverlayDismiss(NotificationView *pDialogOverlay); + void CloseNotification(); + + virtual bool OnBackButtonPressed(); + void OnDeepLinkQueued(); + + CYIApp &m_app; + CYISharedPtr m_pNotificationModel; + PopupNotificationView *m_pPopupErrorLongOverlayView; + PopupNotificationView *m_pPopupSuccessShortOverlayView; + FullScreenNotificationView *m_pFullScreenOverlayView; + std::deque > m_notifications; + CYITimer m_notificationDelayTimer; + + YI_DISALLOW_COPY_AND_ASSIGN(NotificationController); +}; + +#endif // _NOTIFICATION_CONTROLLER_H_ + diff --git a/src/notification/NotificationModel.cpp b/src/notification/NotificationModel.cpp new file mode 100644 index 0000000..c816814 --- /dev/null +++ b/src/notification/NotificationModel.cpp @@ -0,0 +1,187 @@ +#include "notification/NotificationModel.h" + +#include +#include + +static const CYIString TAG = "NotificationModel"; + +NOTIFICATION NotificationModel::NotificationFromErrorString(const CYIString &rNotificationString) +{ + static std::map map; + + if (map.empty()) + { + map["INVALID_DEEP_LINK_ERROR"] = INVALID_DEEP_LINK_ERROR; + map["APP_CONFIGURATION_ERROR"] = APP_CONFIGURATION_ERROR; + map["VSTB_SERVER_ERROR"] = VSTB_SERVER_ERROR; + map["VIDEO_PLAYBACK_ERROR"] = VIDEO_PLAYBACK_ERROR; + map["VIDEO_PLAYBACK_CHANNEL_AUTH_ERROR"] = VIDEO_PLAYBACK_CHANNEL_AUTH_ERROR; + map["VIDEO_CONTENT_AUTH_LEVEL_ERROR"] = VIDEO_CONTENT_AUTH_LEVEL_ERROR; + map["NETWORK_CONNECTION_ERROR"] = NETWORK_CONNECTION_ERROR; + map["LOGOUT_CONFIRMATION"] = LOGOUT_CONFIRMATION; + map["LOGOUT_SUCCESS"] = LOGOUT_SUCCESS; + map["LOGOUT_FAIL"] = LOGOUT_FAIL; + } + + const std::map::const_iterator iter = map.find(rNotificationString); + YI_ASSERT(iter != map.end(), TAG, "Error string does not match a known error"); + + return iter->second; +} + +NotificationModel::FIELD NotificationModel::FieldFromFieldString(const CYIString &rFieldString) +{ + static std::map map; + + if (map.empty()) + { + map["type"] = TYPE; + map["title"] = TITLE; + map["message"] = MESSAGE; + map["action"] = ACTION; + map["dismiss"] = DISMISS; + map["autodismiss"] = AUTODISMISS; + } + + const std::map::const_iterator iter = map.find(rFieldString); + YI_ASSERT(iter != map.end(), TAG, "Field string does not match a known field"); + + return iter->second; +} + +CYIAny NotificationModel::DataForFieldFromValue(FIELD eField, const yi::rapidjson::Value &rValue) +{ + switch (eField) + { + case TYPE: + case TITLE: + case MESSAGE: + case ACTION: + case DISMISS: + return CYIString(rValue.GetString()); + case AUTODISMISS: + return rValue.GetBool(); + } + + return CYIAny(); +} + +NotificationModel::NotificationModel(const CYIString &rJSONPath) + : CYIAbstractDataModel(0, 0) + , m_JSONPath(rJSONPath) + , m_bHasFetched(false) +{ +} + +NotificationModel::~NotificationModel() +{ +} + +CYIAny NotificationModel::GetData(NOTIFICATION eNotification, FIELD eField) const +{ + const CYIAny data = GetItemData(GetIndex(eNotification, eField)); + + switch (eField) + { + case TYPE: + case AUTODISMISS: + break; + case TITLE: + case MESSAGE: + case ACTION: + case DISMISS: + return YiTranslate(data.Get()); + } + + return data; +} + +void NotificationModel::SetData(NOTIFICATION eNotification, FIELD eField, const CYIAny &rData) +{ + const YI_INT32 nRowCount = GetRowCount(); + if (nRowCount <= eNotification) + { + InsertRows(nRowCount, static_cast(eNotification) - nRowCount + 1); + } + + const YI_INT32 nColumnCount = GetColumnCount(); + if (nColumnCount <= eField) + { + InsertColumns(nColumnCount, static_cast(eField) - nColumnCount + 1); + } + + SetItemData(GetIndex(eNotification, eField), rData); +} + +void NotificationModel::Fetch() +{ + if (!m_bHasFetched) + { + std::FILE *pFile = std::fopen(m_JSONPath.GetData(), "rb"); + YI_ASSERT(pFile, TAG, "Could not open %s", m_JSONPath.GetData()); + + std::string string; + std::fseek(pFile, 0, SEEK_END); + string.resize(static_cast(std::ftell(pFile))); + std::fseek(pFile, 0, SEEK_SET); + std::fread(&string[0], 1, string.size(), pFile); + std::fclose(pFile); + + ParseErrors(string); + + m_bHasFetched = true; + } +} + +void NotificationModel::ParseErrors(const CYIString &rJSONString) +{ + CYIParsingError error; + yi::rapidjson::Document *pDocument = CYIRapidJSONUtility::CreateDocumentFromString(rJSONString, error); + YI_ASSERT(!error.HasError(), TAG, "Could not parse: %s", error.GetParsingErrorMessage().GetData()); + + yi::rapidjson::Value::ConstMemberIterator iter = pDocument->MemberBegin(); + yi::rapidjson::Value::ConstMemberIterator end = pDocument->MemberEnd(); + + for (; iter != end; ++iter) + { + ParseError(iter->name.GetString(), iter->value); + } + + delete pDocument; +} + +void NotificationModel::ParseError(const CYIString &rNotification, const yi::rapidjson::Value &rValue) +{ + const NOTIFICATION eNotification = NotificationFromErrorString(rNotification); + + yi::rapidjson::Value::ConstMemberIterator iter = rValue.MemberBegin(); + yi::rapidjson::Value::ConstMemberIterator end = rValue.MemberEnd(); + + const CYIString type = rValue["type"].GetString(); + + bool bCorrectTypeName = ((type == "Dialog") || (type == "Success") || (type == "Error")); + YI_ASSERT(bCorrectTypeName, TAG, "Incorrect type name: %s", type.GetData()); + + bool bIsDialogNotificationType = (type == "Dialog"); + + for (; iter != end; ++iter) + { + const FIELD eField = FieldFromFieldString(iter->name.GetString()); + const CYIAny data = DataForFieldFromValue(eField, iter->value); + + bool bInvalidField = !bIsDialogNotificationType && (eField == ACTION || eField == DISMISS); + YI_ASSERT(!bInvalidField, TAG, "Invalid field"); + + SetData(eNotification, eField, data); + } + + YI_ASSERT(!GetData(eNotification, NotificationModel::TYPE).Empty(), TAG, "Type field is not found"); + YI_ASSERT(!GetData(eNotification, NotificationModel::TITLE).Empty(), TAG, "Title field is not found"); + YI_ASSERT(!GetData(eNotification, NotificationModel::MESSAGE).Empty(), TAG, "Message field is not found"); + + if (bIsDialogNotificationType) + { + YI_ASSERT(!GetData(eNotification, NotificationModel::ACTION).Empty(), TAG, "Action field is not found"); + YI_ASSERT(!GetData(eNotification, NotificationModel::DISMISS).Empty(), TAG, "Dismiss field is not found"); + } +} diff --git a/src/notification/NotificationModel.h b/src/notification/NotificationModel.h new file mode 100644 index 0000000..9b2346d --- /dev/null +++ b/src/notification/NotificationModel.h @@ -0,0 +1,47 @@ +#ifndef _NOTIFICATION_MODEL_H_ +#define _NOTIFICATION_MODEL_H_ + +#include "notification/Notifications.h" + +#include +#include + +class NotificationModel : public CYIAbstractDataModel +{ + +public: + enum FIELD + { + TYPE, // CYIString + TITLE, // CYIString + MESSAGE, // CYIString + ACTION, // CYIString + DISMISS, // CYIString + AUTODISMISS // bool + }; + + NotificationModel(const CYIString &rJSONPath); + virtual ~NotificationModel(); + + void Fetch(); + + CYIAny GetData(NOTIFICATION eNotification, FIELD eField) const; + +private: + void SetData(NOTIFICATION eNotification, FIELD eField, const CYIAny &rData); + + void ParseErrors(const CYIString &rJSONString); + void ParseError(const CYIString &rError, const yi::rapidjson::Value &rValue); + + static NOTIFICATION NotificationFromErrorString(const CYIString &rNotificationString); + static FIELD FieldFromFieldString(const CYIString &rFieldString); + static CYIAny DataForFieldFromValue(FIELD eField, const yi::rapidjson::Value &rValue); + + const CYIString m_JSONPath; + bool m_bHasFetched; + + YI_DISALLOW_COPY_AND_ASSIGN(NotificationModel); +}; + +#endif // _NOTIFICATION_MODEL_H_ + diff --git a/src/notification/Notification_inl.h b/src/notification/Notification_inl.h new file mode 100644 index 0000000..22579d8 --- /dev/null +++ b/src/notification/Notification_inl.h @@ -0,0 +1,36 @@ +#ifndef _NOTIFICATION_INL_H_ +#define _NOTIFICATION_INL_H_ + +template +void Notification::DelegateActionRequestTo(Type &object, void (Type::*pFunction)()) +{ + m_actionRequestDelegate->Connect(object, pFunction); +} + +template +void Notification::DelegateDismissRequestTo(Type &object, void (Type::*pFunction)()) +{ + m_dismissRequestDelegate->Connect(object, pFunction); +} + +template +void Notification::DelegateActionTo(Type &object, void (Type::*pFunction)()) +{ + if (!m_actionDelegate) + { + m_actionDelegate = CYISharedPtr >(new CYISignal<>); + } + m_actionDelegate->Connect(object, pFunction); +} + +template +void Notification::DelegateDismissTo(Type &object, void (Type::*pFunction)()) +{ + if (!m_dismissDelegate) + { + m_dismissDelegate = CYISharedPtr >(new CYISignal<>); + } + m_dismissDelegate->Connect(object, pFunction); +} + +#endif // _NOTIFICATION_INL_H_ diff --git a/src/notification/Notifications.h b/src/notification/Notifications.h new file mode 100644 index 0000000..b8f1936 --- /dev/null +++ b/src/notification/Notifications.h @@ -0,0 +1,28 @@ +#ifndef _NOTIFICATIONS_H_ +#define _NOTIFICATIONS_H_ + +enum NOTIFICATION +{ + INVALID_DEEP_LINK_ERROR, + APP_CONFIGURATION_ERROR, + VSTB_SERVER_ERROR, + VIDEO_PLAYBACK_ERROR, + VIDEO_PLAYBACK_CHANNEL_AUTH_ERROR, + VIDEO_CONTENT_AUTH_LEVEL_ERROR, + NETWORK_CONNECTION_ERROR, + LOGOUT_CONFIRMATION, + LOGOUT_SUCCESS, + LOGOUT_FAIL +}; + +enum NOTIFICATION_TYPE +{ + DIALOG_NOTIFICATION_TYPE, + GENERAL_NOTIFICATION_TYPE, + SUCCESS_NOTIFICATION_TYPE, + ERROR_NOTIFICATION_TYPE, + UNKNOWN_NOTIFICATION_TYPE +}; + +#endif // _NOTIFICATIONS_H_ + diff --git a/src/screen/BookScreenViewController.cpp b/src/screen/BookScreenViewController.cpp new file mode 100644 index 0000000..00e183a --- /dev/null +++ b/src/screen/BookScreenViewController.cpp @@ -0,0 +1,67 @@ +#include "BookScreenViewController.h" + +#include "customviews/TabbedView.h" +#include "screen/TabbedViewController.h" +#include "utilities/NodeUtilities.h" + +#include +#include +#include +#include +#include +#include + +BookScreenViewController::BookScreenViewController(NavigationInterface &navigationInterface, CYIApp &app) : +TabbedScreenViewController(NavigationInterface::SPLASH, "BookScreen", "Book_Main.layout", navigationInterface, app) +, m_tabbedViewController(navigationInterface) +, m_pTabbedView(YI_NULL) +, m_pButtonBarView(YI_NULL) +{ +} + +BookScreenViewController::~BookScreenViewController() +{ +} + +void BookScreenViewController::BuildTimelines() +{ + m_pInTimeline = m_pView->BuildTimelineGroup("In"); + if (m_pInTimeline) + { + SetBeginAnimation(m_pInTimeline.Get(), TimelineHelper::ANIMATE_FORWARD); + } + + m_pOutTimeline = m_pView->BuildTimelineGroup("Out"); + if (m_pOutTimeline) + { + SetEndAnimation(m_pOutTimeline.Get(), TimelineHelper::ANIMATE_FORWARD); + } +} + +void BookScreenViewController::OnInitScreen() +{ + TabbedScreenViewController::OnInitScreen(); + + m_pButtonBarView = Utility::GetNode(m_pView, "ButtonBar", Utility::GET_NODE_FLAG_OPTIONAL); + m_pTabbedView = Utility::GetNode(m_pView, "TabbedView", Utility::GET_NODE_FLAG_OPTIONAL); + + if (m_pTabbedView) + { + m_tabbedViewController.Init(m_pTabbedView); + } +} + +void BookScreenViewController::OnPreloadValidateScreen(CYIBundle) +{ + PreloadValidateSucceeded.Emit(this); +} + +void BookScreenViewController::OnPreloadScreen(CYIBundle bundle, const CYIPersistentStore &stateData) +{ + TabbedScreenViewController::OnPreloadScreen(bundle, stateData); + + PreloadFinished(this); + + Message(NETWORK_CONNECTION_ERROR).Send(); +} + diff --git a/src/screen/BookScreenViewController.h b/src/screen/BookScreenViewController.h new file mode 100644 index 0000000..53f54a3 --- /dev/null +++ b/src/screen/BookScreenViewController.h @@ -0,0 +1,39 @@ +#ifndef _BOOK_SCREEN_VIEW_CONTROLLER_H_ +#define _BOOK_SCREEN_VIEW_CONTROLLER_H_ + +#include "customviews/ButtonBarView.h" +#include "screen/TabbedScreenViewController.h" + +#include +#include + +class TabbedView; +class ButtonBarView; +class CYITimelineGroup; + +class BookScreenViewController : public TabbedScreenViewController +{ +public: + BookScreenViewController(NavigationInterface &navigationInterface, CYIApp &app); + virtual ~BookScreenViewController(); + +protected: + virtual void OnInitScreen(); + virtual void OnPreloadValidateScreen(CYIBundle); + virtual void OnPreloadScreen(CYIBundle bundle, const CYIPersistentStore &stateData); + + virtual void BuildTimelines(); + +private: + CYIScopedPtr m_pInTimeline; + CYIScopedPtr m_pOutTimeline; + + TabbedViewController m_tabbedViewController; + TabbedView *m_pTabbedView; + ButtonBarView *m_pButtonBarView; + + YI_DISALLOW_COPY_AND_ASSIGN(BookScreenViewController) +}; + +#endif + diff --git a/src/screen/NavigationController.cpp b/src/screen/NavigationController.cpp index fcd2d59..af6e9fd 100644 --- a/src/screen/NavigationController.cpp +++ b/src/screen/NavigationController.cpp @@ -89,6 +89,9 @@ std::vector NavigationContro case SPLASH: screenHistory.push_back(TransitionBundleFor(CreateScreenViewController(SPLASH))); break; + case BOOK: + screenHistory.push_back(TransitionBundleFor(CreateScreenViewController(BOOK))); + break; } return screenHistory; diff --git a/src/screen/NavigationInterface.h b/src/screen/NavigationInterface.h index 5c44116..013c44c 100644 --- a/src/screen/NavigationInterface.h +++ b/src/screen/NavigationInterface.h @@ -10,7 +10,8 @@ class NavigationInterface : public CYISignalHandler public: enum SCREEN_ID { - SPLASH + SPLASH, + BOOK }; static const CYIString ASSET_PACKAGE_BUNDLE_KEY; diff --git a/src/screen/ScreenViewController.cpp b/src/screen/ScreenViewController.cpp index 8b44bec..f60fdb8 100644 --- a/src/screen/ScreenViewController.cpp +++ b/src/screen/ScreenViewController.cpp @@ -3,6 +3,8 @@ //#include "player/PlayerScreenViewController.h" #include "screen/ScreenViewController.h" #include "screen/SplashScreenViewController.h" +#include "screen/BookScreenViewController.h" + //#include "screen/ContentScreenViewController.h" //#include "screen/HomeLanderScreenViewController.h" //#include "screen/LoginScreenViewController.h" @@ -38,6 +40,8 @@ ScreenViewController *ScreenViewController::Create(NavigationInterface::SCREEN_I { case NavigationInterface::SPLASH: return new SplashScreenViewController(navigationController, app); + case NavigationInterface::BOOK: + return new BookScreenViewController(navigationController, app); } return YI_NULL; diff --git a/src/screen/SplashScreenViewController.cpp b/src/screen/SplashScreenViewController.cpp index 5c5ad36..380c6ba 100644 --- a/src/screen/SplashScreenViewController.cpp +++ b/src/screen/SplashScreenViewController.cpp @@ -9,25 +9,7 @@ #include #include -/* -// Load a layout file which will be the root scene view. -CYISceneView *pSceneViewMain = GetSceneManager()->LoadScene("MainNav_Main.layout", CYISceneManager::SCALE_STRETCH, CYISceneManager::V_ALIGN_CENTER, CYISceneManager::H_ALIGN_CENTER); - -if(!pSceneViewMain) -{ -YI_LOGE("LovecraftApp::UserInit", "Loading scene has failed"); -return false; -} - -pSceneViewMain->GetInTimeline()->StartForward(); - -// Add the scene view to the scene manager. -GetSceneManager()->AddScene("MainComp", pSceneViewMain, 0, CYISceneManager::LAYER_OPAQUE); -*/ - - SplashScreenViewController::SplashScreenViewController(NavigationInterface &navigationInterface, CYIApp &app) : - //TabbedScreenViewController(NavigationInterface::SPLASH, "SplashScreen", "Splash_Main.layout", navigationInterface, app) TabbedScreenViewController(NavigationInterface::SPLASH, "SplashScreen", "MainNav_Main.layout", navigationInterface, app) , m_tabbedViewController(navigationInterface) , m_pTabbedView(YI_NULL) diff --git a/src/utilities/NodeUtilities.h b/src/utilities/NodeUtilities.h index 42fb6f1..2e1e4f0 100644 --- a/src/utilities/NodeUtilities.h +++ b/src/utilities/NodeUtilities.h @@ -18,13 +18,8 @@ namespace Utility { enum GET_NODE_FLAG { - GET_NODE_FLAG_MANDATORY=0, GET_NODE_FLAG_OPTIONAL - }; - - enum test - { - BLAH, - BLAH2 + GET_NODE_FLAG_MANDATORY=0, + GET_NODE_FLAG_OPTIONAL }; const CYIString TAG("Utility"); diff --git a/src/utilities/TimelineUtilities.cpp b/src/utilities/TimelineUtilities.cpp index 1230c01..0e2dc2d 100644 --- a/src/utilities/TimelineUtilities.cpp +++ b/src/utilities/TimelineUtilities.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include static const CYIString TAG = "TimelineUtilities"; @@ -30,10 +31,10 @@ PropertyAnimationDefinition::PropertyAnimationDefinition(YI_NODE_PROPERTY_TYPE p { } -CYIAbstractTimeline *TimelineUtilities::RecursiveCreateNodeParallelTimelineGroup(CYISceneNode *pNode, CYIString markerName, YI_UINT64 timelineOffsetInms) +CYITimelineGroup *TimelineUtilities::RecursiveCreateNodeParallelTimelineGroup(CYISceneNode *pNode, CYIString markerName, YI_UINT64 nTimelineOffsetInms) { CYITimelineGroup *pGroup = new CYIParallelTimelineGroup(); - RecursiveBuildNodeParallelTimelineGroup(pGroup, pNode, markerName, timelineOffsetInms); + RecursiveBuildNodeParallelTimelineGroup(pGroup, pNode, markerName, nTimelineOffsetInms); pGroup->Finalize(); if (pGroup->GetTimelineCount() == 0) @@ -44,10 +45,20 @@ CYIAbstractTimeline *TimelineUtilities::RecursiveCreateNodeParallelTimelineGroup return pGroup; } -CYIAbstractTimeline *TimelineUtilities::RecursiveCreateNodeSerialTimelineGroup(CYISceneNode *pNode, CYIString markerName, YI_UINT64 timelineOffsetInms) +bool TimelineUtilities::HasViewFocusInTimelines(CYISceneView *pView) +{ + if (pView) + { + CYIScopedPtr pFocusInTimelineGroup(TimelineUtilities::RecursiveCreateNodeParallelTimelineGroup(pView, "FocusIn")); + return pFocusInTimelineGroup && pFocusInTimelineGroup->GetTimelineCount() > 0; + } + return false; +} + +CYITimelineGroup *TimelineUtilities::RecursiveCreateNodeSerialTimelineGroup(CYISceneNode *pNode, CYIString markerName, YI_UINT64 nTimelineOffsetInms) { CYITimelineGroup *pGroup = new CYISerialTimelineGroup(); - RecursiveBuildSerialTimelineGroup(pGroup, pNode, markerName, timelineOffsetInms); + RecursiveBuildSerialTimelineGroup(pGroup, pNode, markerName, nTimelineOffsetInms); pGroup->Finalize(); if (pGroup->GetTimelineCount() == 0) @@ -58,20 +69,20 @@ CYIAbstractTimeline *TimelineUtilities::RecursiveCreateNodeSerialTimelineGroup(C return pGroup; } -void TimelineUtilities::RecursiveBuildNodeParallelTimelineGroup(CYITimelineGroup *pGroup, CYISceneNode *pNode, CYIString markerName, YI_UINT64 timelineOffsetInms) +void TimelineUtilities::RecursiveBuildNodeParallelTimelineGroup(CYITimelineGroup *pGroup, CYISceneNode *pNode, CYIString markerName, YI_UINT64 nTimelineOffsetInms) { if (pNode || pGroup) { - AddNodeTimelineToGroup(pGroup, pNode, markerName, timelineOffsetInms); + AddNodeTimelineToGroup(pGroup, pNode, markerName, nTimelineOffsetInms); for (YI_UINT32 i = 0; i < pNode->GetChildCount(); i++) { - RecursiveBuildNodeParallelTimelineGroup(pGroup, pNode->GetChild(i), markerName, timelineOffsetInms); + RecursiveBuildNodeParallelTimelineGroup(pGroup, pNode->GetChild(i), markerName, nTimelineOffsetInms); } } } -void TimelineUtilities::AddNodeTimelineToGroup(CYITimelineGroup *pGroup, const CYISceneNode *pNode, const CYIString &markerName, YI_UINT64 timelineOffsetInms) +void TimelineUtilities::AddNodeTimelineToGroup(CYITimelineGroup *pGroup, const CYISceneNode *pNode, const CYIString &markerName, YI_UINT64 nTimelineOffsetInms) { YI_ASSERT(pNode, TAG, "pNode is null"); YI_ASSERT(pGroup, TAG, "pGroup is null"); @@ -81,13 +92,13 @@ void TimelineUtilities::AddNodeTimelineToGroup(CYITimelineGroup *pGroup, const C if (pView) { - CYIAbstractTimeline *pTimeline = GetTimeline(markerName, pView); + CYIAbstractTimeline *pTimeline = GetTimeline(pView, markerName); if (pTimeline) { - if (timelineOffsetInms > 0) + if (nTimelineOffsetInms > 0) { - pGroup->AddTimelineWithOffset(pTimeline, timelineOffsetInms); + pGroup->AddTimelineWithOffset(pTimeline, nTimelineOffsetInms); } else { @@ -97,20 +108,20 @@ void TimelineUtilities::AddNodeTimelineToGroup(CYITimelineGroup *pGroup, const C } } -void TimelineUtilities::RecursiveBuildSerialTimelineGroup(CYITimelineGroup *pGroup, CYISceneNode *pNode, CYIString markerName, YI_UINT64 timelineOffsetInms) +void TimelineUtilities::RecursiveBuildSerialTimelineGroup(CYITimelineGroup *pGroup, CYISceneNode *pNode, CYIString markerName, YI_UINT64 nTimelineOffsetInms) { if (pNode || pGroup) { - AddNodeTimelineToGroup(pGroup, pNode, markerName, timelineOffsetInms); + AddNodeTimelineToGroup(pGroup, pNode, markerName, nTimelineOffsetInms); for (YI_UINT32 i = 0; i < pNode->GetChildCount(); i++) { - RecursiveBuildNodeParallelTimelineGroup(pGroup, pNode->GetChild(i), markerName, timelineOffsetInms); + RecursiveBuildNodeParallelTimelineGroup(pGroup, pNode->GetChild(i), markerName, nTimelineOffsetInms); } } } -CYITimeline *TimelineUtilities::GetTimeline(const CYIString &markerName, CYISceneView *pSceneView) +CYITimeline *TimelineUtilities::GetTimeline(CYISceneView *pSceneView, const CYIString &markerName) { YI_ASSERT(pSceneView, TAG, "pSceneView is null"); YI_ASSERT(!markerName.IsEmpty(), TAG, "markerName is empty"); diff --git a/src/utilities/TimelineUtilities.h b/src/utilities/TimelineUtilities.h index 630da0c..90ebeb1 100644 --- a/src/utilities/TimelineUtilities.h +++ b/src/utilities/TimelineUtilities.h @@ -1,8 +1,8 @@ #ifndef _TIMELINEUTILITIES_H #define _TIMELINEUTILITIES_H +#include #include - #include class CYIAbstractTimeline; @@ -10,7 +10,6 @@ class CYIAnimationToggleController; class CYISceneNode; class CYISceneView; class CYITimeline; -class CYITimelineGroup; /*! * Definition for a property animation that will eventually be used to play an animation on a CYISceneNode @@ -58,15 +57,15 @@ namespace TimelineUtilities * \details Returns one of the engine built in interpolators. */ CYITimeInterpolator *GetTimeInterpolatorFromInterpolatorType(PropertyAnimationDefinition::eTimeInterpolatorType type); - - CYIAbstractTimeline *RecursiveCreateNodeParallelTimelineGroup(CYISceneNode *pNode, CYIString markerName, YI_UINT64 timelineOffsetInms = 0); - CYIAbstractTimeline *RecursiveCreateNodeSerialTimelineGroup(CYISceneNode *pNode, CYIString markerName, YI_UINT64 timelineOffsetInms = 0); - void RecursiveBuildNodeParallelTimelineGroup(CYITimelineGroup *pGroup, CYISceneNode *pNode, CYIString markerName, YI_UINT64 timelineOffsetInms = 0); - void RecursiveBuildSerialTimelineGroup(CYITimelineGroup *pGroup, CYISceneNode *pNode, CYIString markerName, YI_UINT64 timelineOffsetInms = 0); - CYITimeline *GetTimeline(const CYIString &markerName, CYISceneView *pSceneView); - void AddNodeTimelineToGroup(CYITimelineGroup *pGroup, const CYISceneNode *pNode, const CYIString &markerName, YI_UINT64 timelineOffsetInms = 0); + CYITimelineGroup *RecursiveCreateNodeParallelTimelineGroup(CYISceneNode *pNode, CYIString markerName, YI_UINT64 nTimelineOffsetInms = 0); + CYITimelineGroup *RecursiveCreateNodeSerialTimelineGroup(CYISceneNode *pNode, CYIString markerName, YI_UINT64 nTimelineOffsetInms = 0); + void RecursiveBuildNodeParallelTimelineGroup(CYITimelineGroup *pGroup, CYISceneNode *pNode, CYIString markerName, YI_UINT64 nTimelineOffsetInms = 0); + void RecursiveBuildSerialTimelineGroup(CYITimelineGroup *pGroup, CYISceneNode *pNode, CYIString markerName, YI_UINT64 nTimelineOffsetInms = 0); + CYITimeline *GetTimeline(CYISceneView *pSceneView, const CYIString &markerName); + void AddNodeTimelineToGroup(CYITimelineGroup *pGroup, const CYISceneNode *pNode, const CYIString &markerName, YI_UINT64 nTimelineOffsetInms = 0); CYIAnimationToggleController *BuildDirectionAnimationController(CYISceneView *pView, const CYIString &baseName); void StartPropertyAnimation(CYISceneNode *pSceneNode, PropertyAnimationDefinition propertyAnimationDefinition); + bool HasViewFocusInTimelines(CYISceneView *pView); }; #endif From ff573b0a8f4bedd4af2121c92ea8b510b06edffc Mon Sep 17 00:00:00 2001 From: Richard Lalancette Date: Fri, 29 Jul 2016 17:03:54 -0400 Subject: [PATCH 2/4] Export and UX: Loading book and notifications --- AE/Book.aep | Bin 0 -> 138125 bytes AE/MainNav.aep | Bin 3646685 -> 3646685 bytes AE/Notifications.aep | Bin 0 -> 1433363 bytes AE/assets/drawable/default/icon-heart.png | Bin 0 -> 978 bytes .../default/white-horizontal-line.png | Bin 0 -> 144 bytes AE/assets/layout/tablet/Book_Main.layout | Bin 0 -> 506 bytes AE/assets/layout/tablet/Book_Main.timeline | Bin 0 -> 1938 bytes .../layout/tablet/Book_TabbedView.layout | Bin 0 -> 121 bytes .../layout/tablet/Book_TabbedView.timeline | Bin 0 -> 4 bytes AE/assets/layout/tablet/MainNav_Main.layout | Bin 1043 -> 841 bytes AE/assets/layout/tablet/MainNav_Main.timeline | Bin 6869 -> 6840 bytes .../tablet/Notifications_Btn-Action1.layout | Bin 0 -> 786 bytes .../tablet/Notifications_Btn-Action1.timeline | Bin 0 -> 2491 bytes .../tablet/Notifications_Btn-Action2.layout | Bin 0 -> 786 bytes .../tablet/Notifications_Btn-Action2.timeline | Bin 0 -> 2491 bytes .../tablet/Notifications_Btn-Close.layout | Bin 0 -> 604 bytes .../tablet/Notifications_Btn-Close.timeline | Bin 0 -> 10168 bytes ...rMessage-Fullscreen-ButtonContainer.layout | Bin 0 -> 599 bytes ...essage-Fullscreen-ButtonContainer.timeline | Bin 0 -> 72 bytes ...tifications_ErrorMessage-Fullscreen.layout | Bin 0 -> 1005 bytes ...fications_ErrorMessage-Fullscreen.timeline | Bin 0 -> 152 bytes .../Notifications_ErrorMessage-PopUp.layout | Bin 0 -> 426 bytes .../Notifications_ErrorMessage-PopUp.timeline | Bin 0 -> 44 bytes .../Notifications_ErrorMessage-PopUp2.layout | Bin 0 -> 685 bytes ...Notifications_ErrorMessage-PopUp2.timeline | Bin 0 -> 90 bytes .../layout/tablet/Notifications_Main.layout | Bin 0 -> 2266 bytes .../layout/tablet/Notifications_Main.timeline | Bin 0 -> 454 bytes ...fications_MainComp-Fullscreen-Error.layout | Bin 0 -> 893 bytes ...cations_MainComp-Fullscreen-Error.timeline | Bin 0 -> 6104 bytes ...fications_MainComp-Popup-Error-Long.layout | Bin 0 -> 916 bytes ...cations_MainComp-Popup-Error-Long.timeline | Bin 0 -> 6093 bytes ...ications_MainComp-Popup-Error-Short.layout | Bin 0 -> 1085 bytes ...ations_MainComp-Popup-Error-Short.timeline | Bin 0 -> 6162 bytes ...ations_MainComp-Popup-Favorite-Long.layout | Bin 0 -> 1074 bytes ...ions_MainComp-Popup-Favorite-Long.timeline | Bin 0 -> 10430 bytes ...tions_MainComp-Popup-Favorite-Short.layout | Bin 0 -> 1097 bytes ...ons_MainComp-Popup-Favorite-Short.timeline | Bin 0 -> 10450 bytes ...cations_MainComp-Popup-General-Long.layout | Bin 0 -> 918 bytes ...tions_MainComp-Popup-General-Long.timeline | Bin 0 -> 6093 bytes ...ations_MainComp-Popup-General-Short.layout | Bin 0 -> 1087 bytes ...ions_MainComp-Popup-General-Short.timeline | Bin 0 -> 6162 bytes ...cations_MainComp-Popup-Success-Long.layout | Bin 0 -> 918 bytes ...tions_MainComp-Popup-Success-Long.timeline | Bin 0 -> 6093 bytes ...ations_MainComp-Popup-Success-Short.layout | Bin 0 -> 1087 bytes ...ions_MainComp-Popup-Success-Short.timeline | Bin 0 -> 6162 bytes 45 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 AE/Book.aep create mode 100644 AE/Notifications.aep create mode 100644 AE/assets/drawable/default/icon-heart.png create mode 100644 AE/assets/drawable/default/white-horizontal-line.png create mode 100644 AE/assets/layout/tablet/Book_Main.layout create mode 100644 AE/assets/layout/tablet/Book_Main.timeline create mode 100644 AE/assets/layout/tablet/Book_TabbedView.layout create mode 100644 AE/assets/layout/tablet/Book_TabbedView.timeline create mode 100644 AE/assets/layout/tablet/Notifications_Btn-Action1.layout create mode 100644 AE/assets/layout/tablet/Notifications_Btn-Action1.timeline create mode 100644 AE/assets/layout/tablet/Notifications_Btn-Action2.layout create mode 100644 AE/assets/layout/tablet/Notifications_Btn-Action2.timeline create mode 100644 AE/assets/layout/tablet/Notifications_Btn-Close.layout create mode 100644 AE/assets/layout/tablet/Notifications_Btn-Close.timeline create mode 100644 AE/assets/layout/tablet/Notifications_ErrorMessage-Fullscreen-ButtonContainer.layout create mode 100644 AE/assets/layout/tablet/Notifications_ErrorMessage-Fullscreen-ButtonContainer.timeline create mode 100644 AE/assets/layout/tablet/Notifications_ErrorMessage-Fullscreen.layout create mode 100644 AE/assets/layout/tablet/Notifications_ErrorMessage-Fullscreen.timeline create mode 100644 AE/assets/layout/tablet/Notifications_ErrorMessage-PopUp.layout create mode 100644 AE/assets/layout/tablet/Notifications_ErrorMessage-PopUp.timeline create mode 100644 AE/assets/layout/tablet/Notifications_ErrorMessage-PopUp2.layout create mode 100644 AE/assets/layout/tablet/Notifications_ErrorMessage-PopUp2.timeline create mode 100644 AE/assets/layout/tablet/Notifications_Main.layout create mode 100644 AE/assets/layout/tablet/Notifications_Main.timeline create mode 100644 AE/assets/layout/tablet/Notifications_MainComp-Fullscreen-Error.layout create mode 100644 AE/assets/layout/tablet/Notifications_MainComp-Fullscreen-Error.timeline create mode 100644 AE/assets/layout/tablet/Notifications_MainComp-Popup-Error-Long.layout create mode 100644 AE/assets/layout/tablet/Notifications_MainComp-Popup-Error-Long.timeline create mode 100644 AE/assets/layout/tablet/Notifications_MainComp-Popup-Error-Short.layout create mode 100644 AE/assets/layout/tablet/Notifications_MainComp-Popup-Error-Short.timeline create mode 100644 AE/assets/layout/tablet/Notifications_MainComp-Popup-Favorite-Long.layout create mode 100644 AE/assets/layout/tablet/Notifications_MainComp-Popup-Favorite-Long.timeline create mode 100644 AE/assets/layout/tablet/Notifications_MainComp-Popup-Favorite-Short.layout create mode 100644 AE/assets/layout/tablet/Notifications_MainComp-Popup-Favorite-Short.timeline create mode 100644 AE/assets/layout/tablet/Notifications_MainComp-Popup-General-Long.layout create mode 100644 AE/assets/layout/tablet/Notifications_MainComp-Popup-General-Long.timeline create mode 100644 AE/assets/layout/tablet/Notifications_MainComp-Popup-General-Short.layout create mode 100644 AE/assets/layout/tablet/Notifications_MainComp-Popup-General-Short.timeline create mode 100644 AE/assets/layout/tablet/Notifications_MainComp-Popup-Success-Long.layout create mode 100644 AE/assets/layout/tablet/Notifications_MainComp-Popup-Success-Long.timeline create mode 100644 AE/assets/layout/tablet/Notifications_MainComp-Popup-Success-Short.layout create mode 100644 AE/assets/layout/tablet/Notifications_MainComp-Popup-Success-Short.timeline diff --git a/AE/Book.aep b/AE/Book.aep new file mode 100644 index 0000000000000000000000000000000000000000..a815830476ac7d8da17149cfeaa57d7f018e9ea5 GIT binary patch literal 138125 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 Zn99t!Ys|=1mfl$g$5Jj|&=32@{vVi6g-HMa literal 0 HcmV?d00001 diff --git a/AE/MainNav.aep b/AE/MainNav.aep index 1f9e57c64dc152b6529b54d19594f38b609bae53..a62e605819e3bc20410ff8430999e3a688c1f857 100644 GIT binary patch delta 14255 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 delta 14270 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

umvtV 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

JrH|gbYXz%{>m>XE26m9IMzC~~6r(<%2I%+x6 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 literal 0 HcmV?d00001 diff --git a/AE/assets/drawable/default/icon-heart.png b/AE/assets/drawable/default/icon-heart.png new file mode 100644 index 0000000000000000000000000000000000000000..6c679a9354fd0b5045e01513b6f284289ddc913a GIT binary patch literal 978 zcmV;@113Mus7vm=#1&}idhUkGZV^udd70cn8U`$Z1#D3%uD{HY{J-m&`V+(yq77H z|H+aVGrkn3jl|Fd(}ZzRkWLzW7Z?vkS(qtt_iMt(n2mVx!ni0%7m3MLoUln}I!Mf1 zyqGdB3Np{V!TZKjS$BX(36ru1JP`SS6|&AZN%uKB!~Bp|4F%9t-1ju*Qc9MQ zsTM=o1V&@}L{5`$&%%DVRxuP>ei@6IoGsvaEngr*Ox)zuEJdc6xX6(rMYfozZ+iO@NJ*BsMwA5Sr&1#Uj>$(F^SM0LBakFATFj*h9_wU=KCxgMAi1IPejnETqaYlU;y8N(@b0FDJ1w ozqG`lf#0HmBY{!K1n6E)DNL6nFlI?sX2wHYsDR`|y^@kN0N&zdm;e9( literal 0 HcmV?d00001 diff --git a/AE/assets/layout/tablet/Book_Main.timeline b/AE/assets/layout/tablet/Book_Main.timeline new file mode 100644 index 0000000000000000000000000000000000000000..5f9c6d1f8c1ae2aaa90d9ee05db88eb78a9e935e GIT binary patch literal 1938 zcmZA2c}SCS7zglou3p#D&9u@j(=-VQEc6enbvQJkh?-%HFuInr)6#NWJeVn{f zx@@gZr%%>y)b9%Ql6Z{chJFF!BO;O1B9riJg-pV^DnwZ*40XkOVgmlfV}|mMkQ~HD zkM%06NE8a{h|2{%eU&!bO-=d(pkr3=Ic};n<$+53_7N3U<%4VukBN-!hd^(wVRPLN zrt}to9%@sG668lgxjkh>sz@_P8{b6~mUtZWc=6bI?*Eb*PJoWCj3w$XItfaOFcNjw zp9b~$l@i(P#h?Q79ilpC3Fx5d7m+on6m+Y@KgRvWe03RUN?Qa`hOQiB;nYN{aw|bM z&MhHYP<|eix-^L>s`UcMetI2IprabJnA=RmdtC(a&(nxLMbv=SWEzO=l*Crdee&%8mB@6)I%rB?=;6|Epz@k2tL3QHUZT5@GPks^6KXhz6u+PgA?Kd5-H zf=GNI0CZ~lcB1|w1xUOpoT#@#30j@^g6=_g{RB|S>^!2*wm{I?vwlQ2`$SOV%WS$p zH$DV`4!7*3J5}cl21PHQAB~0M>ZC~^T)U~BnzXg+HfCf>6+^dkkXMd~)o2#|e>Hs- l-dJBak}*n;ge3e5fPVGvGHHM5~xj!89&Nl!6 literal 0 HcmV?d00001 diff --git a/AE/assets/layout/tablet/Book_TabbedView.layout b/AE/assets/layout/tablet/Book_TabbedView.layout new file mode 100644 index 0000000000000000000000000000000000000000..65a226d1cddd07ca50980b0255f60e5d25005109 GIT binary patch literal 121 zcmZQ#U|`??;#?r+%I4yC%FoY^4@pc)N=*sNOf45>VEEu7%fQg!qPlvOnyV8RLdr{p s6Q~CWKG+Mw7?LoCB8-tF&c$C^oLcN$T3nK!>ztEVTr9*=QdF7>0Ah3<8~^|S literal 0 HcmV?d00001 diff --git a/AE/assets/layout/tablet/Book_TabbedView.timeline b/AE/assets/layout/tablet/Book_TabbedView.timeline new file mode 100644 index 0000000000000000000000000000000000000000..593f4708db84ac8fd0f5cc47c634f38c013fe9e4 GIT binary patch literal 4 LcmZQzU|;|M00aO5 literal 0 HcmV?d00001 diff --git a/AE/assets/layout/tablet/MainNav_Main.layout b/AE/assets/layout/tablet/MainNav_Main.layout index 42d0f00721fde7e6d2b1b5947db1f2e42d9d1543..20eed2ccd8419911dd9126464dc3da688d8d3e40 100644 GIT binary patch delta 59 zcmbQtagvRniGhKE1Bh*z85p>hvTo#WXJq=%HhBi4|Kw^WX)u#%!{i9&P9AQKdE5fb K1}PRP2@C*&k`6Nf delta 223 zcmX@fHkpH;iGhKE1BlsK7#O%tvTfvVXJl$%pFD%nUv45J7h6egMQ&n&#D6x08^T%< zT>QKY3|pK<85jzjC!Uw$a42vAvJX2?{HQTGo{7V;N|B2jsKYHYCp9lIH&sZeB(=CC zz9Kg#J}0#-HAfF9XH?H69-N$*lNz3xQj!r+lwS~%U*MRRoRME70koHeX@fu(pKoGj zo?l{FJjC|NTbMeHR5)%33ouBDqDtxIBv$5^mKa=MwRpgsz$nDcF^^k-*&xLtC4m6| Dp=v{a diff --git a/AE/assets/layout/tablet/MainNav_Main.timeline b/AE/assets/layout/tablet/MainNav_Main.timeline index 8a7bb78ce6ad183fb966ce0a4ec2796c87a9b298..795a5bc5c2867959f66690be4785b46a3b5d9939 100644 GIT binary patch delta 21 ccmca=y2F%l%SJ|XDK;GrE`k4SlcS}o08RP^ivR!s delta 50 zcmdmCdexNi;zmYuDP?I6E`k4SQfwu;6}gE8N<17)q6|PF!90PHkxK_C*}y*8PO1t3 DOPC8M diff --git a/AE/assets/layout/tablet/Notifications_Btn-Action1.layout b/AE/assets/layout/tablet/Notifications_Btn-Action1.layout new file mode 100644 index 0000000000000000000000000000000000000000..eb3588916409cd311e228862a1a22ef95ec72985 GIT binary patch literal 786 zcmb7AL2J}N6n>MnOJ-y-8!2uA!nP<#ArcpbJt(mWA{Nx8t+G;~n`CF*$e39-6YKW0 z)T?-Re~16UdM))Jdh_DZf1oqlMuHZh4`%r0dvD(R-lqY8E>E=rK;AA8>j4+ZAc;ef z@HE@@Me3}^3SV0Um<1OBzWJBmeg7P^_7KthyN!>yd4N~CEi$DAyrEcFyZPFC>)k$Q)PF&%Q&r(r6&(*4-!XN{STf3z%&!Me?sf8P=;uQ4^l?IW)=D#H?^S&9tO6_* zAi6+mF@G`QDNV)ZWJJwsG;a|#i18<}kw-%1&Wz*;v!x$kLt82JFE&s+^|rRYddE8f rxF583+5_{feu#~V+i&;fJ40J@nj~B-=+WG)p#I6=Lukgx9X2 literal 0 HcmV?d00001 diff --git a/AE/assets/layout/tablet/Notifications_Btn-Action1.timeline b/AE/assets/layout/tablet/Notifications_Btn-Action1.timeline new file mode 100644 index 0000000000000000000000000000000000000000..f3b7e731fd505cf7df41605f3878bee9d1ed26be GIT binary patch literal 2491 zcmaLZTS${(9LMqZ-I{Le;GBiFuyhxdqtZ@fQB9PH62m-P1;Nla5*F1KSyWh>n?!0^ zQWDb9ng;?|F=S;2!#RsWG(}2BnH@xfh*2R{&u=5vBl>?YzBixeeJ-Ax|KFt&1a-7h zt?{UIved2mSxVVFfqgOZbE2qTz@S5=3(L+knI+34yr@+w{#Tt+4E`#f5QLM)QV}f= zR1bULK4y%W#&C2hi)H_f#23RVql?*{XzGWJ!2K%KN)3=QJym+&VwVGz$nifR$c&a z9|EHx#&hQ8R)gF8U^K{qH!&7on#%q?Swc+>#Zm4n6i>XZrTEkDs}y&|-JsZ=dW+(^ z{M!^)+8h)gbu>_%*V#mI#^_y&*Uf3BI6lcq@yx9I6#K0%ihb2B6nkB6ik6{3~WdQqdYqghlAVh zV9!8#cG#6*=Qc3PbM0jn_=pya@?2G~2Fn6V3>sp*c4I?;C+|20MPN%(FJ?QFSEY;0 zG@J6Iz5C7il4W^L!6CE6uTR>AvvC8v&9GUg$h1gSt6rh(P-zrPg(PjVpp9cLqy#-Y POEOC)s}wpBl`Q-PQ%Ll? literal 0 HcmV?d00001 diff --git a/AE/assets/layout/tablet/Notifications_Btn-Action2.layout b/AE/assets/layout/tablet/Notifications_Btn-Action2.layout new file mode 100644 index 0000000000000000000000000000000000000000..228ba82c8c0b31e046be59235bf80d84b5757685 GIT binary patch literal 786 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 Q;~}X=0V&z&m6W6b0F{Rf761SM literal 0 HcmV?d00001 diff --git a/AE/assets/layout/tablet/Notifications_ErrorMessage-Fullscreen.timeline b/AE/assets/layout/tablet/Notifications_ErrorMessage-Fullscreen.timeline new file mode 100644 index 0000000000000000000000000000000000000000..89102d11a4a74f0091c4949153ecc405613db9b1 GIT binary patch literal 152 zcmbQjz`(#|!@(u6j#EnAwWuh+$TzjPI59m{*R3=sr#QJNH8oGyskEddKhHTouOu-u zFSSUChl5EJsE*INmkv<(dQK_vfSknS)QtR`l++?!msFtE%z~24{5&+(YCzQ+ RIHd%URflAjIOES|klM_oa^Ye=1U5kqHi+odyixbmRbp!GXLJLG0 z7(`uU85lyGRF8l3b1~{>;t~wVNlZ@7$j?bhEz%9iEXhfgn8l~?9|jn;BDnZ@85mYN zix!5?as=vSU=RWcG}r?TYp@3jG}uc)RWLBjfT&Oc2>|T^5nwI4AeJeJumusWAYBHG z7K{!IK|UM|0#Z^coFH)qh7b0FFoq6Brs-4R%XUST&RHL JM7@%dGyo71at{Ci literal 0 HcmV?d00001 diff --git a/AE/assets/layout/tablet/Notifications_ErrorMessage-PopUp.timeline b/AE/assets/layout/tablet/Notifications_ErrorMessage-PopUp.timeline new file mode 100644 index 0000000000000000000000000000000000000000..89c3a041d64f544e0ab797140ca33e342d2efe39 GIT binary patch literal 44 ycmdO3U|`@<H*=Bnni)Ai+F=kr4pQe+b$D literal 0 HcmV?d00001 diff --git a/AE/assets/layout/tablet/Notifications_ErrorMessage-PopUp2.layout b/AE/assets/layout/tablet/Notifications_ErrorMessage-PopUp2.layout new file mode 100644 index 0000000000000000000000000000000000000000..536ab78b06b8f206dee71600e0ad065229f3fbbc GIT binary patch literal 685 zcmZQ#U|`??;)P5M3|uc*xD@^JOES|klM_oa^Ye=1U5kqHi+odyixbmRbp!GXLJN#U z85}fSWEmKEoK=qtX1f^uXXFwO$Vp62&B)J5NiEWKNi9w;$}9lsm+0Y9_zwe&S`l3Q zybKI0okbnW`W%5KFfaRCr`K?G2s!Cnfgf`Q?R6Ig{3NPvL>sDgn3ET9WwnSuyg z5a9~aWx!~`=)e%tC%;^XBQ+-{ zv!FP$*r=O{OAt8(LNZHoQYCt^`@Jx97D2zyfT$qV?^2Zb{UZz9?~KIzy-I+KD>tzy zJu^?YB)>q2N!QW~Dg0;61c96Ok}!rMj3H#g!6?8fg&7M8j9HSEnemX=Q9z0wy^@kN E0DdN}H2?qr literal 0 HcmV?d00001 diff --git a/AE/assets/layout/tablet/Notifications_ErrorMessage-PopUp2.timeline b/AE/assets/layout/tablet/Notifications_ErrorMessage-PopUp2.timeline new file mode 100644 index 0000000000000000000000000000000000000000..268f1789853a38c65e2ea925ac0b4101174c161f GIT binary patch literal 90 zcmWGzU|`_V;ouVJ;gJ##$Vp62&B)J5NiEWKNi9w;$}A|!%+FKe;b0O4s$-B~p1{b+ Vr3O^p%OfR-tU4sKBqtSB9RR=Y6es`y literal 0 HcmV?d00001 diff --git a/AE/assets/layout/tablet/Notifications_Main.layout b/AE/assets/layout/tablet/Notifications_Main.layout new file mode 100644 index 0000000000000000000000000000000000000000..e6decb3dc4ffa0033ae20a893700e1571395d665 GIT binary patch literal 2266 zcmZQ#U|`??;&VWPtBIFO$S=PnGc7YYu_QA;uQ=W}F*8pTDD5iCz;M7tRpz*%t5G8( zmn2BsIX|~R*R3=sr#QJNH8oGywWuh+Na6>J!U9gM2rhnJ28IR~pk4}1rfF&!WE>;fYE}{fdSPG0r>@`1rY0Xee(0t zC4RCf{Ntv%8=4roq~PIz?1tcs{Gt+xUn~myd1&s4W=1Y)G)K6n=A{-T=0JktH;ck+ z+Pk8KkxK@LDB-sc?eI5C(=1_JXr!g1}9C zNf<*B#>i5~EdH<-b2t?umjj@(C`$u}iO34U;gF??S0!?;&e9@EDKW;vQYP4~_>F}r zg&2!pEj)_B=4#`0E?h0xU?E$M1)Ks5QhGS_pjSA0If<3|r6mRp0u~KC35-DP|G4pJ zM-Fz7+t9V!aqQ;-YS+hMJF<4LbJ6wNbG!!WH^8eOIWEx+aNwB03pBuxCCYC4`CDF@s7<6jvV{=fSxeI8w_w0usH$%<+naR literal 0 HcmV?d00001 diff --git a/AE/assets/layout/tablet/Notifications_Main.timeline b/AE/assets/layout/tablet/Notifications_Main.timeline new file mode 100644 index 0000000000000000000000000000000000000000..f1864c529e54097e7b92f6e5e515417f7a2ccfba GIT binary patch literal 454 zcmX@a$iTp*$H67=gGEZxH!(BMIX|~R*R3=sr#QJNH8oGywWuh+NQsAoNt6KyB$y{K zGJ@6rL{=Y=Ur<^AQL5{cpO=oNULR=wFBT~&xcSKHgER7rO3*YI05$w(k&;H!;GUY7 zT9lZB%?d-Hjz26?GB|YLvg9wOCBdc1$*IM~xGedHX$edRHcLS6`j4r_EwL=WD6=FL Un=M8_Ee)(vvS?m`Yr$d-07RW~Z2$lO literal 0 HcmV?d00001 diff --git a/AE/assets/layout/tablet/Notifications_MainComp-Fullscreen-Error.layout b/AE/assets/layout/tablet/Notifications_MainComp-Fullscreen-Error.layout new file mode 100644 index 0000000000000000000000000000000000000000..f027ba48058a58f13a5489fdc5f45f31eb3ad043 GIT binary patch literal 893 zcmZQ#U|`??;zDKy2Che}T*aHO`?4{6ED1ihR7(nJTfVJp?Sf(Jt7DTv$2m?k7MhAu}elG5` z%$ywEg2bZKyb>V>qxFnj?7peR#fj;u5(_yM)votRow#mmKBT#%TY znU^laWMN=b$i)_%lbMoQB(aE7VHYgOko}K6$UK~YKDrL^5fScfu!jU$#9~gPYA#{F z{NUuooK$D9lN|GsGxCch7IP{zFhQdXY`TXNp727BR1)lWk^&{9U~oc0PHAD8spVcO zoS?X6VEAA!IBO;d+_aa3F%)5pByleO(&E%&=hEVm{9Nap#NuKhmXe~<)GSqG1B>Iq z$rPFxkdm*EF~=HC0VXXZ%YarYh>C8tmxM7CK@2gmZT1EY0u~KC2@FEk9P2m*7^HNF lvO*7%91Om(TO46aU=-r!*u^QpY>;A+0yK%6qk##=0RV!V!Hoa_ literal 0 HcmV?d00001 diff --git a/AE/assets/layout/tablet/Notifications_MainComp-Fullscreen-Error.timeline b/AE/assets/layout/tablet/Notifications_MainComp-Fullscreen-Error.timeline new file mode 100644 index 0000000000000000000000000000000000000000..2f346372891f1f099c21ec5bd348423016f83008 GIT binary patch literal 6104 zcmeI0`%_e97=X`0!0rYt7YS#h2&M)Gb5P2ehU6lvMG&$Mm|ByGxZsAd!2;4CqZvfQ zXex-|tP~dqfr^P?BngEkn-vf;Mi5g`#!EIBj+dM+M0Vc&zI|QazW#&d2bl9bhx5a^ zz32Hx10_ivtW^8dtF-EbjLe+ud{bfWhEPwXOMoQ*%yr$ZP^d>emF{#8Z>7ZcP?W-s zp|E|lrzCE!!?q-C!);&LPlarU?ZrE!*m{K`6ws)y4A5_nnGp3FJ_KZ*Y(dmg@e!b) zbz_LCS}Or9ZJ$N7<>U@PJwd*4_QPjQe+($EH3X4fvjTJh)=^aE}e}4w(^#C)X`X?I! zrC2v3s*FDf$a{SWqJs6!fRb*NB3fJ4V%w{DE26~aHbAHDGX&S>^EMlTOJY0mHA7#( zF0gGsSzB+mQ)Kk%peQY>lcJdP!xV)TeNB;XZ8t?T-8~dtJAaI#Q?q>(bq9Y(QPYy| zDcYH7rD$_`KSddb1}RD&7@}y=jUOlq_8Or`6?vMXyZSMTCi2HAI{W_%>wcza{`Oxe3OqPPk;3{bMK`YBq-acao1(sXcPVO3xkpj8 z>351s_xwpwcIOO5E5>FW5#00_ClJ|QQ1Xi^p5OGghv1%%0=92ocncqbsSp=Hy6B~d zE=9QlvhJFPXjJzIpgXAnhz8Q#09_1MAnG-^1FE!6;5(|b$OBODmq!t`R44)MwSJ1I zu2uyoeewfDRjq13iiTB)D!zFXP|5XY5p6l?2}rlf15w@uFF+kd!!h;;J!{$<(EWiL zL~s0~0rYm;azuKKFQ5e$S47L6@&lyrtzK+DR`f!DKuOcCh$0i_0Mgv?coFu33$b!# z03etY5gw`UW@H)*-ctw3bEiS2^+++8%^BGSGIT~@=s0RP4jh0V$2oEM2z5>z+q3MP zIQB=z=mBxWSN52F~ytrQ~R}O2vbDlbBGhkfd?l zPWiW7JK(T(1P;rGxF_WQ;}s-H;I2H=$Bzm3ENEUtOh+}f5zXs}>2qndMDtQ&df7+? z(Y%_N-gP98XkJiEm+XIyXkJrHN2p?n=4Hin&e<@cd1W#E{-i(AyttT_++2v}^~H2@ z`qcz>CG2O7ml)H}oBN68Gm`15xUY!jg~s%veHNm5tuZ}+O(oI1+?cK#FD9B-9Mk>A zOrm+wF`W>TPBgDOrUyfliRPupbdVy^LBlx!sjdd#4SgK-;)hgCluwsohE7n-H zVvXM%VvWTs)>yw{jU_DBSjA$Eg)G)s%VLe?EY?`jVvR*D)>zkKjioKtSlwcc1uoY3 zZ6wxM=3!iY)$mfos()D9hO#`IS!famla<##dsh~2JnrzWWOLb8 z{!ClC)nowiRRE@6T^&g@UlCxs=uJJ*e06~7yq9x{<|_qE>pIJb=HGBk=gjOTny(-* zJ?MXcXug`jbf2b~Xuh(*^tRb{qWLNV)6-L3MDrB~rk}fVjA*|4z;w{9<3#h72&T>2 z0iyY;1k;C&!$k8H3Z^};{YW%ltzh~@)oG&n$_3M_i^quOs~AilvYc_ya1-K+2D{Ph zUxpD%y~%7WFq(4J;qu33lS=Eq+?1A?vB{t_7qbAuCfda2V7KTjvKlfm2z=8B_?O57v-1crAYkaR+zz~6~V>N%iwUr8L0My z6HqM!gAh=Fp}`&~&|nV~Xt0+83OtZ@0SYL&fK@1gR4_1rjAsA~=z>_LAi@?zxV{Oj zus2||V02)JXyh^4$jHU+n_66)n4T)}pIe~^YAM4?kfl9%EIlAWilrc%;g(iOa9__fp{mISZH|>;-4d1c96Ok}!rM zjFBYH#a~*STI^g}T#}#boRe5wEW}b$RGONlh-_eSJUBf<;~$hnLkojA#;u%9svd^4OBz1 x*sBLg5(Z0IEqWLe7=?5>=7BWIp=yM?2B!Q3qs0l3a&C?}JOa!HDHbUS3;;Gw&>H{% literal 0 HcmV?d00001 diff --git a/AE/assets/layout/tablet/Notifications_MainComp-Popup-Error-Long.timeline b/AE/assets/layout/tablet/Notifications_MainComp-Popup-Error-Long.timeline new file mode 100644 index 0000000000000000000000000000000000000000..ce0528e1a835ea9f160f5f99ef3d13999c59436c GIT binary patch literal 6093 zcmeI0{Zmv`7{~90V3%ci%?)SUB$y@{%t4)Tra=W{!IDB2!5nKOd0A);SYa2?fDsJB zF<(%mEV9T?u!Mb*0SQfNUhpSCnMs9t=iX32dX79S+0gPBH{XEUuFF48P}3j!>&UVKN_(Ou9xnV;#y@n63|6s9iTrS zurkzdeg%+iq>Z7rhV6h18-^I#*S-T#Qs*Q?RcCer>NAAIyOz%%+YP9sJ%S-q&|W}2 zZ!KUbc3~5sZ-U|&dL*M6&}U&O3iOp#K+o!I47JWV1Sr)}!O)I`!+-*FDjBlp908Q_M>RuPb#2a3o3}FboDVT|hUUB$?1xQ5ZXxSudGZukYG`P+WQDD3bkMzZ5~ zjBZ>X$7sm!CPt^`-NvXr^$tc&*1s^S-upL31>F-Er4LQcM6l_v3^U|Bpp=6ufo^)| zLvSZphU=S`pJxxjXoMFaV{8&bR~LB$a_pJM&_&~YfNrJf7#hg*0dyrwW~krn3uuR9 zn4MAG#~7+QqXlGK zt753+asZ&N^0Uia4|@JsAfV}iW`>@d3IepTV--WDpb$U{TD%!bemE46slREdYpvLY z_XA29^JXX}aTcJUTdE~63Vw(+Yjl91QbeoLHf85p>{~Q*l!{ZM)%zvdi{~2)tu|b9 zE7?!gG$w@)#`mS3N3l& zQWSH}&QeP=tzIqjdQ+2BFH2HY(k|t{l6b(e#3OJl{UG;{GLI%9Wr(uo(F!|V6ZR}< znu>_tGg*W*O-Mu+Eq(!MnwE$@K9z$sO-@8NCTAf{QxwrFC)XiO6BW^B!!tQJ(yq``4wN z8;z$xH|N@iJP`^tPlrOylcG@b)F{-vmJ2mclS0jtrBL&fDbzf13N=rkLd}z?Q1etO z)I6aIHBYNT&6BH8^As!8Jkbg@Pq#wN-#LVur(U7v30SCk8Ww7vjD?z~WTEDXS*Uq> z7HXcPg_@^oq2>u&sCn8JYM#7>nx}A~=I=&A&C|J1^Q11+JhcloPw+y`)BJxl9BMq- zyJ=@pR*EwTo22l%9e6bHle2Qkc3dN9`X@TiYZW?(X(xc_+S3_G)2;x~$ucgTv_nAj z#uMw&Y}zd#y4wqvZTb#JbnB01G@Eu2h_>Zfkft34qK~~=h&1gk5N%j*MVfXRh;AP) zL7H|Qh<-l=zs=AN1ku0UD?_tsH-hN#mI|b4XM*VbyPJ`wT?(SpLtjFgb}WdV7{!`) zFNj`USBYlRP6pAYk(nAcA?s?mzu`rzO;(%5Zm|}J&J9rJ#zP5?(|fHfj`UGa`v?0f fA2nL%N3Awkijp3eLZg&{QUV$1omOW5-;w_Uv>Y_e literal 0 HcmV?d00001 diff --git a/AE/assets/layout/tablet/Notifications_MainComp-Popup-Error-Short.layout b/AE/assets/layout/tablet/Notifications_MainComp-Popup-Error-Short.layout new file mode 100644 index 0000000000000000000000000000000000000000..f511d85471cd3364a88bbc1c4bf9f1f2315e5e37 GIT binary patch literal 1085 zcma)5O>fgc5M8HHLe1XR0s_pk$Ol>ylGsvUe{ie zmXpPWbC2{;!7m|gK}71MSAIh|aN)!Oc0=4+qEuPQtMSu#-prfl7yy8$Pd*NS@GBuK zJi^54SZ#w?*!G&MhGm!WmZR3N<2!2Ab+N0~yVxaZ`cd@;0R77C>tFNLf-eZV(SEhz zV&671pG4(ETxa@h*3f91(tfg^T8TAG087Iut zkkN)+j7;dNPc4FA=1^3Ahld*tPbb-aw!b`_?wG@0w6V6rgOn`aN-_w5 zAKFY9WW!)C4CZH6q3I*zu?^KVxIrU#0pxzhi+5^VgX?ls$TwMGiohMB;@8maAl#F9 zh>+!YmRHyo5_M$JIWtG1avBO8-O;6!froSjrR3-F*2>H<68KmwyyXPB-Zl_?VVR^` zbFrgiLh#nI-KOTt9E(a28!60Ku3R(-n7#UAD;)Nrr-!DG{t(YC*jtH6zW<(`Z(24C z=EC6RtT63+&@1~MZM%#N&y(WB_2K4hw4m2Kcdu07PsCJgF;brHueH8@rm>BF*xNhQ z*hZCf`iqwPm?-vIKvMYwF$LtC|Ealzj9u)L+<+?%xE3ef<0n!{`Cm7*xXtXY)%@!c bC1R5$LORkUe=4RXa%Rz_jFWs23t#>KYGv*s literal 0 HcmV?d00001 diff --git a/AE/assets/layout/tablet/Notifications_MainComp-Popup-Error-Short.timeline b/AE/assets/layout/tablet/Notifications_MainComp-Popup-Error-Short.timeline new file mode 100644 index 0000000000000000000000000000000000000000..6f311b271d9b9b22bbd5821128832d341c46516d GIT binary patch literal 6162 zcmeI0{Zmv`7{~8I!tS!{F31YAfw*YGV1zQ}G=zw(n$Z~RfHBpKx-N@sEv&+VI)F3; z;V@b$QWlX~W4YtNf{|uYP(c=Wvbco^7;ZtQGRxmO75eR+<#%dZ^~rK>FxpDD!n4rnIC7g zI|{AD_p9W7WPn;Ou?1vhuuc?QAL%Gr6gJ^nl3u~qasIht*pzyT=h;}vA09tZ*3{mOH?SMMMgBE$0&l!Ck(8eYMB9mq( zptkqsB1)WB3+M+;GNM@-b%44<(-5hP-UeiFWg@!u);oaWV^<@(@I^hK*p)em`hIEf zthFo;QQN(}fL_oQBHB0o13)WWn-JBc8~~(VSAxj7?jWGFt7V8*S2lV^Z7xT&{9rSn z)8h=mv-zaigW!>PZhT$er!WMry*I1;%3+FZ+7^m35?U!*nE4q+(Z!!r6tt(EqPy)K z6#X{%6-B4Vx+rRo?4jtx#m6byVR2Eksp=bw%paei=$YO=iXOl8Ek%)m-%+H9@2BX7 zX@H`kf*&dRdiT#1wX_XVRR7ZuMOAl(DRP8gpy>JJUnw%K{hgw?ia#g{JupI%%ypTf zOBb(DG@!UfQP-Rs6g925Nl~riZ;Hxx-lk}M>s^Xg4vbAiu<6eYA@Y2n+#jkGzUe(L z!A-3UuCJY4gD=5|!3U5raS5W~1Yba|H|8KZV|)nE^>iJg-pnb0&c(`8c)8MFKm zZ9E$YsHOPSLhp;7GpYtO-dl(0#eXz_UTS_8kx3H-Xl}hPqNOu}0hu~$le}vs&YKD- zZPXW0d};_F&2|4LVH7-wRjYJ>pi;#8r*AM@Y|bsp+3u=yRHY9x+07PfuEU;fEr`ps zIqkIi3_|r04}`U0QNH$M72;)evI=?L@5w6UeN88;koQhZRv}3@S%vObp@-d7s7Iyu z%dp$r1&9QnQz3F`qSeb~_v_8_)GC>jqBy=o1|=v893~)v!!$%(gnJ%OMv??><~%w!K{QWfOz*vIAeyH$rn7=(63uHQ(*OWg(X7e=1^!$L?MDt|FbVo7OJmvA($EfCskLj&fspjdA={w^SHSAGLf}VXS zMe~2nv(YdWKIpvr5EG(UV_FnzOpaoWDN?MlmWwr}OR>hJDb|=e#TpZ+SYsL$YfPqM zjVV>EF|mp@rdP4XBrDdKYQ-88u2^H*6>B_mh&85QvBpF!)|igP8k4eEV`>&_OweMD zXnE5O!vpr>c+bSOv~S;rIU9InBJNi zMrs7_9x#15Y8uh}499fCf)Jv4SApr_Ex|Cm-c!OZ{7mO zyBU0TDb>8Q!E{CXL=Bq|yBwa4h9|>VxyeyzbJ`sF%6Ru-^O#Dn&#;*7)+}4LGuKq$ z*pTXQIvsh7^DVg!asUmE4uoSP)a+!v&(rx)Q{>$$t)KhnDEsMAX{8wH2`Mll)e~@S9 zc48hey=3k-dl-rOvNHlkN&r$c==Z-$8S>>fHu_TTV?f+vs=yW4P9zHH>+?_Lc>U79bOYMG#WjM!rcJi`uRQ6~L|H*(A3-G|H?R4C*uyB~_4$<@Vr G6@CLXcI`j_ literal 0 HcmV?d00001 diff --git a/AE/assets/layout/tablet/Notifications_MainComp-Popup-Favorite-Long.timeline b/AE/assets/layout/tablet/Notifications_MainComp-Popup-Favorite-Long.timeline new file mode 100644 index 0000000000000000000000000000000000000000..ea333a6fe6b28ee559ecacc4f27b5ce71f400f0a GIT binary patch literal 10430 zcmeI2`%{!v7{_-ZWJQ--k`9pwIpyF5FX@yQP(e*f0r4_snh2|6$f_(NqDdy|nC87q zvdp|;WnL!DOWHIId3U@}mZFYX7G5TAlc`|mdC#-wa30T@=?_?cc$ocs-uGQ+_ucn- z-tT#Lx3JlQq8&k@51o-gJu|c395cyXke40X(BT(hWB;1?FS6T%qSyvC&d9)iuKfJW zF)m_HG<4Kcbg;w5ceYQ5W5mMiy?crio78!2vz3U~Va!*@%!Jon=i3ri+wHM{PAAO* zbmu9zK>J*?0p(xZDA2|^a{)z-tQ2TT`8+_$n`;D`c6dIZJyBta-ouZ+{vM!-VxU0x-v1C#eB20uE`3u5C@y`p zKu3OEWgV;cc!732`~=Wz5%~hGZn_3gzluVE=5=2SD0oz{K%Po);9{)i*^Za&{+A^1wH4}STPFJKdR?ftN3+}KP}PUu#OGTLvasN2A=DSCeL zPKv@-?4szwu00g}e)e06j@Rs`Xjk<26n)m?2Z|PCRZvt|dVr$L4TmUt<=_#DI$k|S zQMB^}MfKxPQFJ@4lA@|fKU4JMvR^3Ly5lTGWoN1=D!qS!B6rj!iiRd!rYLFT9~8Bo z`6oq<*H%+xuee6h)hjnBs;qyLqWvvzQ&isXE=5b-|4=l2@xK&}+5Ui{^vasL2u}L* zRRUQTD0ZRhjwikKBe)xChu1gHy&--C)iHj6k~${~bfLXJpo)bp1v;Jd1fW}~5ds|? z7y#&e3%fx3T=f9WtEdv!sO^&j0Y!hgSD=k^9DtTpd@Rta74-oPy!ehlOUi=)**_g3 z(45^302N!IptOBUyLyk+x!se1Qm*?86yLKEppaXEU0^HtA_fhL00f;PE--aMW>$`; zD5xpxIJM5m`aL~)t&?)y`LySpf}W#p0LOxZ;IVvN2ivHx>sY^MU)S;eEPY+a`$_n^ zjxEC1b!69hmUW#+&dA`LEO%b(v98QXo;DNm#*o{cGthc8TlxAAYrwv{9;?~-?s~kJ zSl?Zb_mlA5_1GeOcRg@681H&cHgW{$T1%wEE^lp05=-q6%`C8LEI1LaX`Be!h=<9Rn-{M&2B!JX{f5k z!0uX98q-i!jp5y~^(jn4RW$~A$9DDt&8n&~)LYu82h&hhjRD^asoj`{s%i}T&K`J) zX{f5k7FhaKC#IpQ8gIu=)OKJRs;V&%yu7U)(@<57;b8iKc&4GM8iPVx*EUQ;RW*i& zaSd8C4OP_`ASQQc#WYk^W0?40YfGk~sv3jE_)^eNrG|49L&j)JL*?2!(J*kN&U+qW z_-N7?M4B{)k|vF<+NANe(WEiBG-(VmO&SADlg4naRC`wnYpf@r&*{`5*%4CBR418 zHHm~7M;ke8buAoEgy<#7FlkOphPPwOxZvcZ`M8slrt0cUnrsv1HWYgBnBESLlP1>- zYsM3elP1^WJB}q9Crz$*){Y_?Crz#w^%_AmPMTcztrz?XCWUC6G`W86MjxVa(&RcIpf}MtX>vUwE177VG`S86 zOd{GlXOD>6lDAgN(UE}d(&Tt?SwxumYu za(P{=wOmNiYPpoJ)pA*1tK|~ER?Fpn zt(HswS}h*~&}#WefL6=L1GHK`DxlT!u>q}?j}U0Je4Ie5Wyq%0a=}NdpIYGgpZom>`ypDt literal 0 HcmV?d00001 diff --git a/AE/assets/layout/tablet/Notifications_MainComp-Popup-Favorite-Short.layout b/AE/assets/layout/tablet/Notifications_MainComp-Popup-Favorite-Short.layout new file mode 100644 index 0000000000000000000000000000000000000000..2048f251435fa071b85acd16bbcdef2a5981a057 GIT binary patch literal 1097 zcmbVL&ubGw6n+y!*sSR`*%F!rl}%BQ%9b=LvkvZ&Ni)h z*nh)PdiS5uSP$mtAr!oOvxoW@=uDE;ptTeSX83r#eeZkk`!)ao0=r8=0P%ZByz`h) zW6Nmh)F75qThk4zKz2H6nRMKax}xtA+n`w8XcL>p*>|Pu0KMX^Yo8WNSyvSEdgDdQ zCa%>?ypxm@X}&5>Pl5Njz;ewz%LR~G06dKaJdFiBEyXiti!88M9A?b%3;l1JTq{2bwb;NH~f6jl0HcL;Q6dL?K;>g zxDF*d1ygq%IY@06Z_iE^bZWmOl(WK#6b;Nzlph%dU}&Ae;H$>1qf{ybE%Pyy>()WO zCj_G5)Zad;qwVCrQ5*S7nK0M_rCYKp97Up#y73Pt3#PtLT$<^lTp!huoEA=JqA2x; a?wOU`gGZZqmyAnr^Ch%XrB$ojf2;Rbx|m7dxt(8h&}07Z{)66lqh#emW_w+l4u;1WQ)qr+3Y zho5-LcT@CB^XC*DX|JbfXUtxT-W&QQMN9J=C@QboM^WB} z0~9^9{}4q3&NfmM6Y@1hL5asG`ZKGEqL%63QuNiU-%+$>doxAVCt4_~y80tU?&zN= zdMx=gMXBR|r6^(EZxr47ek(=xhI161J#&Ggrl5-y)%W_7qMAppP_)AR7e%vQ{)eJT z+uA6~Zffs{;G{pcBLCe(dKDs9{+z zfsUu%1n5#`q(J*~0|1@uX&0!@)d|qzh8A&++BPE)P|QcQ0&QIA0Q73Z+XAg#6$B{v z)C&T=QWFfw{_a?T7Vhc{sPas2fo2`-0w{HCpg_}p2m!QZ#^EII4}Ic!C!p*5R|@pR zwNOBlH)RNv6&enxPqn{5!@EZS%Bov2*n6yjeQySoe%@c8#9>_lgFYY)Pr}!AY>~dMBfHL>tm}N?jB*y`yGs%ZU3t?z_e?FBL~eXeK+xPYCRL60#^Lsc~fcITqAn1-rq4DTA(r!x&z)fnV8?idc5RaIlCw_@Z_rlG1D1HOAR zlbD98Y7G0D_dUQgR8?aOtoryqrlG1DZ^ypA)}Lvps>VR@^wz#iLsd0~gW3BMnTD!r z3<_<7?_nCMsxdT-@0`FiR8?bunAX2H(@<57VPe~sUQ9z(H3o}`RiL3t4d*C^j4_sm z%C&W(Vczn(imczGzOX`jp3$AW6){R7%CFly2mlA1IIrY4QysY&BVVbXYeYtk67nly&3CXK>! z43Vj}nlg(bA=kXYL1)EqIix%E2&nQ}$@{VuG;d8#VH&EcF?4=*!bql}su~06s9hOM zLsd0~(W}OfW*VxhaYXB1_yp5XRgG~$_Q~-~Lsc~f*4c+$pjlNlhSy7yCNm9H)fi;A z4k%$7s;V*6POF{9G*ne%!2M>EhiRy)#;`kMK{?Y{)fkRnu6T}VsH(=Gyg7Rg(@<57p?QyEprJ|)C!q+?)d?>?ASXYs*cE&m z3pMsSqdMgj7qPWm5@sCk>acaRa6A#B&rO3#b59b3i)CnwDtot!jP*J09Rn=rSb z+=IvTc6gjLxn9;jg=m~Kxt=nhkZ7DVx!!SY0?{~Wa=m=`IHGaVzK{QU9 zTu;qUBN``7u7d+piS|yK))%_`{7|BC(!}?Uq#7qpt~XZ>A$#Mb$@M2ORO6({b!S^g z4drw^qwgNUP-ng;vWYa;=ujn(vb$ExC3vlt%kf$*m*%xvF4JqZ46n3WE~IF+T*}vK zxva0%a*1E7<#NAP%cXye2D$J;X_q>*o*T5RH>2*Te0!b>gJS_2gYok-c%!1Nlk0Wibeh3Qlk4BFmXW=2(&YL=bve;E zX>vXB@0mp7q{(%5#Ir=>q{($#E7dq@a{cK1O0qXjnp|g{>Zsu)l#`})5_%`Yct@7I zw8&HBE{PZr!uCyp7MvXAH>xBqz)|lE>%{)-;eWmme*zfX>kPB?wB2uuxR32-8^U+< L&n)x&&;9-bZH-^e literal 0 HcmV?d00001 diff --git a/AE/assets/layout/tablet/Notifications_MainComp-Popup-General-Long.layout b/AE/assets/layout/tablet/Notifications_MainComp-Popup-General-Long.layout new file mode 100644 index 0000000000000000000000000000000000000000..2492007cf152e9c04c3b23508cc13160d8668a63 GIT binary patch literal 918 zcmZQ#U|`??;x1+e2CloTT$+CQC7EfN$%!SI`FX|hzKNN6&iT0ox&iqGr3Jd~sd=eI zi8;DH`FZK0KwYk~3=9WcRAr7Ex*C;oaXBR>XQvnCm*%BNyyj8($Dz_r68N(mR3n}vE?LI z=9iWT@jFL)I_Kw<=H~f;1*&+t*ozAilQZ+ug_w-Ys)V`N(~AX=;`tvVq0%u0=)pMbP*MCDPCWqbzY$CGemY zGUoWlBfzAE^QqIjWhev?fAjKjjfdK%(Akb|9 literal 0 HcmV?d00001 diff --git a/AE/assets/layout/tablet/Notifications_MainComp-Popup-General-Long.timeline b/AE/assets/layout/tablet/Notifications_MainComp-Popup-General-Long.timeline new file mode 100644 index 0000000000000000000000000000000000000000..769914fffe778cf758ddce669a18667d745697a9 GIT binary patch literal 6093 zcmeI0{Zmv`7{~90V3&1y%?)SUB$y@{%t4)Tra=W{!IDB2!5nKOd0A);SYa2?fYA)X zAzx6WEV9TOUsb}aDc6#;m0gD_el&6$Trb%n#kb0G6rc;nT0nn3 zU}dP^{3;;ZNE<_K_1gg%)(NA8Uc$P14?gCWW9?6g?cn_eS zx92kyx1b5ox54oYJ(AfB==1PYhJwo902JxSV(9kkZvu*q$!6&4r!9bDG71wiG_5AZLpl5Y9hFWJI1eE5eWT+wW5TKykDu(R2hXJMjQNvJnZJT@4rY#ITdAI}6 z*?R=RZ}VY?8^KTFzVXe2AHfi~_S~#3u1<_BAzc_{F6_o=Y1Stg&8awsQRx0&j3#>f zF#6@R!=WmP(yC*Qp7@C}lVAEe7X2^X&DF;;|-SqB< z;8utX*VivS&mMx&NFPAPxMYT|Ec6BB*gcn_3Z-ALClG?3*7=yJ5oP`}w9P=jNb zol)HtDnJn*pJ1r1UJYoU;~j<$><<8xHS!8Wd)qaDi|Keh*70)%*nIZH*01q700R72PD}`<{68uHe7Sg zL(TCX0BgY_bgk*CL(AxN)p0-1(^bdwSWZ_R&z+dAI+AX>>hP-bpi*^QTD^Z}ktN?; zhGNc{nQCdO)vIM*Z?-1a$&yr^yi@tFBpz@q@dzACKgd0#%%e$28KSItq|#2;ggpzI zrXr$uPZlFh6B5zIi(WvQrX`|}-OWXsCMTjBQ?ik!DT?S7lWUQtiHc~m;Tfc9x+2=z zvI=RMw1`f%rz1^M7txy!K8-X@U_`$anTj+`V?;mddID)$BZ>C&TaGkMX+&?#OGcU| zHlj5uBhoaz5#8uqhBQrb^t*Lf(^N-vXH_DaO%oo`MrMJgEycPwhg@6TDFKH2)tBhZ;}z zUfNxhmEugoCMmpL2OdrQZhkft34qL02-gf#6g5N%jzMVfXRh;AP) zMVfXUi2fiHzs=AN1ku0WDMzzuH-czaOC{2@GeLC0?M+D2E(OsUVJ{&~I~GJwjABi@ z7eueBtwOVDCxd9y$W#rRkaab@-|%A8CacY2w^&QU<^(Ep6QBgg>wQ*~MER-5wITk> dhm(A`v>{To^tcojtqhbB$w1%qa{K>|{1=uXH`@RJ literal 0 HcmV?d00001 diff --git a/AE/assets/layout/tablet/Notifications_MainComp-Popup-General-Short.layout b/AE/assets/layout/tablet/Notifications_MainComp-Popup-General-Short.layout new file mode 100644 index 0000000000000000000000000000000000000000..17066ceafef7ef1fb264ab534a4095561e94e361 GIT binary patch literal 1087 zcma)5&ubGw6rM>#*le>jT_{b~A8d=F1h%B9LN2oDCP67wW8;rN56POHG+U=T>F%s) zJuP0ms_n%d3PS&o90YUhRs0k5;KifpOw8H^YstV4-#*^H@4feZ8v_6c>{*EeApT5< zx%-6L9lLE(n>b!`-L#!D+39ID((`-TUF0Cw#9F;eTsp@-t6l+MP`Q5j({i=oi=tt+ zpKrOucdX1CNj;Hr4RJ;SU|43k*kHK;$UG3}ED-1{5asI*leRN!4`70M>fSM^G;HKg$It?V3X`VK3W}3a_;cKYqp+XWy0al+SphVKw43* zC3y&d@A_;AvLRRq!Q$*XvV3elaFDivwit46g8Ywo@kR|cU>CAQzRZdeMSD~uFOb{8 zq%R8yW4q_sUSU^E)UnOx%p6GSX}I91M(0ij?lB2U$&ZuC%FQrd@S#+A1x2OaHZgi? zTeMqqNzWjZlATqj&CHiMl+++L-Y{pmP-qZvdkrSuaM*`2H?n>7mv~~M{#s<^NALOh ztY<^85Q1m(;*9Shuk3rQ?J_n!PmWX9N89t!f?o5ld*y;~BBf)wNcm7du4u5i`9&Wq z%B=VyQS7&XtO>`dG*GVor{)qi_lZyQLs%Tb7L;!ZQ|YAguNzu$JG*Z;|F}er*kp;) Wjyx@#rqWY+t7tLCX(5P(FTVlQDe55r literal 0 HcmV?d00001 diff --git a/AE/assets/layout/tablet/Notifications_MainComp-Popup-General-Short.timeline b/AE/assets/layout/tablet/Notifications_MainComp-Popup-General-Short.timeline new file mode 100644 index 0000000000000000000000000000000000000000..54c788f7490a22da1c66210be4d6e15c10863671 GIT binary patch literal 6162 zcmeI0{Zmv`7{~9j3CqHTU1WvXK-|@Y!3br{X$TQnHKQ@s0b{Be6&H{#;3_Pr14u&< zj-w`TWf7@m29(Y)OcY`0l(U6mP9eP^;y9Is;`ox2Z$$g-Is1rDr~d$c*}0$3IcJ!A z&%Mw2J^`VUq>a#Mb-QJwHaXMw^7=xhxFE~yukkWSuD?+AZk0+q-8GMiP{r(znG9W-Bu?1A+u#Oq7k93zV3Y~B*Nw46w-sMM3m2jP~LrUDIQkemru~Y&2 zYnp4!Xc7ayl+r_D*xrs{7f%KY#IMbGs1QS|twZz+n9zoW=Ewx6OK z)&Yu!3V)>N>xQ2xYVRDRsOhI6imLAnQ>27lpy>I;Un#Pz{hgwi%0DOyIWR(z%6XZh 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 literal 0 HcmV?d00001 diff --git a/AE/assets/layout/tablet/Notifications_MainComp-Popup-Success-Short.layout b/AE/assets/layout/tablet/Notifications_MainComp-Popup-Success-Short.layout new file mode 100644 index 0000000000000000000000000000000000000000..793c29de71a90e0b06565e28dede5ec9aa752c01 GIT binary patch literal 1087 zcma)5O>fgc5FMvc>-yzd*f6%aN&qxH;rkemMSZG^*kESo0<0<005Cat3d$icSuS- zA=GMFra>*zaq1g})hUpju2v>px2siL(?pJ=RocX+^X#+IEr5RU?#<6DrHm^{dBc3Y zWfQm4j33MDnVhOgb27l7z;bb(Ke+!(X(qxh_I9nY1HlB8nwu!bFvhPFsS1^08EYyUyz!v#7A;}c&QH{Job_IKFd<}B9=4IZ~wf9ehUedOmywx9eZURbENKC$wH5BwbK z2_G!_;MIaO=Q_wKxDIQ(fDOk{g4A}=_QGUAr~c2qN=7`Bqk+^!`E&gMMv4xH-*m31 zTCEQC^v6)P*8oKm4s@}tSP9oj+oj}vDpeGqGo~s) ze@#;mby;5nRCK-xQB%z}K;diq5bbKN1+?Vw7^1S1+W~ck>lb;J&mDao(8gvXB6HwQ zK<)3%MU*(N4$x15$%tlU)B`#enuaK#_-#N&XC|UsZ@mL3K6W*t3tuzka}+yIPKDbybsl)aD9A%MZ2y zIz7%1JeyBi+z1|t`^MMzdAw=#ElU8Ph|6uBV3}>du@3=v<5nQJ2*lP_1(a zzfo-^K7b+*9YNGoqXD$r`97k?J-&c4&%cUjSF;w7YJV1@nlJqTm0o-lQQ1jmWXK&>UG7J6Rv+|d9)Ez&`T}PA~FZ+0nKetBU(Bm2#~p}F3Gc2;=HMV z(ni&Y;!}eG1zz`g5=Oy;ShXqy5LAj-pY#pc7Mo*>cDAeP49Et(*`95&<|+0ZYhhfb z&0(k2X8@{?cp$6|i}JN6s}L`%lU2z5eos~*&ucnag*ud%~KN7PbKJx=81{vINemDd3s{{)<+>k^CZP|j0nx{NI`x~lx;$wR2RjPUVWBShcL=Afslc0Ma zO40mZb8j?Eg%3K8k3_~V~P}OtmR^j=~ApQX^J(bPO-)WD%O}r#Tt{T zSYt{RYfP+SjpDaf>ykZ?VQCF4maJ#Tw5>VvT8CtTDNZHKus6#zZgHnC}0p;iHC0 z|3U38%C6$f!Y6T1S$PM5eJh7dv_|l50Mi{ZEkL|8z;tgst!}(az_jLFS~_{hfa$HN zVWdXz?g7)6qoxtf&u~mPE(j)?cNLf(-V#JK?=UcZ=udj0;N1qMja7kUHt#$zoxLo8 zXx@cjy7@7gXx@=vdO;FB?C|ac)0^}C$ZX!JV0!;CEz!Jd!F11js(A;4>80JC!<(nT z@oom6T}CzUY%pD!K2gIa#4d+>qv6RgR%2F*Yz~`JppADOHiu+`A;Xeww`SRL9C_wK zWkagsa47kU3oLmGIe-R5%W!Ojnw@O$db%KLil$%IdAoiF*w3J>lVYSNq@WnrKq-X{ LRHqj^{&(cR0UuM1 literal 0 HcmV?d00001 From aa76067123b8da80351caabf3f5a29853410d806 Mon Sep 17 00:00:00 2001 From: Richard Lalancette Date: Sun, 31 Jul 2016 16:12:57 -0400 Subject: [PATCH 3/4] Hooked up quest manager signals to notifications --- src/app/AppController.cpp | 4 ++-- src/app/AppController.h | 2 +- src/notification/NotificationController.cpp | 26 +++++++++++++++++++++ src/notification/NotificationController.h | 5 +++- src/screen/BookScreenViewController.cpp | 2 -- 5 files changed, 33 insertions(+), 6 deletions(-) diff --git a/src/app/AppController.cpp b/src/app/AppController.cpp index bba5ad3..5ee2524 100644 --- a/src/app/AppController.cpp +++ b/src/app/AppController.cpp @@ -10,7 +10,7 @@ const YI_UINT64 APP_INIT_RETRY_TIMER_MS = 5000; AppController::AppController(CYIApp &rApp) : m_rApp(rApp) - , m_NavigationController(m_rApp) + , m_navigationController(m_rApp) , m_notificationController(m_rApp) { BuildStateMachine(); @@ -69,7 +69,7 @@ void AppController::RunningStateEntered() { YI_LOGD(TAG, "RunningStateEntered"); - m_NavigationController.Start(NavigationController::BOOK); + m_navigationController.Start(NavigationController::BOOK); } void AppController::RunningStateExited() diff --git a/src/app/AppController.h b/src/app/AppController.h index 52655a8..c2842c3 100644 --- a/src/app/AppController.h +++ b/src/app/AppController.h @@ -33,7 +33,7 @@ class AppController : public CYISignalHandler CYIStateMachine m_StateMachine; CYISignal<> TransitionFromConfigInitToRunning; - NavigationController m_NavigationController; + NavigationController m_navigationController; NotificationController m_notificationController; YI_DISALLOW_COPY_AND_ASSIGN(AppController); diff --git a/src/notification/NotificationController.cpp b/src/notification/NotificationController.cpp index 6c3ae5d..a0c356f 100644 --- a/src/notification/NotificationController.cpp +++ b/src/notification/NotificationController.cpp @@ -8,6 +8,7 @@ #include #include #include +#include static const CYIString TAG("NotificationController"); @@ -44,6 +45,31 @@ void NotificationController::Init() m_notificationDelayTimer.SetInterval(NOTIFICATION_DELAY_MS); m_notificationDelayTimer.TimedOut.Connect(*this, &NotificationController::CloseNotification); + + QuestManager::QuestAvailableSig.Connect(*this, &NotificationController::NotifyQuestAvailable); + QuestManager::QuestAcceptedSig.Connect(*this, &NotificationController::NotifyQuestAccepted); + QuestManager::ObjectiveCompletedSig.Connect(*this, &NotificationController::NotifyObjectiveCompleted); + QuestManager::QuestCompletedSig.Connect(*this, &NotificationController::NotifyQuestCompleted); +} + +void NotificationController::NotifyQuestAvailable() +{ + Message(NETWORK_CONNECTION_ERROR).Send(); +} + +void NotificationController::NotifyQuestAccepted() +{ + Message(NETWORK_CONNECTION_ERROR).Send(); +} + +void NotificationController::NotifyObjectiveCompleted() +{ + Message(NETWORK_CONNECTION_ERROR).Send(); +} + +void NotificationController::NotifyQuestCompleted() +{ + Message(NETWORK_CONNECTION_ERROR).Send(); } void NotificationController::LoadNotificationOverlays() diff --git a/src/notification/NotificationController.h b/src/notification/NotificationController.h index 583647d..3a694a8 100644 --- a/src/notification/NotificationController.h +++ b/src/notification/NotificationController.h @@ -23,7 +23,10 @@ class NotificationController : public CYISignalHandler, public CYIBackButtonHand virtual ~NotificationController(); void Init(); - + void NotifyQuestAvailable(); + void NotifyQuestAccepted(); + void NotifyObjectiveCompleted(); + void NotifyQuestCompleted(); private: void LoadNotificationOverlays(); FullScreenNotificationView *LoadDialogOverlay(const CYIString &sceneName, const CYIString &layoutName); diff --git a/src/screen/BookScreenViewController.cpp b/src/screen/BookScreenViewController.cpp index 00e183a..76900fb 100644 --- a/src/screen/BookScreenViewController.cpp +++ b/src/screen/BookScreenViewController.cpp @@ -61,7 +61,5 @@ void BookScreenViewController::OnPreloadScreen(CYIBundle bundle, const CYIPersis TabbedScreenViewController::OnPreloadScreen(bundle, stateData); PreloadFinished(this); - - Message(NETWORK_CONNECTION_ERROR).Send(); } From 45d57c730ae8dc7af40af8743d44244d14711e1e Mon Sep 17 00:00:00 2001 From: Richard Lalancette Date: Mon, 1 Aug 2016 02:46:24 -0400 Subject: [PATCH 4/4] Quest and objective should now show a dialog on screen. --- .../assets/text/Notifications.json | 26 ++++++++++++++--- src/app/LovecraftApp.cpp | 18 ++++++------ src/notification/NotificationController.cpp | 28 +++++++++++++------ src/notification/NotificationController.h | 9 +++--- src/notification/NotificationModel.cpp | 24 +++++++++------- src/notification/Notifications.h | 4 +++ 6 files changed, 73 insertions(+), 36 deletions(-) diff --git a/build/AndroidNative/assets/text/Notifications.json b/build/AndroidNative/assets/text/Notifications.json index e87305b..04d0241 100644 --- a/build/AndroidNative/assets/text/Notifications.json +++ b/build/AndroidNative/assets/text/Notifications.json @@ -1,10 +1,28 @@ { - "INVALID_DEEP_LINK_ERROR" : { - "type": "Error", - "title": "Invalid deep link", - "message": "Unable to reach destination link" + "QUEST_AVAILABLE" : { + "type": "Success", + "title": "New Quest Available", + "message": "" + }, + + "QUEST_ACCEPTED" : { + "type": "Success", + "title": "Quest Accepted", + "message": "" + }, + + "QUEST_COMPLETED" : { + "type": "Success", + "title": "Quest Completed", + "message": "" }, + "QUEST_OBJECTIVE_COMPLETED" : { + "type": "Success", + "title": "Quest Objective Completed", + "message": "" + }, + "APP_CONFIGURATION_ERROR" : { "type": "Dialog", "title": "App configuration failed", diff --git a/src/app/LovecraftApp.cpp b/src/app/LovecraftApp.cpp index 73eeed3..1610c38 100644 --- a/src/app/LovecraftApp.cpp +++ b/src/app/LovecraftApp.cpp @@ -30,10 +30,6 @@ bool LovecraftApp::UserInit() AddTMXDecoder(); - TestsQuests(); - - //TestLoadingTMX(); - return true; } @@ -115,7 +111,14 @@ void LovecraftApp::SetApplicationPlatform(ApplicationConfiguration &applicationC bool LovecraftApp::UserStart() { - return m_pAppController->Start(); + if (m_pAppController->Start()) + { + TestsQuests(); + + //TestLoadingTMX(); + } + + return true; } void LovecraftApp::UserUpdate() @@ -195,11 +198,6 @@ void LovecraftApp::TestQuestProgression(QuestManager* quest_manager) YI_LOGI("LovecraftApp::TestQuestProgression", "After saving the advisor: \n%s", quest_manager->GetAllQuestsDisplayText().GetData()); - //After saving the advisor - quest_manager->ActivateCondition(CYIString("rescue:maincharacter:chiefadvisor")); - - YI_LOGI("LovecraftApp::TestQuestProgression", "After saving the advisor: \n%s", quest_manager->GetAllQuestsDisplayText().GetData()); - //After the scientist transcends quest_manager->ActivateCondition(CYIString("state:head_scientist:transcended")); diff --git a/src/notification/NotificationController.cpp b/src/notification/NotificationController.cpp index a0c356f..d03db79 100644 --- a/src/notification/NotificationController.cpp +++ b/src/notification/NotificationController.cpp @@ -52,24 +52,36 @@ void NotificationController::Init() QuestManager::QuestCompletedSig.Connect(*this, &NotificationController::NotifyQuestCompleted); } -void NotificationController::NotifyQuestAvailable() +void NotificationController::NotifyQuestAvailable(QuestModel *pQuestModel) { - Message(NETWORK_CONNECTION_ERROR).Send(); + Notification questAvailableNotification(QUEST_AVAILABLE); + questAvailableNotification.SetCustomMessageField(pQuestModel->GetDisplayText()); + + Message(questAvailableNotification).Send(); } -void NotificationController::NotifyQuestAccepted() +void NotificationController::NotifyQuestAccepted(QuestModel *pQuestModel) { - Message(NETWORK_CONNECTION_ERROR).Send(); + Notification questAvailableNotification(QUEST_AVAILABLE); + questAvailableNotification.SetCustomMessageField(pQuestModel->GetDisplayText()); + + Message(questAvailableNotification).Send(); } -void NotificationController::NotifyObjectiveCompleted() +void NotificationController::NotifyObjectiveCompleted(QuestObjectiveModel *pQuestObjectiveModel) { - Message(NETWORK_CONNECTION_ERROR).Send(); + Notification questAvailableNotification(QUEST_AVAILABLE); + questAvailableNotification.SetCustomMessageField(pQuestObjectiveModel->GetDisplayText()); + + Message(questAvailableNotification).Send(); } -void NotificationController::NotifyQuestCompleted() +void NotificationController::NotifyQuestCompleted(QuestModel *pQuestModel) { - Message(NETWORK_CONNECTION_ERROR).Send(); + Notification questAvailableNotification(QUEST_AVAILABLE); + questAvailableNotification.SetCustomMessageField(pQuestModel->GetDisplayText()); + + Message(questAvailableNotification).Send(); } void NotificationController::LoadNotificationOverlays() diff --git a/src/notification/NotificationController.h b/src/notification/NotificationController.h index 3a694a8..5a68f2e 100644 --- a/src/notification/NotificationController.h +++ b/src/notification/NotificationController.h @@ -7,6 +7,7 @@ #include #include #include +#include class Notification; class NotificationView; @@ -23,10 +24,10 @@ class NotificationController : public CYISignalHandler, public CYIBackButtonHand virtual ~NotificationController(); void Init(); - void NotifyQuestAvailable(); - void NotifyQuestAccepted(); - void NotifyObjectiveCompleted(); - void NotifyQuestCompleted(); + void NotifyQuestAvailable(QuestModel *); + void NotifyQuestAccepted(QuestModel *); + void NotifyObjectiveCompleted(QuestObjectiveModel *); + void NotifyQuestCompleted(QuestModel *); private: void LoadNotificationOverlays(); FullScreenNotificationView *LoadDialogOverlay(const CYIString &sceneName, const CYIString &layoutName); diff --git a/src/notification/NotificationModel.cpp b/src/notification/NotificationModel.cpp index c816814..12497b3 100644 --- a/src/notification/NotificationModel.cpp +++ b/src/notification/NotificationModel.cpp @@ -11,16 +11,20 @@ NOTIFICATION NotificationModel::NotificationFromErrorString(const CYIString &rNo if (map.empty()) { - map["INVALID_DEEP_LINK_ERROR"] = INVALID_DEEP_LINK_ERROR; - map["APP_CONFIGURATION_ERROR"] = APP_CONFIGURATION_ERROR; - map["VSTB_SERVER_ERROR"] = VSTB_SERVER_ERROR; - map["VIDEO_PLAYBACK_ERROR"] = VIDEO_PLAYBACK_ERROR; - map["VIDEO_PLAYBACK_CHANNEL_AUTH_ERROR"] = VIDEO_PLAYBACK_CHANNEL_AUTH_ERROR; - map["VIDEO_CONTENT_AUTH_LEVEL_ERROR"] = VIDEO_CONTENT_AUTH_LEVEL_ERROR; - map["NETWORK_CONNECTION_ERROR"] = NETWORK_CONNECTION_ERROR; - map["LOGOUT_CONFIRMATION"] = LOGOUT_CONFIRMATION; - map["LOGOUT_SUCCESS"] = LOGOUT_SUCCESS; - map["LOGOUT_FAIL"] = LOGOUT_FAIL; + map["QUEST_AVAILABLE"] = QUEST_AVAILABLE; + map["QUEST_ACCEPTED"] = QUEST_ACCEPTED; + map["QUEST_COMPLETED"] = QUEST_COMPLETED; + map["QUEST_OBJECTIVE_COMPLETED"] = QUEST_OBJECTIVE_COMPLETED; + map["INVALID_DEEP_LINK_ERROR"] = INVALID_DEEP_LINK_ERROR; + map["APP_CONFIGURATION_ERROR"] = APP_CONFIGURATION_ERROR; + map["VSTB_SERVER_ERROR"] = VSTB_SERVER_ERROR; + map["VIDEO_PLAYBACK_ERROR"] = VIDEO_PLAYBACK_ERROR; + map["VIDEO_PLAYBACK_CHANNEL_AUTH_ERROR"] = VIDEO_PLAYBACK_CHANNEL_AUTH_ERROR; + map["VIDEO_CONTENT_AUTH_LEVEL_ERROR"] = VIDEO_CONTENT_AUTH_LEVEL_ERROR; + map["NETWORK_CONNECTION_ERROR"] = NETWORK_CONNECTION_ERROR; + map["LOGOUT_CONFIRMATION"] = LOGOUT_CONFIRMATION; + map["LOGOUT_SUCCESS"] = LOGOUT_SUCCESS; + map["LOGOUT_FAIL"] = LOGOUT_FAIL; } const std::map::const_iterator iter = map.find(rNotificationString); diff --git a/src/notification/Notifications.h b/src/notification/Notifications.h index b8f1936..3d3ad8a 100644 --- a/src/notification/Notifications.h +++ b/src/notification/Notifications.h @@ -3,6 +3,10 @@ enum NOTIFICATION { + QUEST_AVAILABLE, + QUEST_ACCEPTED, + QUEST_COMPLETED, + QUEST_OBJECTIVE_COMPLETED, INVALID_DEEP_LINK_ERROR, APP_CONFIGURATION_ERROR, VSTB_SERVER_ERROR,