#include <memory>
-//DispatchDragEvent will generate 20 middle steps between start point and end point
-static constexpr int MIDDLE_STEPS_COUNT = 20;
+static constexpr int MIDDLE_STEPS_COUNT = 20; //DispatchDragEvent will generate 20 middle steps between start and end point
static constexpr double NO_DELAY_AFTER_TOUCH = 0.0;
+static constexpr double LONG_PRESS_TIME = 1.0; //according to homescreen app long press duration = 0.75s
-class DragActivity : public UIActivity, private RegisterActivity<DragActivity>
+template <typename DerivedType>
+class DispatchDragActivity : public UIActivity, private RegisterActivity<DerivedType>
{
public:
- constexpr static const char *activityType = "DRAG_DONE";
- DragActivity() : UIActivity(activityType)
+ constexpr static const char *activityType = DerivedType::activityType;
+ DispatchDragActivity() : UIActivity(activityType)
{}
void update(const std::shared_ptr<UIElement> &elem) override
{
uiElements.push_back(elem);
}
+
void process() override
{
- ASSERT(uiElements.size() == 2);
+ ASSERT(uiElements.size() == DerivedType::REQUIRED_UIELEMENTS);
markAsCompleted();
auto from = uiElements[0]->getScanningCoordinates();
- auto to = uiElements[1]->getScanningCoordinates();
+ auto to = uiElements[DerivedType::REQUIRED_UIELEMENTS - 1]->getScanningCoordinates();
DBus::DBusClient dbus {dbusLocators::accessibilityEMod::BUS,
dbusLocators::accessibilityEMod::OBJ_PATH,
dbusLocators::accessibilityEMod::INTERFACE,
DBus::ConnectionType::SYSTEM};
+ auto pressTime = DerivedType::HOLD_TIME;
+ DEBUG("Drag %d, %d, %d, %d, %d, %f", from.x, from.y, to.x, to.y, MIDDLE_STEPS_COUNT, pressTime);
dbus.method<void(int, int, int, int, int, double)>("DispatchDragEvent").
- call(from.x, from.y, to.x, to.y, MIDDLE_STEPS_COUNT, NO_DELAY_AFTER_TOUCH);
+ call(from.x, from.y, to.x, to.y, MIDDLE_STEPS_COUNT, pressTime);
}
private:
std::vector<std::shared_ptr<UIElement>> uiElements;
};
-class CancelActivity : public UIActivity, private RegisterActivity<DragActivity>
+class DragActivity : public DispatchDragActivity<DragActivity>
+{
+public:
+ constexpr static const char *activityType = "DRAG";
+ constexpr static double HOLD_TIME = NO_DELAY_AFTER_TOUCH;
+ constexpr static int REQUIRED_UIELEMENTS = 2;
+};
+
+class TouchAndHoldThenDragActivity : public DispatchDragActivity<TouchAndHoldThenDragActivity>
+{
+public:
+ constexpr static const char *activityType = "TOUCH_AND_HOLD_THEN_DRAG";
+ constexpr static double HOLD_TIME = LONG_PRESS_TIME;
+ constexpr static int REQUIRED_UIELEMENTS = 2;
+};
+
+class TouchAndHoldActivity : public DispatchDragActivity<TouchAndHoldActivity>
+{
+public:
+ constexpr static const char *activityType = "TOUCH_AND_HOLD";
+ constexpr static double HOLD_TIME = LONG_PRESS_TIME;
+ constexpr static int REQUIRED_UIELEMENTS = 1;
+};
+
+class CancelActivity : public Activity, private RegisterActivity<CancelActivity>
{
public:
constexpr static const char *activityType = "CANCEL";
- CancelActivity() : UIActivity(activityType)
+ CancelActivity() : Activity(activityType)
{}
- void update(const std::shared_ptr<UIElement> &elem) override
- {
- }
void process() override
{
markAsCompleted();
"CUT");
auto touchHold = std::make_shared<MenuItemImplementation>(
std::vector<std::string> {"IDS_TOUCH_AND_HOLD"},
- defaultImg);
+ defaultImg,
+ "TOUCH_AND_HOLD");
auto touchHoldThenDrag = std::make_shared<MenuItemImplementation>(
- std::vector<std::string> {"IDS_TOUCH_HOLD_THEN_DRAG"},
- defaultImg);
+ std::vector<std::string> {"IDS_TOUCH_AND_HOLD_THEN_DRAG"},
+ defaultImg,
+ std::string {},
+ "IDS_MENU_FOR_TOUCH_AND_HOLD_THEN_DRAG");
auto swipeUp = std::make_shared<MenuItemImplementation>(
std::vector<std::string> {"IDS_SWIPE_UP"},
defaultImg,
std::vector<std::string> {"IDS_DRAG"},
defaultImg,
std::string {},
- "IDS_MENU_DONE_CANCEL_FOR_DRAG");
+ "IDS_MENU_FOR_DRAG");
auto dragDone = std::make_shared<MenuItemImplementation>(
std::vector<std::string> {"IDS_DONE"},
defaultImg,
- "DRAG_DONE");
+ "DRAG");
+ auto touchHoldThenDragDone = std::make_shared<MenuItemImplementation>(
+ std::vector<std::string> {"IDS_DONE"},
+ defaultImg,
+ "TOUCH_AND_HOLD_THEN_DRAG");
auto cancel = std::make_shared<MenuItemImplementation>(
std::vector<std::string> {"IDS_CANCEL"},
defaultImg,
addToMap("IDS_MENU_GRANULARITY", std::make_shared<MenuImplementation>(MenuImplementation {
{character, word, line, paragraph}
}));
- addToMap("IDS_MENU_DONE_CANCEL_FOR_DRAG", std::make_shared<MenuImplementation>(MenuImplementation {
- { dragDone, cancel },
+ addToMap("IDS_MENU_FOR_DRAG", std::make_shared<MenuImplementation>(MenuImplementation {
+ {dragDone, cancel},
+ Alignment::CENTER, NavigateToSuperMenu::DENY
+ }));
+ addToMap("IDS_MENU_FOR_TOUCH_AND_HOLD_THEN_DRAG", std::make_shared<MenuImplementation>(MenuImplementation {
+ {touchHoldThenDragDone, cancel},
Alignment::CENTER, NavigateToSuperMenu::DENY
}));
}
{
testMenuContent("IDS_MENU_GESTURES_SCROLLABLE", {
"IDS_SWIPE_UP", "IDS_SWIPE_DOWN", "IDS_SWIPE_LEFT", "IDS_SWIPE_RIGHT",
- "IDS_AUTO_SCROLL", "IDS_TOUCH_AND_HOLD", "IDS_DRAG", "IDS_TOUCH_HOLD_THEN_DRAG"
+ "IDS_AUTO_SCROLL", "IDS_TOUCH_AND_HOLD", "IDS_DRAG", "IDS_TOUCH_AND_HOLD_THEN_DRAG"
});
testMenuContent("IDS_MENU_GESTURES_NOT_SROLLABLE", {
"IDS_SWIPE_UP", "IDS_SWIPE_DOWN", "IDS_SWIPE_LEFT", "IDS_SWIPE_RIGHT",
- "IDS_TOUCH_AND_HOLD", "IDS_DRAG", "IDS_TOUCH_HOLD_THEN_DRAG"
+ "IDS_TOUCH_AND_HOLD", "IDS_DRAG", "IDS_TOUCH_AND_HOLD_THEN_DRAG"
});
}