Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvng <viktor.govako@gmail.com>2013-02-13 18:18:24 +0400
committerAlex Zolotarev <alex@maps.me>2015-09-23 01:50:49 +0300
commit0507a1ff8f37782d9dfd6784a167854c20f86591 (patch)
tree0427c7e682d7bd65c36f1ddce066303e2389bb4c /android
parentb49a6c15884f47f384f63628436a4239707840e1 (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.cpp127
-rw-r--r--android/jni/com/mapswithme/maps/Framework.hpp23
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);