From 2900b901bab7567b236f036f82deb5ba5a8a248b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Fri, 30 Jun 2017 10:42:30 +0200 Subject: [PATCH 1/3] [ion] Clean alpha shift event modifiers Change-Id: I6dd667fb12c0cd3d3e90a6f98da0bd56780dcff6 --- apps/alpha_lock_view.cpp | 34 ++++++----- apps/alpha_lock_view.h | 11 +--- apps/apps_window.cpp | 14 +---- apps/title_bar_view.cpp | 2 +- apps/title_bar_view.h | 2 +- ion/include/ion/events.h | 13 +++- ion/src/shared/events_keyboard.cpp | 97 +++++++++++++++++++----------- 7 files changed, 98 insertions(+), 75 deletions(-) diff --git a/apps/alpha_lock_view.cpp b/apps/alpha_lock_view.cpp index d55bce45d..645914af8 100644 --- a/apps/alpha_lock_view.cpp +++ b/apps/alpha_lock_view.cpp @@ -3,7 +3,7 @@ AlphaLockView::AlphaLockView() : View(), m_alphaView(KDText::FontSize::Small, I18n::Message::Default, 1.0f, 0.5f, KDColorWhite, Palette::YellowDark), - m_status(Status::Default) + m_status(Ion::Events::ShiftAlphaStatus::Default) { } @@ -11,15 +11,22 @@ void AlphaLockView::drawRect(KDContext * ctx, KDRect rect) const { ctx->fillRect(bounds(), Palette::YellowDark); } -bool AlphaLockView::setStatus(Status status) { +bool AlphaLockView::setStatus(Ion::Events::ShiftAlphaStatus status) { if (status != m_status) { m_status = status; - if (m_status == Status::Alpha || m_status == Status::AlphaLock) { - m_alphaView.setMessage(I18n::Message::Alpha); - } else if (m_status == Status::CapitalAlpha || m_status == Status::CapitalAlphaLock) { - m_alphaView.setMessage(I18n::Message::CapitalAlpha); - } else { - m_alphaView.setMessage(I18n::Message::Default); + switch (status) { + case Ion::Events::ShiftAlphaStatus::Alpha: + case Ion::Events::ShiftAlphaStatus::AlphaLock: + case Ion::Events::ShiftAlphaStatus::AlphaLockShift: + m_alphaView.setMessage(I18n::Message::Alpha); + break; + case Ion::Events::ShiftAlphaStatus::ShiftAlpha: + case Ion::Events::ShiftAlphaStatus::ShiftAlphaLock: + m_alphaView.setMessage(I18n::Message::CapitalAlpha); + break; + default: + m_alphaView.setMessage(I18n::Message::Default); + break; } markRectAsDirty(bounds()); return true; @@ -36,13 +43,12 @@ KDSize AlphaLockView::minimalSizeForOptimalDisplay() const { int AlphaLockView::numberOfSubviews() const { switch (m_status) { - case Status::Alpha: + case Ion::Events::ShiftAlphaStatus::Alpha: + case Ion::Events::ShiftAlphaStatus::ShiftAlpha: return 1; - case Status::AlphaLock: - return 2; - case Status::CapitalAlpha: - return 1; - case Status::CapitalAlphaLock: + case Ion::Events::ShiftAlphaStatus::AlphaLock: + case Ion::Events::ShiftAlphaStatus::AlphaLockShift: + case Ion::Events::ShiftAlphaStatus::ShiftAlphaLock: return 2; default: return 0; diff --git a/apps/alpha_lock_view.h b/apps/alpha_lock_view.h index 4d2b3113a..c9d0b9d6e 100644 --- a/apps/alpha_lock_view.h +++ b/apps/alpha_lock_view.h @@ -7,16 +7,9 @@ class AlphaLockView : public View { public: - enum class Status { - Default, - Alpha, - AlphaLock, - CapitalAlpha, - CapitalAlphaLock - }; AlphaLockView(); void drawRect(KDContext * ctx, KDRect rect) const override; - bool setStatus(Status status); + bool setStatus(Ion::Events::ShiftAlphaStatus status); KDSize minimalSizeForOptimalDisplay() const override; private: constexpr static KDCoordinate k_lockRightMargin = 5; @@ -25,7 +18,7 @@ private: View * subviewAtIndex(int index) override; LockView m_lockView; MessageTextView m_alphaView; - Status m_status; + Ion::Events::ShiftAlphaStatus m_status; }; #endif diff --git a/apps/apps_window.cpp b/apps/apps_window.cpp index c70854773..85dcdf32d 100644 --- a/apps/apps_window.cpp +++ b/apps/apps_window.cpp @@ -31,19 +31,7 @@ void AppsWindow::refreshPreferences() { } bool AppsWindow::updateAlphaLock() { - AlphaLockView::Status alphaLockStatus = AlphaLockView::Status::Default; - if (Ion::Events::isAlphaLocked()) { - alphaLockStatus = AlphaLockView::Status::AlphaLock; - } else if (Ion::Events::isShiftAlphaLocked()) { - alphaLockStatus = AlphaLockView::Status::CapitalAlphaLock; - } else if (Ion::Events::isAlphaActive()) { - if (Ion::Events::isShiftActive()) { - alphaLockStatus = AlphaLockView::Status::CapitalAlpha; - } else { - alphaLockStatus = AlphaLockView::Status::Alpha; - } - } - return m_titleBarView.setAlphaLockStatus(alphaLockStatus); + return m_titleBarView.setAlphaLockStatus(Ion::Events::shiftAlphaStatus()); } void AppsWindow::hideTitleBarView(bool hide) { diff --git a/apps/title_bar_view.cpp b/apps/title_bar_view.cpp index 73cb00c7d..9bdae920b 100644 --- a/apps/title_bar_view.cpp +++ b/apps/title_bar_view.cpp @@ -42,7 +42,7 @@ bool TitleBarView::setIsPlugged(bool isPlugged) { return m_batteryView.setIsPlugged(isPlugged); } -bool TitleBarView::setAlphaLockStatus(AlphaLockView::Status status) { +bool TitleBarView::setAlphaLockStatus(Ion::Events::ShiftAlphaStatus status) { return m_alphaLockView.setStatus(status); } diff --git a/apps/title_bar_view.h b/apps/title_bar_view.h index dffdae8d9..b53da3dc7 100644 --- a/apps/title_bar_view.h +++ b/apps/title_bar_view.h @@ -15,7 +15,7 @@ public: bool setChargeState(Ion::Battery::Charge chargeState); bool setIsCharging(bool isCharging); bool setIsPlugged(bool isPlugged); - bool setAlphaLockStatus(AlphaLockView::Status status); + bool setAlphaLockStatus(Ion::Events::ShiftAlphaStatus status); void refreshPreferences(); private: constexpr static KDCoordinate k_batteryRightMargin = 5; diff --git a/ion/include/ion/events.h b/ion/include/ion/events.h index b009f2b25..1af58c5a5 100644 --- a/ion/include/ion/events.h +++ b/ion/include/ion/events.h @@ -37,13 +37,22 @@ private: uint8_t m_id; }; +enum class ShiftAlphaStatus { + Default, + Shift, + Alpha, + ShiftAlpha, + AlphaLock, + AlphaLockShift, + ShiftAlphaLock, +}; + // Timeout is decremented Event getEvent(int * timeout); +ShiftAlphaStatus shiftAlphaStatus(); bool isShiftActive(); bool isAlphaActive(); -bool isAlphaLocked(); -bool isShiftAlphaLocked(); // Plain diff --git a/ion/src/shared/events_keyboard.cpp b/ion/src/shared/events_keyboard.cpp index 2a8bf7738..20ee15175 100644 --- a/ion/src/shared/events_keyboard.cpp +++ b/ion/src/shared/events_keyboard.cpp @@ -4,50 +4,77 @@ namespace Ion { namespace Events { -static bool sIsShiftActive = false; -static bool sIsAlphaActive = false; -static bool sIsAlphaLocked = false; -static bool sIsShiftAlphaLocked = false; +static ShiftAlphaStatus sShiftAlphaStatus = ShiftAlphaStatus::Default; + +ShiftAlphaStatus shiftAlphaStatus() { + return sShiftAlphaStatus; +} bool isShiftActive() { - return sIsShiftActive; + return sShiftAlphaStatus == ShiftAlphaStatus::Shift || sShiftAlphaStatus == ShiftAlphaStatus::ShiftAlpha || sShiftAlphaStatus == ShiftAlphaStatus::AlphaLockShift || sShiftAlphaStatus == ShiftAlphaStatus::ShiftAlphaLock; } bool isAlphaActive() { - return sIsAlphaActive; -} - -bool isAlphaLocked() { - return sIsAlphaLocked; -} - -bool isShiftAlphaLocked() { - return sIsShiftAlphaLocked; + return sShiftAlphaStatus == ShiftAlphaStatus::Alpha || sShiftAlphaStatus == ShiftAlphaStatus::ShiftAlpha || sShiftAlphaStatus == ShiftAlphaStatus::AlphaLock || sShiftAlphaStatus == ShiftAlphaStatus::AlphaLockShift || sShiftAlphaStatus == ShiftAlphaStatus::ShiftAlphaLock; +; } void updateModifiersFromEvent(Event e) { - if (e == Shift) { - sIsShiftActive = !sIsShiftActive; - } else if (e == Alpha) { - if (sIsAlphaLocked || sIsShiftAlphaLocked) { - sIsAlphaLocked = false; - sIsShiftAlphaLocked = false; - sIsAlphaActive = false; - } else if (sIsAlphaActive) { - if (sIsShiftActive) { - sIsShiftAlphaLocked = true; - sIsAlphaActive = false; - } else { - sIsAlphaLocked = true; - sIsAlphaActive = false; + switch (sShiftAlphaStatus) { + case ShiftAlphaStatus::Default: + if (e == Shift) { + sShiftAlphaStatus = ShiftAlphaStatus::Shift; + } else if (e == Alpha) { + sShiftAlphaStatus = ShiftAlphaStatus::Alpha; } - } else { - sIsAlphaActive = true; + break; + case ShiftAlphaStatus::Shift: + if (e == Shift) { + sShiftAlphaStatus = ShiftAlphaStatus::Default; + } else if (e == Alpha) { + sShiftAlphaStatus = ShiftAlphaStatus::ShiftAlpha; + } else { + sShiftAlphaStatus = ShiftAlphaStatus::Default; + } + break; + case ShiftAlphaStatus::Alpha: + if (e == Shift) { + sShiftAlphaStatus = ShiftAlphaStatus::ShiftAlpha; + } else if (e == Alpha) { + sShiftAlphaStatus = ShiftAlphaStatus::AlphaLock; + } else { + sShiftAlphaStatus = ShiftAlphaStatus::Default; + } + break; + case ShiftAlphaStatus::ShiftAlpha: + if (e == Shift) { + sShiftAlphaStatus = ShiftAlphaStatus::Alpha; + } else if (e == Alpha) { + sShiftAlphaStatus = ShiftAlphaStatus::ShiftAlphaLock; + } else { + sShiftAlphaStatus = ShiftAlphaStatus::Default; + } + break; + case ShiftAlphaStatus::AlphaLock: + if (e == Shift) { + sShiftAlphaStatus = ShiftAlphaStatus::AlphaLockShift; + } else if (e == Alpha) { + sShiftAlphaStatus = ShiftAlphaStatus::Default; + } + break; + case ShiftAlphaStatus::AlphaLockShift: + if (e == Alpha) { + sShiftAlphaStatus = ShiftAlphaStatus::Shift; + } else { + sShiftAlphaStatus = ShiftAlphaStatus::AlphaLock; + } + break; + case ShiftAlphaStatus::ShiftAlphaLock: + if (e == Alpha) { + sShiftAlphaStatus = ShiftAlphaStatus::Default; + } + break; } - } else { - sIsShiftActive = false; - sIsAlphaActive = false; - } } static bool sleepWithTimeout(int duration, int * timeout) { @@ -91,7 +118,7 @@ Event getEvent(int * timeout) { * Unfortunately there's no way to express this in standard C, so we have * to resort to using a builtin function. */ Keyboard::Key key = (Keyboard::Key)(63-__builtin_clzll(keysSeenTransitionningFromUpToDown)); - Event event(key, sIsShiftActive || sIsShiftAlphaLocked, sIsAlphaActive || sIsAlphaLocked || sIsShiftAlphaLocked); + Event event(key, isShiftActive(), isAlphaActive()); updateModifiersFromEvent(event); sLastEvent = event; sLastKeyboardState = state; From e0f2fcb2f6c0f7146a1139bafd6c12014c93ca3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Fri, 30 Jun 2017 11:21:33 +0200 Subject: [PATCH 2/3] [escher] App can have timers that are ticked when the app is active Change-Id: I2033a99fb2ebff030934b02d6128dce721012979 --- apps/apps_container.cpp | 13 ++++--------- apps/apps_container.h | 4 ++-- apps/on_boarding/app.cpp | 6 ++++-- apps/on_boarding/app.h | 4 ++-- escher/include/escher/app.h | 3 +++ escher/include/escher/container.h | 4 ++++ escher/src/app.cpp | 9 +++++++++ escher/src/container.cpp | 20 ++++++++++++++++++++ 8 files changed, 48 insertions(+), 15 deletions(-) diff --git a/apps/apps_container.cpp b/apps/apps_container.cpp index 40181c6ba..275fbd219 100644 --- a/apps/apps_container.cpp +++ b/apps/apps_container.cpp @@ -204,16 +204,11 @@ Window * AppsContainer::window() { return &m_window; } -int AppsContainer::numberOfTimers() { - bool onBoardingTimer = activeApp()->snapshot() == onBoardingAppSnapshot() && ((OnBoarding::App *)activeApp())->hasTimer(); - return 4+(GlobalPreferences::sharedGlobalPreferences()->examMode() == GlobalPreferences::ExamMode::Activate) + onBoardingTimer; +int AppsContainer::numberOfContainerTimers() { + return 4+(GlobalPreferences::sharedGlobalPreferences()->examMode() == GlobalPreferences::ExamMode::Activate); } -Timer * AppsContainer::timerAtIndex(int i) { - bool onBoardingTimer = activeApp()->snapshot() == onBoardingAppSnapshot() && ((OnBoarding::App *)activeApp())->hasTimer(); - if (onBoardingTimer && i == 4) { - return ((OnBoarding::App *)activeApp())->timer(); - } - Timer * timers[6] = {&m_batteryTimer, &m_USBTimer, &m_suspendTimer, &m_backlightDimmingTimer, &m_ledTimer, &m_ledTimer}; +Timer * AppsContainer::containerTimerAtIndex(int i) { + Timer * timers[5] = {&m_batteryTimer, &m_USBTimer, &m_suspendTimer, &m_backlightDimmingTimer, &m_ledTimer}; return timers[i]; } diff --git a/apps/apps_container.h b/apps/apps_container.h index a4fa4ed44..74d32fa9f 100644 --- a/apps/apps_container.h +++ b/apps/apps_container.h @@ -52,8 +52,8 @@ public: UpdateController * updatePopUpController(); private: Window * window() override; - int numberOfTimers() override; - Timer * timerAtIndex(int i) override; + int numberOfContainerTimers() override; + Timer * containerTimerAtIndex(int i) override; static constexpr int k_numberOfCommonApps = 8; static constexpr int k_totalNumberOfApps = 2+k_numberOfCommonApps; AppsWindow m_window; diff --git a/apps/on_boarding/app.cpp b/apps/on_boarding/app.cpp index fd07c5b7a..0a9d0b26e 100644 --- a/apps/on_boarding/app.cpp +++ b/apps/on_boarding/app.cpp @@ -1,5 +1,6 @@ #include "app.h" #include "../apps_container.h" +#include namespace OnBoarding { @@ -23,11 +24,12 @@ void App::reinitOnBoarding() { m_languageController.reinitOnBoarding(); } -bool App::hasTimer() { +int App::numberOfTimers() { return firstResponder() == &m_logoController; } -Timer * App::timer() { +Timer * App::timerAtIndex(int i) { + assert(i == 0); return &m_logoController; } diff --git a/apps/on_boarding/app.h b/apps/on_boarding/app.h index 108f64385..7d2f1a7af 100644 --- a/apps/on_boarding/app.h +++ b/apps/on_boarding/app.h @@ -16,8 +16,8 @@ public: Descriptor * descriptor() override; }; void reinitOnBoarding(); - bool hasTimer(); - Timer * timer(); + int numberOfTimers() override; + Timer * timerAtIndex(int i) override; private: App(Container * container, Snapshot * snapshot); LanguageController m_languageController; diff --git a/escher/include/escher/app.h b/escher/include/escher/app.h index 8bbc8b60a..8673b63a4 100644 --- a/escher/include/escher/app.h +++ b/escher/include/escher/app.h @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -53,6 +54,8 @@ public: virtual void didBecomeActive(Window * window); virtual void willBecomeInactive(); + virtual int numberOfTimers(); + virtual Timer * timerAtIndex(int i); protected: App(Container * container, Snapshot * snapshot, ViewController * rootViewController, I18n::Message warningMessage = (I18n::Message)0); ModalViewController m_modalViewController; diff --git a/escher/include/escher/container.h b/escher/include/escher/container.h index 54ea50e93..9855b5c33 100644 --- a/escher/include/escher/container.h +++ b/escher/include/escher/container.h @@ -31,6 +31,10 @@ protected: virtual Window * window() = 0; private: void step(); + int numberOfTimers() override; + Timer * timerAtIndex(int i) override; + virtual int numberOfContainerTimers(); + virtual Timer * containerTimerAtIndex(int i); App * m_activeApp; }; diff --git a/escher/src/app.cpp b/escher/src/app.cpp index 4893ae0c4..fce2e7589 100644 --- a/escher/src/app.cpp +++ b/escher/src/app.cpp @@ -119,3 +119,12 @@ void App::willBecomeInactive() { setFirstResponder(nullptr); m_modalViewController.viewDidDisappear(); } + +int App::numberOfTimers() { + return 0; +} + +Timer * App::timerAtIndex(int i) { + assert(false); + return nullptr; +} diff --git a/escher/src/container.cpp b/escher/src/container.cpp index 7a4d6c855..c4897778f 100644 --- a/escher/src/container.cpp +++ b/escher/src/container.cpp @@ -1,5 +1,6 @@ #include #include +#include Container::Container() : RunLoop(), @@ -48,3 +49,22 @@ void Container::run() { RunLoop::run(); } +int Container::numberOfTimers() { + return m_activeApp->numberOfTimers() + numberOfContainerTimers(); +} + +Timer * Container::timerAtIndex(int i) { + if (i < m_activeApp->numberOfTimers()) { + return m_activeApp->timerAtIndex(i); + } + return containerTimerAtIndex(i-m_activeApp->numberOfTimers()); +} + +int Container::numberOfContainerTimers() { + return 0; +} + +Timer * Container::containerTimerAtIndex(int i) { + assert(false); + return nullptr; +} From cb8a18e5517152bd1dfabcbdc6d1d9b0da95a2ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Fri, 30 Jun 2017 13:42:34 +0200 Subject: [PATCH 3/3] [apps/hardware_test] Clean plugging USB test Change-Id: I4fcc116c4d498bbc3510c9d9be4596c4e3472f4f --- apps/hardware_test/app.cpp | 16 +++++- apps/hardware_test/app.h | 5 ++ .../hardware_test/battery_test_controller.cpp | 7 +-- apps/hardware_test/battery_test_controller.h | 2 - apps/hardware_test/usb_test_controller.cpp | 52 ++++++++----------- apps/hardware_test/usb_test_controller.h | 7 +-- 6 files changed, 50 insertions(+), 39 deletions(-) diff --git a/apps/hardware_test/app.cpp b/apps/hardware_test/app.cpp index bb7c6fbb8..3083428d0 100644 --- a/apps/hardware_test/app.cpp +++ b/apps/hardware_test/app.cpp @@ -18,8 +18,22 @@ App::Descriptor * App::Snapshot::descriptor() { App::App(Container * container, Snapshot * snapshot) : ::App(container, snapshot, &m_keyboardController), - m_keyboardController(&m_modalViewController) + m_keyboardController(&m_modalViewController), + m_USBTestController(nullptr) { } +ViewController * App::USBController() { + return &m_USBTestController; +} + +int App::numberOfTimers() { + return firstResponder() == &m_USBTestController; +} + +Timer * App::timerAtIndex(int i) { + assert(i == 0); + return &m_USBTestController; +} + } diff --git a/apps/hardware_test/app.h b/apps/hardware_test/app.h index 996261b2e..8601e1f64 100644 --- a/apps/hardware_test/app.h +++ b/apps/hardware_test/app.h @@ -2,6 +2,7 @@ #define HARDWARE_TEST_APP_H #include +#include "usb_test_controller.h" #include "keyboard_test_controller.h" class AppsContainer; @@ -15,9 +16,13 @@ public: App * unpack(Container * container) override; Descriptor * descriptor() override; }; + ViewController * USBController(); + int numberOfTimers() override; + Timer * timerAtIndex(int i) override; private: App(Container * container, Snapshot * snapshot); KeyboardTestController m_keyboardController; + USBTestController m_USBTestController; }; } diff --git a/apps/hardware_test/battery_test_controller.cpp b/apps/hardware_test/battery_test_controller.cpp index a4ef48dfd..d760bd5ce 100644 --- a/apps/hardware_test/battery_test_controller.cpp +++ b/apps/hardware_test/battery_test_controller.cpp @@ -1,5 +1,6 @@ #include "battery_test_controller.h" #include "../constant.h" +#include "app.h" extern "C" { #include } @@ -11,8 +12,7 @@ namespace HardwareTest { BatteryTestController::BatteryTestController(Responder * parentResponder) : ViewController(parentResponder), - m_view(), - m_usbTestController(this) + m_view() { } @@ -24,7 +24,8 @@ bool BatteryTestController::handleEvent(Ion::Events::Event event) { if (event == Ion::Events::OK) { if (strcmp(m_view.batteryStateTextView()->text(), k_batteryOKText) == 0) { ModalViewController * modal = (ModalViewController *)parentResponder(); - modal->displayModalViewController(&m_usbTestController, 0.0f, 0.0f); + App * a = (App *)app(); + modal->displayModalViewController(a->USBController(), 0.0f, 0.0f); } } updateBatteryState(Ion::Battery::voltage(), Ion::Battery::isCharging()); diff --git a/apps/hardware_test/battery_test_controller.h b/apps/hardware_test/battery_test_controller.h index 93b36d239..179495dec 100644 --- a/apps/hardware_test/battery_test_controller.h +++ b/apps/hardware_test/battery_test_controller.h @@ -2,7 +2,6 @@ #define HARDWARE_TEST_BATTERY_TEST_CONTROLLER_H #include -#include "usb_test_controller.h" namespace HardwareTest { @@ -35,7 +34,6 @@ private: constexpr static const char * k_batteryNeedChargingText = "BATTERY: NEED RECHARGE"; void updateBatteryState(float batteryLevel, bool batteryCharging); ContentView m_view; - USBTestController m_usbTestController; }; } diff --git a/apps/hardware_test/usb_test_controller.cpp b/apps/hardware_test/usb_test_controller.cpp index 606790b11..56d4fc017 100644 --- a/apps/hardware_test/usb_test_controller.cpp +++ b/apps/hardware_test/usb_test_controller.cpp @@ -10,7 +10,9 @@ namespace HardwareTest { USBTestController::USBTestController(Responder * parentResponder) : ViewController(parentResponder), + Timer(1), m_view(), + m_shouldPlugUSB(true), m_resetController(this) { } @@ -19,41 +21,31 @@ View * USBTestController::view() { return &m_view; } -bool USBTestController::handleEvent(Ion::Events::Event event) { - if (event == Ion::Events::UpperM) { - return true; - } - if (event == Ion::Events::OK) { - if (Ion::USB::isPlugged() && strcmp(m_view.USBTextView()->text(), k_USBPlugText) == 0) { - m_view.USBTextView()->setText(k_USBUnplugText); - m_view.arrowView()->setDirection(false); - m_view.arrowView()->setColor(KDColorRed); - } - if (!Ion::USB::isPlugged() && strcmp(m_view.USBTextView()->text(), k_USBUnplugText) == 0) { - ModalViewController * modal = (ModalViewController *)parentResponder(); - modal->displayModalViewController(&m_resetController, 0.0f, 0.0f); - } - } +bool USBTestController::handleEvent(Ion::Events::Event e) { return true; } -void USBTestController::viewWillAppear() { - m_view.USBTextView()->setText(k_USBPlugText); - m_view.arrowView()->setDirection(true); - m_view.arrowView()->setColor(KDColorGreen); +bool USBTestController::fire() { + if (Ion::USB::isPlugged() && m_shouldPlugUSB) { + m_view.USBTextView()->setText(k_USBUnplugText); + m_view.arrowView()->setDirection(false); + m_view.arrowView()->setColor(KDColorRed); + m_shouldPlugUSB = false; + return true; + } + if (!Ion::USB::isPlugged() && !m_shouldPlugUSB) { + ModalViewController * modal = (ModalViewController *)parentResponder(); + modal->displayModalViewController(&m_resetController, 0.0f, 0.0f); + return true; + } + return false; } -void USBTestController::didBecomeFirstResponder() { - Container * c = (Container *)app()->container(); - /* We dispatch a random event that is caught by the hardware test application - * to force the window redraw. */ - c->dispatchEvent(Ion::Events::UpperM); - while (!Ion::USB::isPlugged() && strcmp(m_view.USBTextView()->text(), k_USBPlugText) == 0) {} - /* We dispatch an event to force the window to redraw (and update the drawn - * instructions at the same type) */ - c->dispatchEvent(Ion::Events::OK); - while (Ion::USB::isPlugged() && strcmp(m_view.USBTextView()->text(), k_USBUnplugText) == 0) {} - c->dispatchEvent(Ion::Events::OK); +void USBTestController::viewWillAppear() { + m_shouldPlugUSB = true; + m_view.USBTextView()->setText(k_USBPlugText); + m_view.arrowView()->setDirection(true); + m_view.arrowView()->setColor(KDColorGreen); } void USBTestController::ContentView::USBView::drawRect(KDContext * ctx, KDRect rect) const { diff --git a/apps/hardware_test/usb_test_controller.h b/apps/hardware_test/usb_test_controller.h index a8f75adc7..7b111d61b 100644 --- a/apps/hardware_test/usb_test_controller.h +++ b/apps/hardware_test/usb_test_controller.h @@ -7,14 +7,14 @@ namespace HardwareTest { -class USBTestController : public ViewController { +class USBTestController : public ViewController, public Timer { public: USBTestController(Responder * parentResponder); View * view() override; - bool handleEvent(Ion::Events::Event event) override; void viewWillAppear() override; - void didBecomeFirstResponder() override; + bool handleEvent(Ion::Events::Event e) override; private: + bool fire() override; class ContentView : public SolidColorView { public: ContentView(); @@ -39,6 +39,7 @@ private: constexpr static const char * k_USBPlugText = "PLUG USB"; constexpr static const char * k_USBUnplugText = "OK, UNPLUG USB"; ContentView m_view; + bool m_shouldPlugUSB; ResetController m_resetController; };