diff options
author | vng <viktor.govako@gmail.com> | 2013-02-13 18:18:24 +0400 |
---|---|---|
committer | Alex Zolotarev <alex@maps.me> | 2015-09-23 01:50:49 +0300 |
commit | 0507a1ff8f37782d9dfd6784a167854c20f86591 (patch) | |
tree | 0427c7e682d7bd65c36f1ddce066303e2389bb4c /android | |
parent | b49a6c15884f47f384f63628436a4239707840e1 (diff) |
[android] [bookmarks] Filter double tap and single tap (zooming and bookmark).
Diffstat (limited to 'android')
-rw-r--r-- | android/jni/com/mapswithme/maps/Framework.cpp | 127 | ||||
-rw-r--r-- | android/jni/com/mapswithme/maps/Framework.hpp | 23 |
2 files changed, 59 insertions, 91 deletions
diff --git a/android/jni/com/mapswithme/maps/Framework.cpp b/android/jni/com/mapswithme/maps/Framework.cpp index c5fc465942..fa9c99ef30 100644 --- a/android/jni/com/mapswithme/maps/Framework.cpp +++ b/android/jni/com/mapswithme/maps/Framework.cpp @@ -23,12 +23,13 @@ #include "../../../../../base/logging.hpp" -#define LONG_CLICK_LENGTH_SEC 1.0 -#define SHORT_CLICK_LENGTH_SEC 0.5 - +const unsigned LONG_TOUCH_MS = 1000; +const unsigned SHORT_TOUCH_MS = 250; +const double DOUBLE_TOUCH_S = SHORT_TOUCH_MS / 1000.0; android::Framework * g_framework = 0; + namespace android { void Framework::CallRepaint() @@ -37,15 +38,10 @@ namespace android } Framework::Framework() - : m_work(), - m_eventType(NVMultiTouchEventType(0)), - m_hasFirst(false), - m_hasSecond(false), - m_mask(0), - m_isInsideDoubleClick(false), + : m_mask(0), m_isCleanSingleClick(false), m_doLoadState(true), - m_onClickFnsHandler(0) + m_wasLongClick(false) { ASSERT_EQUAL ( g_framework, 0, () ); g_framework = this; @@ -235,7 +231,14 @@ namespace android } } - void Framework::KillLongTouchTask() + void Framework::StartTouchTask(double x, double y, unsigned ms) + { + KillTouchTask(); + + m_scheduledTask.reset(new ScheduledTask(bind(&android::Framework::OnProcessTouchTask, this, x, y, ms), ms)); + } + + void Framework::KillTouchTask() { if (m_scheduledTask) { @@ -244,90 +247,77 @@ namespace android } } + /// @param[in] mask Active pointers bits : 0x0 - no, 0x1 - (x1, y1), 0x2 - (x2, y2), 0x3 - (x1, y1)(x2, y2). void Framework::Touch(int action, int mask, double x1, double y1, double x2, double y2) { - NVMultiTouchEventType eventType = (NVMultiTouchEventType)action; + NVMultiTouchEventType eventType = static_cast<NVMultiTouchEventType>(action); - // processing double-click + // Check if we touch is canceled or we get coordinates NOT from the first pointer. if ((mask != 0x1) || (eventType == NV_MULTITOUCH_CANCEL)) { if (mask == 0x1) m_work.GetGuiController()->OnTapCancelled(m2::PointD(x1, y1)); - // cancelling double click - m_isInsideDoubleClick = false; m_isCleanSingleClick = false; - KillLongTouchTask(); + KillTouchTask(); } else { + ASSERT_EQUAL(mask, 0x1, ()); + if (eventType == NV_MULTITOUCH_DOWN) { + KillTouchTask(); + + m_wasLongClick = false; m_isCleanSingleClick = true; m_lastX1 = x1; m_lastY1 = y1; if (m_work.GetGuiController()->OnTapStarted(m2::PointD(x1, y1))) return; - m_scheduledTask.reset(new ScheduledTask(bind( - & android::Framework::CallLongClickListener, - this, - static_cast<double>(x1), - static_cast<double>(y1)), - static_cast<int>(LONG_CLICK_LENGTH_SEC * 1000) - )); - m_longClickTimer.Reset(); + + StartTouchTask(x1, y1, LONG_TOUCH_MS); } if (eventType == NV_MULTITOUCH_MOVE) { - double k = m_work.GetRenderPolicy()->VisualScale(); - if ((fabs(x1 - m_lastX1) > 10 * k) - || (fabs(y1 - m_lastY1) > 10 * k)) + double const minDist = m_work.GetRenderPolicy()->VisualScale() * 10.0; + if ((fabs(x1 - m_lastX1) > minDist) || (fabs(y1 - m_lastY1) > minDist)) { m_isCleanSingleClick = false; - KillLongTouchTask(); + KillTouchTask(); } if (m_work.GetGuiController()->OnTapMoved(m2::PointD(x1, y1))) return; } - if (eventType == NV_MULTITOUCH_UP) - if (m_work.GetGuiController()->OnTapEnded(m2::PointD(x1, y1))) - return; - if ((eventType == NV_MULTITOUCH_UP) && (m_isCleanSingleClick)) + if (eventType == NV_MULTITOUCH_UP) { - double timerTime = m_longClickTimer.ElapsedSeconds(); - KillLongTouchTask(); - if (timerTime < SHORT_CLICK_LENGTH_SEC) - { - CallClickListener(static_cast<int>(x1), static_cast<int>(y1)); - } + KillTouchTask(); + if (m_work.GetGuiController()->OnTapEnded(m2::PointD(x1, y1))) return; - if (m_isInsideDoubleClick) + if (!m_wasLongClick && m_isCleanSingleClick) { - if (m_doubleClickTimer.ElapsedSeconds() <= 0.5) + if (m_doubleClickTimer.ElapsedSeconds() <= DOUBLE_TOUCH_S) { // performing double-click - m_isInsideDoubleClick = false; m_work.ScaleToPoint(ScaleToPointEvent(x1, y1, 1.5)); } else { - // restarting double click - m_isInsideDoubleClick = true; + // starting single touch task + StartTouchTask(x1, y1, SHORT_TOUCH_MS); + + // starting double click m_doubleClickTimer.Reset(); } } else - { - // starting double click - m_isInsideDoubleClick = true; - m_doubleClickTimer.Reset(); - } + m_wasLongClick = false; } } @@ -353,7 +343,7 @@ namespace android if (mask == 0x0) { if ((eventType != NV_MULTITOUCH_UP) && (eventType != NV_MULTITOUCH_CANCEL)) - LOG(LINFO, ("should be NV_MULTITOUCH_UP or NV_MULTITOUCH_CANCEL")); + LOG(LWARNING, ("should be NV_MULTITOUCH_UP or NV_MULTITOUCH_CANCEL")); } if (m_mask == 0x2) @@ -370,7 +360,7 @@ namespace android if (mask == 0x0) { if ((eventType != NV_MULTITOUCH_UP) && (eventType != NV_MULTITOUCH_CANCEL)) - LOG(LINFO, ("should be NV_MULTITOUCH_UP or NV_MULTITOUCH_CANCEL")); + LOG(LWARNING, ("should be NV_MULTITOUCH_UP or NV_MULTITOUCH_CANCEL")); } if (mask == 0x1) @@ -425,7 +415,6 @@ namespace android m_x2 = x2; m_y2 = y2; m_mask = mask; - m_eventType = eventType; } void Framework::ShowSearchResult(search::Result const & r) @@ -555,16 +544,20 @@ namespace android return &m_work; } - void Framework::CallClickListener(double x, double y) + void Framework::OnProcessTouchTask(double x, double y, unsigned ms) { - if (!HandleOnSmthClick(x, y)) - DeactivatePopup(); - } + if (HandleOnSmthClick(x, y)) + return; - void Framework::CallLongClickListener(double x, double y) - { - if (!HandleOnSmthClick(x, y)) + if (ms == SHORT_TOUCH_MS) + { + DeactivatePopup(); + } + else if (ms == LONG_TOUCH_MS) + { + m_wasLongClick = true; AdditionalHandlingForLongClick(x, y); + } } bool Framework::HandleOnSmthClick(double x, double y) @@ -598,24 +591,6 @@ namespace android ActivatePopupWithAddressInfo(m_work.PtoG(point), addrInfo); } - /* - void Framework::ToCamelCase(string & s) - { - if (s.length() > 0) - { - s[0] = toupper(s[0]); - for(std::string::iterator it = s.begin() + 1; it != s.end(); ++it) - { - if(!isalpha(*(it - 1)) && - islower(*it)) - { - *it = toupper(*it); - } - } - } - } - */ - void Framework::ActivatePopupWithAddressInfo(m2::PointD const & pos, ::Framework::AddressInfo const & addrInfo) { string name = addrInfo.FormatPinText(); diff --git a/android/jni/com/mapswithme/maps/Framework.hpp b/android/jni/com/mapswithme/maps/Framework.hpp index 2389d74718..096264f649 100644 --- a/android/jni/com/mapswithme/maps/Framework.hpp +++ b/android/jni/com/mapswithme/maps/Framework.hpp @@ -26,32 +26,24 @@ namespace android { private: ::Framework m_work; - typedef function<void (BookmarkAndCategory)> TOnBalloonClickListener; VideoTimer * m_videoTimer; void CallRepaint(); + typedef function<void (BookmarkAndCategory)> TOnBalloonClickListener; TOnBalloonClickListener m_balloonClickListener; - shared_ptr<ScheduledTask> m_scheduledTask; - - int m_onClickFnsHandler; - NVMultiTouchEventType m_eventType; //< multitouch action double m_x1; double m_y1; double m_x2; double m_y2; - - bool m_hasFirst; - bool m_hasSecond; int m_mask; - my::Timer m_longClickTimer; + bool m_doLoadState; /// @name Single click processing parameters. //@{ my::Timer m_doubleClickTimer; - bool m_isInsideDoubleClick; bool m_isCleanSingleClick; double m_lastX1; double m_lastY1; @@ -59,17 +51,18 @@ namespace android math::AvgVector<float, 3> m_sensors[2]; - void CallClickListener(double x, double y); - void CallLongClickListener(double x, double y); - void KillLongTouchTask(); + shared_ptr<ScheduledTask> m_scheduledTask; + bool m_wasLongClick; + + void StartTouchTask(double x, double y, unsigned ms); + void KillTouchTask(); + void OnProcessTouchTask(double x, double y, unsigned ms); bool HandleOnSmthClick(double x, double y); bool AdditionalHandlingForLongClick(double x, double y); void ActivatePopup(m2::PointD const & pos, string const & name, string const & imageName); void ActivatePopupWithAddressInfo(m2::PointD const & pos, ::Framework::AddressInfo const & addrInfo); - void ToCamelCase(string & c); - static inline bool ValidateBookmarkAndCategory(BookmarkAndCategory const & bac) { return (bac.first > -1 && bac.second > -1); |